系列文章:
安卓手势处理(一)view的位置信息
安卓手势处理(二) MotionEvent
安卓手势处理(三)之实现图片的放大和缩小
安卓手势处理(四)之Fling
安卓手势处理(五)案例
最近需要为项目加入手势处理,所以就有了这个系列,一来总结之前的知识,而来学习新东西,并记录之。
view的位置信息由这么几个成员变量规定:
mLeft
mTop
mRight
mBottom
这四个变量规定了位于父view中的位置,分别表示距离父view 左上右下的距离。
另外还有设置三个方向上偏离的距离方法:
setTranslationX()
setTranslationY()
setTranslationZ()
这个偏移量是相对于mLeft
mTop
的,mLeft这些变量是由layout决定的,也就是由布局参数决定的,而translation是基于布局位置发生一定的偏移,而且要注意view显示的区域也是根据偏移决定的,我们在屏幕上看到的view的区域是经过偏移之后的区域,mLeft这些变量代表的区域可以通过开发者模式中的show layoutbounds查看,那么mLeft这些变量有什么用呢?毕竟,view最终是显示给我们看的,layout区域和显示区域不一致明显有违直觉。其实目前我还没发现layout区域的用处,就连点击事件所参考的点也是显示区域的左上点。所以目前不先纠结layout区域的用处了。
打开setTranslationX
这个方法的源码,可以发现最终是由mRenderNode
这个变量设置的,这个变量是RenderNode
对象,render node就是渲染点的意思,所以更加确认了translation和显示的关系。
View为我们提供了两个方法getX()
、getY()
方法获取显示区域的左上点,这样就不用我们自己去计算了。
view随手指移动的例子:
tv.setOnTouchListener(new View.OnTouchListener() {
int mOldX;
int mOldY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
int currX = (int) event.getRawX();
int currY = (int) event.getRawY();
switch (action) {
case MotionEvent.ACTION_DOWN:
mOldX = currX;
mOldY = currY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = currX - mOldX;
int offsetY = currY - mOldY;
//也可以使用layout重新布局来写,这两种方式实际含义不同
// tv.layout(
// tv.getLeft() + offsetX,
// tv.getTop() + offsetY,
// tv.getRight() + offsetX,
// tv.getBottom() + offsetY);
tv.setTranslationX(tv.getTranslationX() + offsetX);
tv.setTranslationY(tv.getTranslationY() + offsetY);
mOldX = currX;
mOldY = currY;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
});