標籤:delay ima nbsp ase style get boolean 判斷 監聽
案例背景:
當我們實現viewpager的自動切換介面操作的時候,如果需要增加點擊圖片viewpager停止自動切換,鬆開手指viewpager自動切換又繼續執行的邏輯,正常思維下實現代碼如下所示:
利用handler發送訊息實現viewpager 自動滑動
if (handler == null) {
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 實現切換 viewpager 介面
// 擷取當前顯示介面的索引
int currentItem = mViewPager.getCurrentItem();
// 計算下一個介面的索引
// 判斷如果切換到最後一個介面,需要重新切換回第一個介面進行操作
if (currentItem == imageurls.size()-1) {
currentItem=0;
}else{
currentItem++;
}
// 設定 viewpager 顯示下一個介面
mViewPager.setCurrentItem(currentItem);
// 一次切換完成,還需要接著執行第二次
handler.sendEmptyMessageDelayed(0, 3000);
}
};
handler.sendEmptyMessageDelayed(0, 3000);// 延遲 3 秒個 handler 發送訊息
}
// 設定 viewpager 條目介面的觸摸事件,實現按下 viewpager 停止滑動,抬起 viewpager 重新滑動
rootview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 停止發送 handler 延遲訊息
handler.removeCallbacksAndMessages(null);// 參數如果是 null ,表示刪除所有的延遲訊息
break;
case MotionEvent.ACTION_UP:
// 重新發送 handler 延遲訊息,實現 viewpager 自動滑動
handler.sendEmptyMessageDelayed(0, 3000);
break;
}
// 返回 true: 執行觸摸監聽操作, false :不執行
return true;
}
});
即:在手指按下的時候利用handler發送停止訊息而到當手指抬起的時候發送繼續切換的訊息 然而在實際的操作中我們發現當手指抬起的時候viewpager不能繼續實現自動切換,通過對代碼進行log操作發現手指抬起的時候view並沒有執行up方法而是執行了cancel方法,故代碼修改如下:
// 設定 viewpager 條目介面的觸摸事件,實現按下 viewpager 停止滑動,抬起 viewpager 重新滑動 rootview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 停止發送 handler 延遲訊息 handler.removeCallbacksAndMessages(null);// 參數如果是 null ,表示刪除所有的延遲訊息 break; case MotionEvent.ACTION_UP: // 重新發送 handler 延遲訊息,實現 viewpager 自動滑動 handler.sendEmptyMessageDelayed(0, 3000); break; case MotionEvent.ACTION_CANCEL: // 當取消 view 的事件的時候,重新讓 viewpager 自動滑動 handler.sendEmptyMessageDelayed(0, 3000); break; } // 返回 true: 執行觸摸監聽操作, false :不執行 return true; } });
即:增加cancel方法的條目在方法內實現繼續發送切換訊息的邏輯。
規則總結:
1、如果手指緩慢滑動很短的距離,viewpager沒有切換介面,所以認為viewPager和view都可以執行事件,系統不會取消任何控制項的觸摸事件,由我們自己決定處理哪個事件。
2、如果手指快速滑動很長的距離,viewpager就會執行介面切換,此時view就會執行cancel方法,取消view的觸摸事件,只執行viewPager的觸摸事件。
ViewPager和View的事件響應規則