以前做專案就是翻頁滑動就是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…