本篇介绍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 版权协议,转载请附上原文出处链接和本声明。