您好,登錄后才能下訂單哦!
在onTouch回調方法中處理滑動效果中,抬手時讓programListFragment自動歸位。在實現過程中,為了使得自動歸位過程可見,在while循環中添加Thread.sleep(10)來處理。在實際運行過程中,自動歸位過程不可見,只見界面卡頓一會,然后直接歸位。這并不符合預期效果。那么為什么會卡頓一會然后就直接歸位呢
以下是實現該效果的代碼片段。
case MotionEvent.ACTION_UP: // Logger.i(TAG, "event.getAction():"+MotionEvent.ACTION_UP); xUp = event.getX(); xCurrent = xUp; programWidth = programListFragment.getView().getMeasuredWidth(); int xAutoDist = (params.leftMargin < programWidth / 2) ? -2 : 2; while(true) { newLeftMargin = params.leftMargin + (int)xAutoDist; if(newLeftMargin < 0) { params.leftMargin = 0; break; } else if(newLeftMargin > channelWidth) { params.leftMargin = channelWidth; break; } else { params.leftMargin = newLeftMargin; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } programListFragment.getView().setLayoutParams(params); } break; }
經過調試并沒有發現Thread.currentThread().sleep(10)和Thread.sleep(10)之間有什么區別。
以下是解決這個問題的思路和代碼片段:
將Thread.sleep(10)放在新建的子線程中,在休眠結束之后再調用handler來更新leftMargin。
case MotionEvent.ACTION_UP: // Logger.i(TAG, "event.getAction():"+MotionEvent.ACTION_UP); xUp = event.getX(); xCurrent = xUp; programWidth = programListFragment.getView().getMeasuredWidth(); final int xAutoDist = (params.leftMargin < programWidth / 2) ? -2 : 2; new Thread(){ public void run() { while(true) { newLeftMargin = params.leftMargin + (int)xAutoDist; if(newLeftMargin < 0) { params.leftMargin = 0; break; } else if(newLeftMargin > channelWidth) { params.leftMargin = channelWidth; break; } else { params.leftMargin = newLeftMargin; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(0); } } }.start(); break; }
新建一個handler來更新LayoutParams。
final Handler handler = new Handler(){ @Override public void handleMessage(android.os.Message msg) { programListFragment.getView().setLayoutParams(params); } };
自動歸位效果基本達到,但是還不理想。這種實現還存在以下問題:
1. 當programListFragment明顯在右側,用力往左一滑時,此時不管抬手時是否已經明顯在左側,都應該以一定速度并且逐漸降速的過程自動滑行歸位到左側。
2. 自動歸位過程是勻速的,不符合實際效果。歸位過程應該是一個減速的過程。
3. 滑出邊界效果可以再優化一下。滑出邊界之后,再反彈回來。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。