返回
顶部

修改密码

第17天 Android Touch事件学习 4 获取手指触摸位置

+1

-1

收藏

+1

-1

点赞0

评论0

触摸事件学习系列文章详见:《Android Touch事件学习系列汇总》还是回到onTouchEvent方法传递的参数MotionEvent类,其对象有四个方法可以获取当前手指在屏幕上的位置信息,但是一个是相对地址一个是绝对地址,以下具体看下区别。一、Android Touch事件rawX,rawY与x,y的区别…


触摸事件学习系列文章详见:

《Android Touch事件学习系列汇总》


还是回到onTouchEvent方法传递的参数MotionEvent类,其对象有四个方法可以获取当前手指在屏幕上的位置信息,但是一个是相对地址一个是绝对地址,以下具体看下区别。

一、Android Touch事件rawX,rawY与x,y的区别

MotionEvent有四个方法getRawX(), event.getRawY(), getX(),getY(), 为什么同样是x,y轴干嘛非得用两个变量呢?


先来看下效果图:

\


从上图可以看出来
rawX 和 rawY分别是中间触摸点以屏幕左上角为0,0的相对位置,rawX = 223 说明里触摸点离屏幕最左侧的距离是223
x 和 y 分别是触摸点以灰色区域左上角为0,0的相对位置,x = 96 说明是触摸点离灰色区域最左侧的距离是96


rawX , rawY 相对于屏幕的坐标
x,y 相对于当前控件的坐标
rawX, X 向右移动都是增大,向左移动都是减小
rawY, Y 向下移动都是增大,向上移动都是减小


二、效果图对应代码

1. 中间的灰色区域是一个自定义TextView,用于监听Touch事件,里面有一个LogListener接口,用于在Actvity中实时Touch位置输出信息



public class CustomTextView extends TextView {

	private LogListener mLogListener;
	
	public CustomTextView(Context context) {
		super(context);
	}

	public CustomTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public void setLogListener(LogListener pListener) {
		mLogListener = pListener;
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		int action = event.getAction();
		
		switch (action) {
		case MotionEvent.ACTION_MOVE:
			float rawX = event.getRawX();
			float rawY = event.getRawY();
			float x = event.getX();
			float y = event.getY();
			
			if (mLogListener != null) {
				mLogListener.output("rawX = " + rawX 
						+ "\n rawY = " + rawY
						+ "\n x = " + x
						+ "\n Y = " + y);
			}
			
			break;
		}
		
		return true;
	}
	
	
	/**
	 *  用于在Actvity中实时Touch位置输出信息
	 */
	public interface LogListener {
		
		public void output(String pOutput);
	}
	
	
}


2. 在AndroidManifast.xml中配置布局


3. Activity中加载视图,控制显示touch位置信息


public class TouchDemoActivity extends Activity {

	private TextView mOutput;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main);

		mOutput = (TextView) findViewById(R.id.output);
		mOutput.setText("rawX = 0 \n rawY = 0 \n x = 0 \n Y = 0");
		
		CustomTextView customTextView = (CustomTextView) findViewById(R.id.custom_textview);
		customTextView.setLogListener(new CustomLogListener());
		
	}
	
	
	/**
	 * 用于获取TouchEvent中位置信息
	 */
	private class CustomLogListener implements LogListener {

		@Override
		public void output(String pOutput) {
			mOutput.setText( pOutput );
		}
		
	}
	
	
	
}

n

扫一扫在手机打开

评论
已有0条评论
0/150
提交
热门评论
相关推荐
今日要闻
换一批
热点排行