关于scrollview监听的一些方法
一
package
cn.testscrollview;
import
android.os.Bundle;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.View.OnTouchListener;
import
android.widget.ScrollView;
import
android.app.Activity;
/**
* Demo描述:
* 监听ScrollView滑动到顶端和底部
*
* 注意事项:
* 1 mScrollView.getChildAt(0).getMeasuredHeight()表示:
* ScrollView所占的高度.即ScrollView内容的高度.常常有一
* 部分内容要滑动后才可见,这部分的高度也包含在了
* mScrollView.getChildAt(0).getMeasuredHeight()中
*
* 2 view.getScrollY表示:
* ScrollView顶端已经滑出去的高度
*
* 3 view.getHeight()表示:
* ScrollView的可见高度
*
*/
public
class
MainActivity
extends
Activity {
private
ScrollView mScrollView;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private
void
init(){
mScrollView=(ScrollView) findViewById(R.id.scrollView);
mScrollView.setOnTouchListener(
new
TouchListenerImpl());
}
private
class
TouchListenerImpl
implements
OnTouchListener{
@Override
public
boolean
onTouch(View view, MotionEvent motionEvent) {
switch
(motionEvent.getAction()) {
case
MotionEvent.ACTION_DOWN:
break
;
case
MotionEvent.ACTION_MOVE:
int
scrollY=view.getScrollY();
int
height=view.getHeight();
int
scrollViewMeasuredHeight=mScrollView.getChildAt(
0
).getMeasuredHeight();
if
(scrollY==
0
){
System.out.println(
"滑动到了顶端 view.getScrollY()="
+scrollY);
}
if
((scrollY+height)==scrollViewMeasuredHeight){
System.out.println(
"滑动到了底部 scrollY="
+scrollY);
System.out.println(
"滑动到了底部 height="
+height);
System.out.println(
"滑动到了底部 scrollViewMeasuredHeight="
+scrollViewMeasuredHeight);
}
break
;
default
:
break
;
}
return
false
;
}
};
}
二 。
有时候我们需要监听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);
- }
- }
- }
- 三 http://blog.csdn.net/xiaanming/article/details/17374599/