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;

    }

}

```

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容