scrollview 的滑动冲突 viewpager等都适用

以前做项目就是翻页滑动就是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/whs867712232/article/details/82901200
今日推荐