zoukankan      html  css  js  c++  java
  • 【转】重写ScrollView实现两个ScrollView的同步滚动显示

    图片

    我们首先想到使用ScrollView的类似与setOnScrollChangedListener的方法来实现,当一个ScrollView滚动时,触发该方法进而使另外一个ScrollView滚动。不过很遗憾,谷歌没有提供该方法。通过查询相应的源代码,我们发现该方法的原型

    protected void onScrollChanged(int x, int y, int oldx, int oldy)  

    该方法是protected类型,不能直接调用,于是需要重新实现ScrollView

    首先,定一个一个接口(ScrollViewListener.java):

    public interface ScrollViewListener { void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, intoldy);}

     我们需要重写ScrollView才能实现该借口,因此有下面的代码(ObservableScrollView.java):

    package com.devin;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.ScrollView;
    public class ObservableScrollView extends ScrollView {
        private ScrollViewListener scrollViewListener = null;
        public ObservableScrollView(Context context) {
            super(context);
        }
        public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        public ObservableScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        public void setScrollViewListener(ScrollViewListener scrollViewListener) {
            this.scrollViewListener = scrollViewListener;
        }
        @Override
        protected void onScrollChanged(int x, int y, int oldx, int oldy) {
            super.onScrollChanged(x, y, oldx, oldy);
            if(scrollViewListener != null) {
                scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
            }
        }
    }

    接下来是界面的XML,这里是一个简单的Demo,如下(main.xml):    

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:orientation="horizontal" >
        <com.devin.ObservableScrollView
            android:id="@+id/scrollview1"
            android:layout_width="400dp"
            android:layout_height="wrap_content" >
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="monday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="tuesday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="wednesday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="thursday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="friday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="saturday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="sunday"
                    android:textColor="#000000" />
            </LinearLayout>
        </com.devin.ObservableScrollView>
        <com.devin.ObservableScrollView
            android:id="@+id/scrollview2"
            android:layout_width="400dp"
            android:layout_height="wrap_content" >
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="monday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="tuesday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="wednesday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="thursday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="friday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="saturday"
                    android:textColor="#000000" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="200dp"
                    android:layout_weight="1"
                    android:text="sunday"
                    android:textColor="#000000" />
            </LinearLayout>
        </com.devin.ObservableScrollView>
    </LinearLayout>

    最后是我们的主程调用(PadTestActivity.java):

    package com.devin;
    import android.app.Activity;
    import android.os.Bundle;
    public class PadTestActivity extends Activity implements ScrollViewListener {
        private ObservableScrollView scrollView1 = null;
        private ObservableScrollView scrollView2 = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1);
            scrollView1.setScrollViewListener(this);
            scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2);
            scrollView2.setScrollViewListener(this);
        }
        public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
            if(scrollView == scrollView1) {
                scrollView2.scrollTo(x, y);
            } else if(scrollView == scrollView2) {
                scrollView1.scrollTo(x, y);
            }
        }
    }
  • 相关阅读:
    对一些ArcGIS for JS的API的一些理解
    C#中的正则表达式
    IHttpModule接口
    ArcGIS Engine 获取图层中的选择要素的函数封装
    Master Nginx(5)
    python and or的理解规则
    python中try except处理程序异常的三种常用方法
    Python操作excel的几种方式--xlrd、xlwt、openpyxl
    raw_input 和input 区别
    json -- dump load dumps loads 简单对比
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/3924130.html
Copyright © 2011-2022 走看看