Android中实现监听ScrollView滑动事件

时候我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部。可惜的是SDK并没有相应的方法,不过倒是提供了一个


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


方法,显然这个方法是不能被外界调用的,因此就需要把它暴露出去,方便使用。解决方式就是写一个接口,

package com.example.demo1;  

  

public interface ScrollViewListener {  

  

    void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);  

  

}  

 然后重写ScrollView类,给它提供上面写的回调接口。


package com.example.demo1;  

  

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布局的时候,不要写错了包。


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    xmlns:tools="http://schemas.android.com/tools"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent"  

    android:orientation="horizontal"  

    android:paddingBottom="@dimen/activity_vertical_margin"  

    android:paddingLeft="@dimen/activity_horizontal_margin"  

    android:paddingRight="@dimen/activity_horizontal_margin"  

    android:paddingTop="@dimen/activity_vertical_margin"  

    tools:context=".MainActivity" >  

  

    <com.example.demo1.ObservableScrollView  

        android:id="@+id/view1"  

        android:layout_width="wrap_content"  

        android:layout_height="match_parent" >  

  

        <LinearLayout  

            android:layout_width="wrap_content"  

            android:layout_height="match_parent"  

            android:orientation="vertical" >  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试1" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试2" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试3" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试4" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试5" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试6" />  

        </LinearLayout>  

    </com.example.demo1.ObservableScrollView>  

  

    <com.example.demo1.ObservableScrollView  

        android:id="@+id/view2"  

        android:layout_width="wrap_content"  

        android:layout_height="match_parent" >  

  

        <LinearLayout  

            android:layout_width="wrap_content"  

            android:layout_height="match_parent"  

            android:orientation="vertical" >  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试1" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试2" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试3" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试4" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试5" />  

  

            <TextView  

                android:layout_width="100dp"  

                android:layout_height="100dp"  

                android:text="试试6" />  

        </LinearLayout>  

    </com.example.demo1.ObservableScrollView>  

  

</LinearLayout>  

 

  最后activity代码如下,

package com.example.demo1;  

  

import android.os.Bundle;  

import android.app.Activity;  

import android.view.Menu;  

  

public class MainActivity extends Activity implements ScrollViewListener {  

  

    private ObservableScrollView scrollView1 = null;  

    private ObservableScrollView scrollView2 = null;  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

  

        scrollView1 = (ObservableScrollView) findViewById(R.id.view1);  

        scrollView1.setScrollViewListener(this);  

        scrollView2 = (ObservableScrollView) findViewById(R.id.view2);  

        scrollView2.setScrollViewListener(this);  

  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu) {  

        // Inflate the menu; this adds items to the action bar if it is present.  

        getMenuInflater().inflate(R.menu.main, menu);  

        return true;  

    }  

  

    @Override  

    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);  

        }  

    }  

  

}