《Android开发艺术探索》第三章View事件体系小结

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

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值