【Android知识点精讲】(14)多点触摸交互处理

一 触摸事件监听

		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);
	}
}

源码下载


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值