AndroidStudio-3.2.1(十一)触摸事件

  • Post author:
  • Post category:其他

本篇介绍android开发中用到的触摸事件处理。

单点触摸

我们先添加一个FrameLayout布局的Activity,为了演示方便,在其中添加一个ImageView。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/container"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="64dp"
        android:layout_height="64dp"
        app:srcCompat="@mipmap/agt_internet_256" />
</FrameLayout>

然后在Activity中设置触摸事件监听:

 container = (FrameLayout) findViewById(R.id.container);
 container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        System.out.println("ACTION_MOVE");
                        System.out.println(String.format("x:%f,y:%f",event.getX(),event.getY()));
                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("ACTION_UP");
                        break;
                }
                return true;
            }
        });

代码说明:
1、通过setOnTouchListener对FrameLayout设置监听事件,示例给出了常用的ACTION_DOWN、ACTION_UP、ACTION_MOVE事件。
2、onTouch函数的返回值:如果设为return false,则事件处理一次后则停止传递。比如:当我们在屏幕上按下去又抬起来,这应该对应了ACTION_DOWN和ACTION_UP两个事件,但是如果设置return false,则只监听到ACTION_DOWN事件,不再继续传递事件。因此我们用return true;
3、as会给一个添加注解的提示@SuppressLint(“ClickableViewAccessibility”) :因为我们设置了触摸的监听,有可能会影响到点击事件的监听,加上该注解就是能够正常处理点击事件。
上面代码运行起来后,就可以在LogCat中看到触摸事件的日志了。

演示拖动图片

添加如下代码:

   imageView = (ImageView) findViewById(R.id.imageView);
   container.setOnTouchListener(new View.OnTouchListener() {
            FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams();
            ...
             case MotionEvent.ACTION_MOVE:
                        System.out.println("ACTION_MOVE");
                        layoutParams.leftMargin = (int)event.getX();
                        layoutParams.topMargin = (int)event.getY();
                        imageView.setLayoutParams(layoutParams);
             ...
 

启动后,手指滑动可以拖动图片移动了。

多点触摸

要说明的是,多点触摸的测试只能在真机上进行,模拟机上只能测试一个点。
添加以下代码,即可获取多点的个数以及各点的坐标:

 case MotionEvent.ACTION_MOVE:
     System.out.println("当前触摸点个数" + event.getPointerCount());
     System.out.println(String.format("x1:%f,y2:%f  x2:%f,y2:%f", event.getX(0), event.getY(0), event.getX(1), event.getY(1)));

下面演示如何根据手势进行图片的放大缩小。原理是根据两个触摸点之间的距离,来判断当前的两个手指是越来越近还是越来越远。

     container.setOnTouchListener(new View.OnTouchListener() {
            FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams();
            double lastdistance = -1;
            double currentdistance = 0;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        System.out.println("ACTION_MOVE");
                        if (event.getPointerCount() > 1) {
                            double oy = event.getY(0) - event.getY(1);
                            double ox = event.getX(0) - event.getX(1);
                            currentdistance = Math.sqrt(oy * oy + ox * ox);
                            if (lastdistance < 0) {
                                lastdistance = currentdistance;
                            } else {
                                if (currentdistance - lastdistance > 5)//large
                                {
                                    layoutParams.height = (int) (layoutParams.height * 1.1f);
                                    layoutParams.width = (int) (layoutParams.width * 1.1f);
                                } else if (lastdistance - currentdistance > 5)//samll
                                {
                                    layoutParams.height = (int) (layoutParams.height * 0.9f);
                                    layoutParams.width = (int) (layoutParams.width * 0.9);
                                }
                                imageView.setLayoutParams(layoutParams);
                            }
                            lastdistance = currentdistance;
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("ACTION_UP");
                        break;
                }
                return true;
            }
        });

版权声明:本文为SHENCHEN1987原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。