two directional scroll view

前端 未结 9 1235
野的像风
野的像风 2020-12-09 05:03

I would like to have a linearlayout with a header section on top and a webview below. The header will be short and the webview may be longer and wider than the screen.

9条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-09 05:50

    I've try both wasikuss and user1684030 solutions and I had to adapt them because of one warning log: HorizontalScrollView: Invalid pointerId=-1 in onTouchEvent, and because I wasn't fan of this need of creating 2 scroll views.

    So here is my class:

    public class ScrollView2D extends ScrollView {
    
        private HorizontalScrollView innerScrollView;
    
        public ScrollView2D(Context context) {
            super(context);
    
            addInnerScrollView(context);
        }
    
        public ScrollView2D(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
    
            if (getChildCount() == 1) {
                View subView = getChildAt(0);
                removeViewAt(0);
                addInnerScrollView(getContext());
                this.innerScrollView.addView(subView);
            } else {
                addInnerScrollView(getContext());
            }
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            boolean handled = super.onTouchEvent(event);
            handled |= this.innerScrollView.dispatchTouchEvent(event);
            return handled;
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            super.onInterceptTouchEvent(event);
            return true;
        }
    
    
        public void setContent(View content) {
            if (content != null) {
                this.innerScrollView.addView(content);
            }
        }
    
    
        private void addInnerScrollView(Context context) {
            this.innerScrollView = new HorizontalScrollView(context);
            this.innerScrollView.setHorizontalScrollBarEnabled(false);
            addView(this.innerScrollView);
        }
    
    }
    

    And when using it in XML, you have nothing to do if the content of this scroll view is set in here. Otherwise, you just need to call the method setContent(View content) in order to let this ScrollView2D knows what is its content.

    For instance:

    // Get or create a ScrollView2D.
    ScrollView2D scrollView2D = new ScrollView2D(getContext());
    scrollView2D.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    addView(scrollView2D);
    
    // Set the content of scrollView2D.
    RelativeLayout testView = new RelativeLayout(getContext());
    testView.setBackgroundColor(0xff0000ff);
    testView.setLayoutParams(new ViewGroup.LayoutParams(2000, 2000));
    scrollView2D.setContent(testView);
    

提交回复
热议问题