view相关
view的left,right,top,bottom是一种相对坐标,相对于父布局
获取方法如下:
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

由上图可知,view的宽高和坐标的关系
width = getRight() - getLeft()
height= getBottom() - getTop
从3.0开始,view增加了额外的几个参数,x,y,translationX,translationY,其中x,y是view的左上角坐标,translationX和translationY是view左上角相对于父容器的偏移量.默认值为0,他们的关系是:
x = left + translationX
y = top + translationY
MotionEvent
通过MotionEvent可以获取点击事件发生时的x和y坐标,获取方法如下:
float x = ev.getX();
float y = ev.getY();
float rawX = ev.getRawX();
float rawY = ev.getRawY();
getX/Y与getRawX/Y的不同:
getX相对于当前view的左上角x坐标
getRawX相对于手机屏幕的左上角x坐标
滑动方向判断
基于MotionEvent的x,y坐标,自定义一个view,实现了滑动方向判断的功能
public class MyLinearLayout extends LinearLayout {
private float mDownX, mDownY, changeX, changeY;
public MyLinearLayout(Context context) {
this(context, null);
}
public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//重点在这里
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mDownY = ev.getY();
mDownX = ev.getX();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
changeX = ev.getX() - mDownX;
changeY = ev.getY() - mDownY;
if (Math.abs(changeX) > Math.abs(changeY)) {
if (changeX > 0) {
Log.e("ada", "右滑");
} else {
Log.e("ada", "左滑");
}
} else {
if (changeY > 0) {
Log.e("ada", "下滑");
} else {
Log.e("ada", "上滑");
}
}
break;
}
//返回true消耗事件
return true;
}
}
网友评论