scrollview 的滑動衝突 viewpager等都適用

花生醬吧發表於2018-09-30

以前做專案就是翻頁滑動就是viewpager 豎著滑動就是scrollview 雖然幾乎可以實現很多需求,但是還是不滿意。

因為之前遇到一個js互動的專案。viewpager裡面巢狀的html 一共有幾百頁。平時不會注意的問題,這種時候就發生了。

每次webview都會載入html一部分記憶體,即使用了騰訊的也會有部分記憶體無法釋放完全,導致做題到了一百多道的時候就會嚴重記憶體溢位。

最後的解決辦法就是,改變題的數量,分章節。但是這並不是解決問題,只是繞開問題

今天又遇到類似的專案。我這次沒用viewpager,而是隻用scrollview一個控制元件就實現了。這樣也存在webview的記憶體洩漏。但是做兩百道題都沒問題,不能徹底解決但是也優化了很多。

這個scrollview:

public class CustomScrollView extends ScrollView { private float xDistance, yDistance, xLast, yLast;

public CustomScrollView(Context context) {
    super(context);
}

public CustomScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            xDistance = yDistance = 0f;
            xLast = ev.getX();
            yLast = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - xLast);
            yDistance += Math.abs(curY - yLast);
            xLast = curX;
            yLast = curY;

            /**
             * X軸滑動距離大於Y軸滑動距離,也就是使用者橫向滑動時,返回false,ScrollView不處理這次事件,
             * 讓子控制元件中的TouchEvent去處理,所以橫向滑動的事件交由ViewPager處理,
             * ScrollView只處理縱向滑動事件
             */

            if ((xDistance > yDistance)) {
                return false;
            }


    }

    return super.onInterceptTouchEvent(ev);
}
複製程式碼

}

非常簡單的,但是不只是如此而已。因為我在程式碼裡也寫了一段手勢判斷,所以才能實現手勢的完美判斷,不然只是靠上面的scrollview只能簡單的解決問題

case MotionEvent.ACTION_UP: if(move){ float x = mCurPosX - mPosX; float y = mCurPosY - mPosY; float x_abs = Math.abs(x); float y_abs = Math.abs(y); if (x_abs > y_abs) { if (mCurPosX - mPosX > 0 && (Math.abs(mCurPosX - mPosX) > 5)) { topQuestion(); } else if (mCurPosX - mPosX < 0 && (Math.abs(mCurPosX - mPosX) > 5)) { nextQuestion(); } } move = false; } break;

程式碼都是很簡單的。但是組合到一起就可以解決問題。這個程式碼應該都可以看懂吧,看不懂的可以留言問我。


這是我原創的啊。 全文地址請點選:blog.csdn.net/whs86771223…

相關文章