Android中根据手势动作判断是让屏幕放大还是缩小

背景

项目中关于地图的部分,需要实现手指触摸屏幕来让地图放大和缩小。放大和缩小方法已经写好了,只需要调用对应方法即可。现在的关键就是怎么通过手势操作来判断,当前的手势操作是手势放大还是手势缩小。下面一起来实现。


我的思路

首先,我看了百度地图和高德地图中的操作:两个手指触摸屏幕,然后缩小两个手指之间的距离(此时手指还需要按住屏幕),就是判断用户需要执行缩小操作;两个手指触摸屏幕,然后放大两个手指之间的距离(此时手指还需要按住屏幕),就是判断用户需要执行放大操作。
距离我们可以根据坐标来计算,知道两个点的坐标,那么两个点之间的直线距离就可以简单的通过数学计算得出。再根据刚按下时的距离和抬起时的距离,比较两者直接的值大小,可以判断出用户执行的是什么操作。
思路有了,下面来一起实现。


代码实现

如下所示:

package com.example.administrator.touchzoominoutdemo;

import android.graphics.Point;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private double nLenStart;
    private double nLenEnd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int pCount = event.getPointerCount();// 触摸设备时手指的数量

        int action  = event.getAction();// 获取触屏动作。比如:按下、移动和抬起等手势动作

        // 手势按下且屏幕上是两个手指数量时
        if ((action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN && pCount == 2){

            // 获取按下时候两个坐标的x轴的水平距离,取绝对值
            int xLen = Math.abs((int)event.getX(0) - (int)event.getX(1));
            // 获取按下时候两个坐标的y轴的水平距离,取绝对值
            int yLen = Math.abs((int)event.getY(0) - (int)event.getY(1));

            // 根据x轴和y轴的水平距离,求平方和后再开方获取两个点之间的直线距离。此时就获取到了两个手指刚按下时的直线距离
            nLenStart = Math.sqrt((double) xLen * xLen + (double) yLen * yLen);

        }else if ((action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP && pCount == 2){// 手势抬起且屏幕上是两个手指数量时

            // 获取抬起时候两个坐标的x轴的水平距离,取绝对值
            int xLen = Math.abs((int)event.getX(0) - (int)event.getX(1));
            // 获取抬起时候两个坐标的y轴的水平距离,取绝对值
            int yLen = Math.abs((int)event.getY(0) - (int)event.getY(1));

            // 根据x轴和y轴的水平距离,求平方和后再开方获取两个点之间的直线距离。此时就获取到了两个手指抬起时的直线距离
            nLenEnd = Math.sqrt((double) xLen * xLen + (double) yLen * yLen);

            // 根据手势按下时两个手指触点之间的直线距离A和手势抬起时两个手指触点之间的直线距离B。比较A和B的大小,得出用户是手势放大还是手势缩小
            if(nLenEnd > nLenStart){
                Toast.makeText(this, "手势放大", Toast.LENGTH_SHORT).show();
            }else if(nLenEnd < nLenStart){
                Toast.makeText(this, "手势缩小", Toast.LENGTH_SHORT).show();
            }
        }

        return  true;
    }
}

重写了onTouchEvent方法,然后在里面进行相关逻辑判断。注释我写的很详细,跟思路一模一样。
然后大家自己可以根据代码进行相关验证。自己写个demo安装到手机上,运行后,测试一下效果。


A little bit of progress every day!Come on!

猜你喜欢

转载自blog.csdn.net/csdnzouqi/article/details/79853109