Android View之基础介绍(Android开发艺术探索)

  • TouchSlop

TouchSlop是系统所能识别的被认为是滑动的最小距离.通过如下代码获得

ViewConfiguration.get(mContext).getScaledTouchSlop();
  • VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。在view的onTouchEvent方法中追踪当前事件的速度。代码如下

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

接着可以使用如下方法来获取当前速度

velocityTracker.computeCurrentVelocity(100);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();

速度=(终点位置-起始位置)/时间段

最后,当我们不需要的时候

velocityTracker.clear();
velocityTracker.recycle();
  • GestureDetector
    手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
        });
        gestureDetector.setIsLongpressEnabled(false);

接着,需要接管View的onTouchEvent方法,在待监听的onTouchEvent方法中添加如下实现

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

onGestureListener和OnDoubleTaoListener中有如下方法

  1. onDown 手指按下
  2. onShowPress 手指轻轻触摸屏幕,尚未松开或拖动
  3. onSingleTapUp 手指松开
  4. onScroll 拖动
  5. onLongPress 长按
  6. onFling 快速滑动
  7. onDoubleTap 双击
  8. onSingleTapConfirmed 严格的单击行为
  9. onDoubleTapEvent 在双击的期间

View的滑动

  • 使用ScrollTo/scrollBy
  • 使用动画 帧动画或者属性动画
  • 改变布局参数

弹性滑动

  • 使用Scroller
    使用Scroller的代码一般如下
Scroller mScroller = new Scroller(mContext);

    private void smoothScrollTo(int destX,int destY){
        int scrollX = getScrollX();
        int delta = destX-scrollX;
        //1000ms内滑向destX,效果就是慢慢滑动
        mScroller.startScroll(scrollX,0,delta,0,1000);
        invalidate();
    }

    @Override
    public void computeScroll() {

        if (mScroller.computeScrollOffset()){
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
    }

当我们构造一个Scroller对象并调用startScroll的时候,其实什么都没做,只是保存了一些参数。invalidate会导致重绘,就会调用view的draw方法,draw方法中就会调用computeScroll方法,computeScroll方法在view中是一个空实现,因此我们实现了该方法。

  • 通过动画
  • 使用延时策略

基础就大概这些东西,都是从书上拿过来的。感觉不做点笔记记不住。

你可能感兴趣的:(android,view)