1.View的位置参数: left,right,top,bottom
width = right - left;
height = bottom - top;
从Android3.0开始,新增x, y, translationX, translationY. x和y是view左上角的坐标,translationX和translationY是View左上角相对于父容器的偏移量。
详解http://blog.csdn.net/chdjj/article/details/42293753
getX() = getLeft() + getTranslationX();
getY() = getTop() + getTranslationY();
2.MotionEvent
ACTION_DOWN 接触屏幕 ACTION_MOVE 移动 ACTION_UP 手指从屏幕上松开的一瞬间
点击屏幕,手松开: DOWN -> UP
点击屏幕滑动一会再松开: DOWN -> MOVE ->....-> MOVE -> UP
getX() getY() 相对于当前View的左上角的坐标。
getRawX() getRawY() 相对于屏幕左上角的坐标
3.TouchSlop
TouchSlop系统所能识别的被认为是滑动的最小距离的常量,如果两次滑动之间的距离小于这个常量,就不认为在进行滑动操作。
通过ViewConfiguration.get(getContext()).getScaledTouchSlop()获得
4.VelocityTracker 速度追踪
onTouch和onTouchEvent的区别 http://blog.csdn.net/huiguixian/article/details/22193977
Button button = (Button) findViewById(R.id.btn_main); button.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { VelocityTracker velocityTracker = VelocityTracker.obtain(); //追踪当前单机事件的速度 velocityTracker.addMovement(event); //要获得速度,先用computeCurrentVelocity计算速度,再获取 //时间间隔设为1000ms,表示1秒内划过的像素数 velocityTracker.computeCurrentVelocity(1000); //表示1s内水平方向/竖直方向划过的想速速 int xVelocity = (int) velocityTracker.getXVelocity(); int yVelocity = (int) velocityTracker.getYVelocity(); //不使用时,关闭,回收 velocityTracker.clear(); velocityTracker.recycle(); return true; } });
速度 = (终点位置 - 起点位置)/ 时间
5.View的滑动,srcollTo/scrollBy
View内部的两个属性mScrollX和mScrollY通过getScrollX和getScrollY获得。View边缘是指View的位置,View内容边缘是指View中的内容的边缘。scrollTo和scrollBy只能改变View内容的位置而不能改变View的位置。当View左边缘在View内容左边缘的右边时,mScrollX为正,反之为负(从左向右滑动,mScrollX为负),当View上边缘在View内容上边缘的下边时, mScrollY为正(从上到下滑动,mScrollY为负)
6.使用动画来移动View,主要是操作View的translationX和translationY属性。如果fillAfter为false,View动画完成以后,动画结果会消失,View会恢复到动画完成以前的状态,fillAfter设置为true才会保留动画结束后的状态,但是,View动画不能真正改变View的位置。比如,Button通过动画看起来向右移动了100px,但在系统眼里,其位置信息并不会随着动画的改变而改变,单击新位置并不会触发onClick,相反的,单击原来的位置却能触发。
7.改变布局参数来实现View滑动。改变LayoutParams