GestureDetector
onScroll
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
參數(shù)解釋:
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)
參數(shù)解釋:
e1:第1個MotionEvent.ACTION_DOWN
e2:最后一個MotionEvent.ACTION_MOVE
velocityX:X軸上的移動速度骡楼,像素/秒
velocityY:Y軸上的移動速度扎拣,像素/秒
執(zhí)行循序
onDown ----> onScroll ----> onScroll ----> onScroll ----> ……… ----> onFling
PS: 如果慢速滑動赴肚,不會觸發(fā)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當(dāng)前在x俊鱼、y軸上的位置
getFinalX() 刻像、getFinalY() //獲取Scroller最終在 x、y軸上停止的位置
setFinalX(int newX)并闲、setFinalY(int newY) //設(shè)置Scroller最終在 x细睡、y軸上停留的位置,沒有動畫效果帝火,直接跳到目標(biāo)位置
forceFinished(boolean finished) //強制結(jié)束本次滾動操作
abortAnimation() //終止動畫溜徙,直接滑動到指定的位置
isFinished() //返回Scroller是否已經(jīng)完成滾動
computeScrollOffset() //根據(jù)當(dāng)前已經(jīng)消逝的時間計算當(dāng)前的坐標(biāo)點,保存在mCurrX和mCurrY值中犀填, 動畫執(zhí)行完成后返回true
實踐
關(guān)鍵代碼(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 {
... ... //限制滾動范圍
}
}
};