Android控件双指缩放及双指拖动

这篇具有很好参考价值的文章主要介绍了Android控件双指缩放及双指拖动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文章分为两部分,第一部分先讲解下需要用到的知识点,第二部分提供代码实例。

相关知识

MotionEvent中的动作符

  • ACTION_DOWN:单指按下动作(仅在第一根手指按下时有效)
  • ACTION_POINTER_DOWN:双指及多指按下动作(仅在第二根手指或者大于第二根手指按下时有效)
  • ACTION_POINTER_UP:双指及多汁抬起动作(仅在第二根手指或者大于第二根的手指抬起时有效)
  • ACTION_UP:单指抬起动作(仅在第一根手指抬起时有效)
  • ACTION_MOVE:手指移动动作(不限手指个数)
  • ACTION_SCROLL:view上下或者左右滑动动作

缩放及位移方法

  • setTranslationX:控件沿x轴的位移,负数左移,正数右移
  • setTranslationY:控件沿y轴的位移,负数上移,正数下移
  • setScaleX:控件沿x轴缩放比
  • setScaleY:控件沿y轴缩放比

代码示例

package com.example.myapplication;

import static android.content.ContentValues.TAG;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    private static final String TAG = "xiong_tag";
    private float oldDistance;//刚按下时双指之间的距离
    private float newDistance;//在屏幕上滑动后双指之间的距离
    private float scalePoint;//缩放中心点
    private float scale = 1f;//缩放比
    private float translationX;//x轴移动量
    private float translationY;//y轴位移量
    private float oldCenterX;//刚按下时双指之间的点的x坐标
    private float oldCenterY;//刚按下时双指之间的点的y坐标
    private float newCenterX;//在屏幕上滑动后双指之间的点的x坐标
    private float newCenterY;//在屏幕上滑动后双指之间的点的y坐标
    private ImageView imageView;//缩放控件,可以是别的控件,如果是surfaceView那么要注意如果Android版本低于或者等于6,那么是不支持用这个方法进行缩放的

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageview);
        imageView.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_POINTER_DOWN:
                Log.d(TAG, "onTouch: pointer down");
                if(event.getPointerCount() == 2) {//getPointerCount返回的是手指的数量
                    oldDistance = calculateDistance(event);//计算距离
                    oldCenterX = calculateCenter(event, true);//计算两指之间的中心点的x坐标
                    oldCenterY = calculateCenter(event, false);//计算两指之间的中心点的y坐标
                }
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "onTouch: move");
                if (event.getPointerCount() == 2) {
                    newDistance = calculateDistance(event);
                    scale += (newDistance - oldDistance) / oldDistance;
                    newCenterX = calculateCenter(event, true);
                    newCenterY = calculateCenter(event, false);
                    //缩放
                    imageView.setScaleX(scale);
                    imageView.setScaleY(scale);
                    //位移
                    translationX += newCenterX - oldCenterX;
                    translationY += newCenterY - oldCenterY;
                    imageView.setTranslationX(translationX);
                    imageView.setTranslationY(translationY);
                }
                break;
        }
        return true;
    }

    private float calculateDistance(MotionEvent motionEvent) {
        float x1 = motionEvent.getX(0);//第一个点x坐标
        float x2 = motionEvent.getX(1);//第二个点x坐标
        float y1 = motionEvent.getY(0);//第一个点y坐标
        float y2 = motionEvent.getY(1);//第二个点y坐标
        return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }
    /*
    *@param isX 是否是x坐标
     */
    private float calculateCenter(MotionEvent motionEvent, boolean isX) {
        return isX ? (motionEvent.getX(1) + motionEvent.getX(0)) / 2 : (motionEvent.getY(1) + motionEvent.getY(0)) / 2;
    }
}

以上就是全部内容了,谢谢观看。文章来源地址https://www.toymoban.com/news/detail-623551.html

到了这里,关于Android控件双指缩放及双指拖动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 点击图片,放大查看,实现缩放拖动等功能

    实现方法:点击图片时,把图片url传到另一个activity中实现放大拖动, 图片点击事件触发: Intent intent = new Intent(); intent.setClass(mContext, PictureActivity.class); intent.putExtra(“url”,R.drawable.ic_logo); mContext.startActivity(intent); 然后创建一个activity的内容如下: public class PictureActivity extend

    2024年02月11日
    浏览(54)
  • android:RecyclerView交互动画(上下拖动,左右滑动删除)

    @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //监听侧滑;1.删除数据,2.调用adapter.notifyItemRemoved(position) mMoveCallback.onItemRemove(viewHolder.getAdapterPosition()); } //改变选中的Item @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { //判断状态 if

    2024年04月12日
    浏览(48)
  • Android Studio实现滑动图片验证码

    源代码链接 效果: MainActivity SlideImageView activity_main.xml

    2024年02月13日
    浏览(48)
  • Android Studio(控件常用属性)

    通用属性 属性 描述 android:id 用于为视图指定唯一的标识符。 android:layout_width 用于指定视图的宽度。 android:layout_height 用于指定视图的高度。 android:layout_margin 用于指定视图周围的空白区域。 android:layout_padding 用于指定视图内部的填充区域。 android:background 用于设置视图的背景

    2024年02月05日
    浏览(44)
  • Android开发——控件EditText, 2.获取EditText输入的数据,通过按钮点击实现,ImageView控件,缩放类型,控件ProgressBar,常用属性详解,进度条设置

    1. android : hint 输入提示 2. android : textColorHint  输入提示文字的颜色 3. android : inputType  输入类型 4. android : drawableXxxx 在输入框的指定方位添加图片 5. android : drawablePadding  设置图片与输入内容的间距 6. android : paddingxxxx  设置内容与边框的间距 7. android : backgrou

    2024年02月07日
    浏览(49)
  • Android应用-Flutter实现丝滑的滑动删除、移动排序等-Dismissible控件详解

    Dismissible 是 Flutter 中用于实现可滑动删除或拖拽操作的一个有用的小部件。主要用于在用户对列表项或任何其他可滑动的元素执行删除或拖动操作时,提供一种简便的实现方式。 列表项删除: 允许用户在列表中通过滑动手势删除某个项。 左右滑动: 提供可自定义的背景,当

    2024年02月04日
    浏览(50)
  • Android Studio中的一些常见控件

    在这个例子中,我们使用了android:text属性来设置TextView要显示的文本。您可以使用其他属性来更改文本颜色,字体,大小等。 当使用TextView控件时,您需要在Java代码中引用该控件,以便对其进行操作。以下是一些与TextView控件相关的Java代码示例: 这将引用具有R.id.textView标识

    2023年04月14日
    浏览(50)
  • [Android studio] 第6节 Button控件

    目录 一、Button是什么? 二、使用步骤 1.demo Button控件具有许多属性可以用来自定义其外观和行为。以下是Button控件常用的参数属性及其详解: android:id :设置Button的唯一标识符。在代码中可以使用这个ID引用Button。 android:layout_width :指定Button的宽度,可以使用以下值: \\\"wra

    2024年02月08日
    浏览(40)
  • Android Studio 学习记录-按钮控件(Button)

    目录 按钮控件(Button)         textAllCaps属性         onClick属性 点击事件和长按事件 禁用与恢复按钮         本文介绍按键控件的常见用法,包括:如何设置大小写属性,如何响应按钮的点击事件和长按事件,如何禁用按钮又该如何启用按钮,等等。        

    2023年04月22日
    浏览(50)
  • Flutter 双指缩放和双指移动共存手势检测系列之--1方案

    本文所采用Flutter 版本为 3.10.6, 也许后续版本官方会对手势做进一步丰富完善,以解决本文涉及到的解决方案。 本文涉及项目手势需求 :双指向外或内触屏伸缩,对图片进行缩放;双指在屏幕上同向触屏移动,移动图片。 Flutter 使用中采用 GestureDetector 进行移动或是手势判

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包