一 触摸事件监听
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
rl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 按下屏幕的操作
break;
case MotionEvent.ACTION_MOVE:
// 在屏幕上移动的操作
break;
case MotionEvent.ACTION_UP:
// 离开屏幕的操作
break;
default:
break;
}
return false;
}
});
这个返回值如果是false的话,那么它只会接受到第一个ACTION_DOWN的效果,后面的它认为没有触发,所以要想继续监听后续事件,需要返回值为true。
二 获取触摸点坐标
1. 获取单个触摸点
使用event.getX()就可以获取到x轴坐标,event.getY()获取y轴坐标,在Android系统中左上角的坐标为(0, 0),向右x变大,向下y变大。
根据这两个方法我们就可以实现一个拖动图片的效果,修改刚才的代码:
final ImageView iv = (ImageView) findViewById(R.id.iv);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
rl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "按下x:" + event.getX() + ",y:" + event.getY());
// 按下屏幕的操作
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "移动x:" + event.getX() + ",y:" + event.getY());
// 在屏幕上移动的操作
LayoutParams lp = (LayoutParams) iv.getLayoutParams();
lp.leftMargin = (int) event.getX();
lp.topMargin = (int) event.getY();
iv.setLayoutParams(lp);
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "抬起x:" + event.getX() + ",y:" + event.getY());
// 离开屏幕的操作
break;
default:
break;
}
return true;
}
});
2. 获取多个触摸点
获取多个触摸点时,可以调用event.getPointerCount()获取目前的触摸点的个数。
要获取某个触摸点,使用event.getX(index)、event.getY(
index
)获得第index个触摸点的坐标。
三 缩放图片
根据两点间的距离的变化就可以检测出两点操作是放大的手势还是缩小的手势:
package com.example.testtouch;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public class MainActivity extends Activity {
private RelativeLayout rl;
private ImageView iv;
private double lastDistance;
private double currentDistance;
private double scale = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rl = (RelativeLayout) findViewById(R.id.rl);
iv = (ImageView) findViewById(R.id.iv);
rl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
LayoutParams lp = (LayoutParams) iv.getLayoutParams();
if (event.getPointerCount() == 2) {
currentDistance = getDistance(
event.getX(0) - event.getX(1), event.getY(0)
- event.getY(1));
if (currentDistance - lastDistance >= 5) {
// 放大
scale *= 1.1;
if (scale >= 4) {
scale = 4;
} else {
lp.width = (int) (1.1f * iv.getWidth());
lp.height = (int) (1.1f * iv.getHeight());
iv.setLayoutParams(lp);
}
} else if (lastDistance - currentDistance >= 5) {
// 缩小
scale *= 0.9;
if (scale <= 1) {
scale = 1;
} else {
lp.width = (int) (0.9f * iv.getWidth());
lp.height = (int) (0.9f * iv.getHeight());
iv.setLayoutParams(lp);
}
}
lastDistance = currentDistance;
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
});
}
/**
* 计算两点间距离
*
* @param x
* @param y
* @return
*/
private double getDistance(double x, double y) {
return Math.sqrt(x * x + y * y);
}
}
源码下载
2. 获取多个触摸点
获取多个触摸点时,可以调用event.getPointerCount()获取目前的触摸点的个数。
要获取某个触摸点,使用event.getX(index)、event.getY(
index
)获得第index个触摸点的坐标。
三 缩放图片
根据两点间的距离的变化就可以检测出两点操作是放大的手势还是缩小的手势:
package com.example.testtouch;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
public class MainActivity extends Activity {
private RelativeLayout rl;
private ImageView iv;
private double lastDistance;
private double currentDistance;
private double scale = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rl = (RelativeLayout) findViewById(R.id.rl);
iv = (ImageView) findViewById(R.id.iv);
rl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
LayoutParams lp = (LayoutParams) iv.getLayoutParams();
if (event.getPointerCount() == 2) {
currentDistance = getDistance(
event.getX(0) - event.getX(1), event.getY(0)
- event.getY(1));
if (currentDistance - lastDistance >= 5) {
// 放大
scale *= 1.1;
if (scale >= 4) {
scale = 4;
} else {
lp.width = (int) (1.1f * iv.getWidth());
lp.height = (int) (1.1f * iv.getHeight());
iv.setLayoutParams(lp);
}
} else if (lastDistance - currentDistance >= 5) {
// 缩小
scale *= 0.9;
if (scale <= 1) {
scale = 1;
} else {
lp.width = (int) (0.9f * iv.getWidth());
lp.height = (int) (0.9f * iv.getHeight());
iv.setLayoutParams(lp);
}
}
lastDistance = currentDistance;
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
});
}
/**
* 计算两点间距离
*
* @param x
* @param y
* @return
*/
private double getDistance(double x, double y) {
return Math.sqrt(x * x + y * y);
}
}
源码下载