GestureDetector & Scroller

GestureDetector

onScroll

onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

参数解释:

e1:第1个MotionEvent.ACTION_DOWN

e2:MotionEvent.ACTION_MOVE

distanceX:这里注意!这个值指的是上一个e2.getX()(没有上一个e2的话取e1的值)与本次的e2.getX()的差值,而不是与e1.getX()的差值

distanceY:同 distanceX

onFling

onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

参数解释:

e1:第1个MotionEvent.ACTION_DOWN

e2:最后一个MotionEvent.ACTION_MOVE

velocityX:X轴上的移动速度,像素/秒

velocityY:Y轴上的移动速度,像素/秒

执行循序

onDown ----> onScroll ----> onScroll ----> onScroll ----> ……… ----> onFling

PS: 如果慢速滑动,不会触发onFling


Scroller

主要用于滚动,主要使用的滚动方法有:startScroll、fling

startScroll

startScroll(int startX,int startY,int dx,int dy,int duration)

平滑滚动,指定起点startX、startY,dx、dy为在x、y轴上滚动的偏移量,耗时duration

通常用于:知道起点以及移动的距离的滚动

fling

fling(int startX,int startY,int velocityX,int velocityY,int minX,int maxX,int minY,int maxY)

惯性滑动,指定起点startX、startY,指定x、y轴的移动速度velocityX、velocityY,指定在x、y轴上最小移动距离

通常用于:界面的惯性滑动

其他方法介绍

getCurrX() 、 getCurrY() //获取Scroller当前在x、y轴上的位置

getFinalX() 、getFinalY() //获取Scroller最终在 x、y轴上停止的位置

setFinalX(int newX)、setFinalY(int newY) //设置Scroller最终在 x、y轴上停留的位置,没有动画效果,直接跳到目标位置

forceFinished(boolean finished) //强制结束本次滚动操作

abortAnimation() //终止动画,直接滑动到指定的位置

isFinished() //返回Scroller是否已经完成滚动

computeScrollOffset() //根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中, 动画执行完成后返回true


实践

GestureDetector & Scroller_第1张图片
image

关键代码(GestureDetector + Scroller )

private Scroller mScroller = new Scroller(context);
private GestureDetector mGestureDetector = new GestureDetector(context, gestureListener);
mGestureDetector.setIsLongpressEnabled(false);

private GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        ... ...  //做刻度滚动操作
    }

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
         ... ...  //计算startX(mLastScrollX)、startY、 minX、maxX、minY、maxY

        mScroller.fling(mLastScrollX , 0, (int) (-velocityX / 1.5), 0, minX, maxX, 0, 0);
        setNextMessage(MESSAGE_SCROLL);

        return true;
    }
};

private void setNextMessage(int message) {
    mAnimationHandler.removeMessages(MESSAGE_SCROLL);
    mAnimationHandler.sendEmptyMessage(message);
}

private Handler mAnimationHandler = new Handler() {

    public void handleMessage(Message msg) {
        mScroller.computeScrollOffset(); // 更新mCurrX和mCurrY值
        int cursorX = mScroller.getCurrX();
        int delta = mLastScrollX  - cursorX;
        mLastScrollX = cursorX;
        if (delta != 0) {
            ... ...  //做刻度滚动操作
        }

        // 滚动还没有完成,到最后,完成手动
        if (Math.abs(cursorX - mScroller.getFinalX()) < MIN_DELTA_FOR_SCROLLING) {
            mScroller.forceFinished(true);
        }

        if (!mScroller.isFinished()) {
            mAnimationHandler.sendEmptyMessage(msg.what);
        } else {
            ... ... //限制滚动范围
        }
    }
};


持续更新...

你可能感兴趣的:(GestureDetector & Scroller)