中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

onTouch事件中抬手時讓View自動歸位

發布時間:2020-08-01 11:35:01 來源:網絡 閱讀:404 作者:truesea 欄目:開發技術

在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. 滑出邊界效果可以再優化一下。滑出邊界之后,再反彈回來。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴旗县| 遂平县| 略阳县| 宜兰市| 两当县| 梁山县| 呼和浩特市| 寻甸| 潢川县| 浮山县| 保康县| 泰安市| 犍为县| 麻阳| 长春市| 和政县| 房山区| 梨树县| 崇仁县| 安福县| 林州市| 保靖县| 南京市| 怀远县| 阜新| 盈江县| 南召县| 平顺县| 曲麻莱县| 和平县| 新昌县| 南华县| 杨浦区| 民乐县| 徐汇区| 镇远县| 灯塔市| 汕尾市| 手机| 淮安市| 崇左市|