ScrollView嵌套webview之后滑动冲突的解决方案

来源:互联网 发布:华为交换机 允许mac表 编辑:程序博客网 时间:2024/06/05 22:33


关于ScrollView嵌套webview之后,滑动时出现冲突的解决方案:


我的项目需求是:文章内容是用webview加载的,但是帖子内容里面有一些个人信息等一系列的安卓原生控件,所以必须用scrollView来包裹webview,由于两者都自带有滑动功能,所以产生了让人头疼的滑动冲突。


解决方案:

public class MyScrollView extends ScrollView {//    private GestureDetector mGestureDetector;//    View.OnTouchListener mGestureListener;////    public MyScrollView(Context context, AttributeSet attrs) {//        super(context, attrs);//        mGestureDetector = new GestureDetector(context, new YScrollDetector());//        setFadingEdgeLength(0);//    }////    @Override//    public boolean onInterceptTouchEvent(MotionEvent ev) {  //拦截事件//        return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);//    }////    // Return false if we're scrolling in the x direction//    class YScrollDetector extends SimpleOnGestureListener {//    @Override//    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//            if (Math.abs(distanceY) > Math.abs(distanceX)) {//            return true;//            }//            return false;//    }//    }    public ScrollView parentScrollView;    public MyScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }    private int lastScrollDelta = 0;    public void resume() {        overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);        lastScrollDelta = 0;    }    int mTop = 10;    /**     * 将targetView滚到最顶端     */    public void scrollTo(View targetView) {        int oldScrollY = getScrollY();        int top = targetView.getTop() - mTop;        int delatY = top - oldScrollY;        lastScrollDelta = delatY;        overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);    }    private int getScrollRange() {        int scrollRange = 0;        if (getChildCount() > 0) {            View child = getChildAt(0);            scrollRange = Math.max(0, child.getHeight() - (getHeight()));        }        return scrollRange;    }    int currentY;    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        if (parentScrollView == null) {            return super.onInterceptTouchEvent(ev);        } else {            if (ev.getAction() == MotionEvent.ACTION_DOWN) {// 将父scrollview的滚动事件拦截                currentY = (int) ev.getY();                setParentScrollAble(false);                return super.onInterceptTouchEvent(ev);            } else if (ev.getAction() == MotionEvent.ACTION_UP) {// 把滚动事件恢复给父Scrollview                setParentScrollAble(true);            } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {            }        }        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        View child = getChildAt(0);        if (parentScrollView != null) {            if (ev.getAction() == MotionEvent.ACTION_MOVE) {                int height = child.getMeasuredHeight();                height = height - getMeasuredHeight();// System.out.println("height=" + height);                int scrollY = getScrollY();// System.out.println("scrollY" + scrollY);                int y = (int) ev.getY();// 手指向下滑动                if (currentY < y) {                    if (scrollY <= 0) {// 如果向下滑动到头,就把滚动交给父Scrollview                        setParentScrollAble(true);                        return false;                    } else {                        setParentScrollAble(false);                    }                } else if (currentY > y) {                    if (scrollY >= height) {// 如果向上滑动到头,就把滚动交给父Scrollview                        setParentScrollAble(true);                        return false;                    } else {                        setParentScrollAble(false);                    }                }                currentY = y;            }        }        return super.onTouchEvent(ev);    }    /**     * 是否把滚动事件交给父scrollview     *     * @param flag     */    private void setParentScrollAble(boolean flag) {        parentScrollView.requestDisallowInterceptTouchEvent(!flag);    }}


自定义Scrollview时之前也是百度之后写的,就是上面注释掉的代码,是在scrollview拦截了事件,然后根据手势识别器来滑动,这样做可以实现webview和scrollview的嵌套,但是出现了一个问题:当点击webview中图片时或者说webview在某一时刻获取到了事件,就会出现webview滑动不了的问题。这个问题困扰了好久,妈蛋,,,最后看到一篇博客,就是用上面的方式解决了。


<com.boohee.widgets.MyScrollView      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:background="@drawable/main_bg"      android:layout_marginTop="@dimen/default_shadow_margin" >        <LinearLayout          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:orientation="vertical" >            <RelativeLayout              android:layout_width="fill_parent"              android:layout_height="180dp" >                <android.support.v4.view.ViewPager                  android:id="@+id/vp_top_show"                  android:layout_width="fill_parent"                  android:layout_height="fill_parent" />                <LinearLayout                  android:id="@+id/dot_layout"                  android:layout_width="fill_parent"                  android:layout_height="wrap_content"                  android:layout_alignParentBottom="true"                  android:gravity="center_horizontal"                  android:orientation="horizontal"                  android:padding="10dp" >              </LinearLayout>          </RelativeLayout>            <WebView              android:id="@+id/wv_show"              android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:layerType="software"              android:scrollbars="none" />      </LinearLayout>  </com.boohee.widgets.MyScrollView> 


注意:使用后发现webView加上

[html] view plain copy
  1. android:layerType="software"  
之后,有时候加载不出来数据,而且加载数据很慢。所以可以去掉


很感谢看到了一位博主的一篇博客。

http://blog.csdn.net/li5685918/article/details/50426932


虽然解决了我的问题,但是对其中的几个点还有点问题(事件传递机制)。过几天好好研究一下,。。。。。


阅读全文
0 0
原创粉丝点击