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;
    }
}

以上就是全部内容了,谢谢观看。

猜你喜欢

转载自blog.csdn.net/laogan6/article/details/129886951