1. x轴和y轴的正方向分别为向右和向下,translationX和translationY表示View左上角相对于父容器的偏移量
x=left+translationX, y=top+translationY,平移过程中left和top的值不会改变;
2. MotionEvent: ACTION_DOWN, ACTION_MOVE, ACTION_UP,getX和getY返回相对于当前View左上角的坐标,getRawX和getRawY返回相对于屏幕左上角的坐标。
TouchSlop被认为是滑动的最小距离, ViewConfiguration.get(getContext()).getScaledTouchSlop()。
3. VelocityTracker用于追踪手指在滑动过程中的速度
在View的onTouchEvent中加入velocityTracker.addMovement(event),用velocityTracker.computeCurrentVelocity(1000)求出速度;
4. GestureDetector辅助检测单击、滑动、长按和双击等行为,包含OnGestureListener和OnDoubleTapListener两个接口
在View的onTouchEvent方法中实现return mGestureDetector.onTouchEvent(event),即可实现它的若干接口方法。
5. View的滑动
1)使用scrollTo和scrollBy,修改mScrollX和mScrollY
只改变View内容的位置而不能改变View布局的位置,左上为正,右下为负
2)View动画和属性动画改变translationX和translationY,为了向下兼容用nineoldandroids库
View动画是View的影响做操作,并不能真正改变View的位置和宽高,如果希望动画后的状态的以保留需要设置fillAfter为true,但新位置的按钮不能点击。
属性动画:ObjectAnimator.ofFloat(targetView, "translationX", 0, 100).setDuration(100).start();
ValueAnimator animator = ValueAnimator.ofInt(0, 1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animator) {
float fraction = animator.getAnimatedFraction();
mButton1.scrollTo(startX + (int)(deltaX * fraction), 0);
}
});
animator.start();
3)改变布局参数,即LayoutParams
Button左移100,可以设置marginLeft为100,或者在Button左边放置一个空的View而增大View的宽度
MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width += 100;
params.leftMargin += 100;
mButton1.requestLayout(); //或者mButton1.setLayoutParams(params);
6. 弹性滑动Scroller,滑动内容
Scroller scroller = new Scroller(mContext);
private void smoothScrollTo(int destX, int destY) { //1000ms内滑动到指定位置
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll(scrollX, 0, delta, 0, 1000); //内部只是保存了这几个参数
invalidate(); //导致View重绘
}
public void computeScroll() { //被draw方法调用
if(mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate(); //再次重绘,直到if不再为true
}
}