广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    在android中ScrollView嵌套ScrollView解决方案

    2018-04-04 08:34:43 次阅读 稿源:互联网
    广告
    大家好,众所周知,android里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)

    难道就真的不能嵌套吗?当然可以,只要你再写一个ScrollView,在里面做点脚,它就支持嵌套了。
    目前做的这个只支持两个ScrollView嵌套,两个以上还有待改进,能套两个就已经能满足很多需求了,呵呵,另外现在只做了纵向scrollview的支持,横向的还没来的急做哦。
    效果截图
     
    先上核心代码吧。代码里头我加了注释,方便大家阅读
    代码如下:

    package com.sun.shine.study.innerscrollview.view;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ScrollView;
    public class InnerScrollView extends ScrollView {
    /**
    */
    public ScrollView parentScrollView;
    public InnerScrollView(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);
    }
    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告