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并没有相应的方法,不过倒是提供了一个

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

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

  1. package com.example.demo1;
  2. public interface ScrollViewListener {
  3. void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
  4. }

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

  1. package com.example.demo1;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.widget.ScrollView;
  5. public class ObservableScrollView extends ScrollView {
  6. private ScrollViewListener scrollViewListener = null;
  7. public ObservableScrollView(Context context) {
  8. super(context);
  9. }
  10. public ObservableScrollView(Context context, AttributeSet attrs,
  11. int defStyle) {
  12. super(context, attrs, defStyle);
  13. }
  14. public ObservableScrollView(Context context, AttributeSet attrs) {
  15. super(context, attrs);
  16. }
  17. public void setScrollViewListener(ScrollViewListener scrollViewListener) {
  18. this.scrollViewListener = scrollViewListener;
  19. }
  20. @Override
  21. protected void onScrollChanged(int x, int y, int oldx, int oldy) {
  22. super.onScrollChanged(x, y, oldx, oldy);
  23. if (scrollViewListener != null) {
  24. scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
  25. }
  26. }
  27. }

注意在xml布局的时候,不要写错了包。

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context=".MainActivity" >
  11. <com.example.demo1.ObservableScrollView
  12. android:id="@+id/view1"
  13. android:layout_width="wrap_content"
  14. android:layout_height="match_parent" >
  15. <LinearLayout
  16. android:layout_width="wrap_content"
  17. android:layout_height="match_parent"
  18. android:orientation="vertical" >
  19. <TextView
  20. android:layout_width="100dp"
  21. android:layout_height="100dp"
  22. android:text="试试1" />
  23. <TextView
  24. android:layout_width="100dp"
  25. android:layout_height="100dp"
  26. android:text="试试2" />
  27. <TextView
  28. android:layout_width="100dp"
  29. android:layout_height="100dp"
  30. android:text="试试3" />
  31. <TextView
  32. android:layout_width="100dp"
  33. android:layout_height="100dp"
  34. android:text="试试4" />
  35. <TextView
  36. android:layout_width="100dp"
  37. android:layout_height="100dp"
  38. android:text="试试5" />
  39. <TextView
  40. android:layout_width="100dp"
  41. android:layout_height="100dp"
  42. android:text="试试6" />
  43. </LinearLayout>
  44. </com.example.demo1.ObservableScrollView>
  45. <com.example.demo1.ObservableScrollView
  46. android:id="@+id/view2"
  47. android:layout_width="wrap_content"
  48. android:layout_height="match_parent" >
  49. <LinearLayout
  50. android:layout_width="wrap_content"
  51. android:layout_height="match_parent"
  52. android:orientation="vertical" >
  53. <TextView
  54. android:layout_width="100dp"
  55. android:layout_height="100dp"
  56. android:text="试试1" />
  57. <TextView
  58. android:layout_width="100dp"
  59. android:layout_height="100dp"
  60. android:text="试试2" />
  61. <TextView
  62. android:layout_width="100dp"
  63. android:layout_height="100dp"
  64. android:text="试试3" />
  65. <TextView
  66. android:layout_width="100dp"
  67. android:layout_height="100dp"
  68. android:text="试试4" />
  69. <TextView
  70. android:layout_width="100dp"
  71. android:layout_height="100dp"
  72. android:text="试试5" />
  73. <TextView
  74. android:layout_width="100dp"
  75. android:layout_height="100dp"
  76. android:text="试试6" />
  77. </LinearLayout>
  78. </com.example.demo1.ObservableScrollView>
  79. </LinearLayout>

最后activity代码如下,

  1. package com.example.demo1;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.Menu;
  5. public class MainActivity extends Activity implements ScrollViewListener {
  6. private ObservableScrollView scrollView1 = null;
  7. private ObservableScrollView scrollView2 = null;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. scrollView1 = (ObservableScrollView) findViewById(R.id.view1);
  13. scrollView1.setScrollViewListener(this);
  14. scrollView2 = (ObservableScrollView) findViewById(R.id.view2);
  15. scrollView2.setScrollViewListener(this);
  16. }
  17. @Override
  18. public boolean onCreateOptionsMenu(Menu menu) {
  19. // Inflate the menu; this adds items to the action bar if it is present.
  20. getMenuInflater().inflate(R.menu.main, menu);
  21. return true;
  22. }
  23. @Override
  24. public void onScrollChanged(ObservableScrollView scrollView, int x, int y,
  25. int oldx, int oldy) {
  26. if (scrollView == scrollView1) {
  27. scrollView2.scrollTo(x, y);
  28. } else if (scrollView == scrollView2) {
  29. scrollView1.scrollTo(x, y);
  30. }
  31. }
  32. }
      三 http://blog.csdn.net/xiaanming/article/details/17374599/

关于scrollview监听的一些方法的更多相关文章

  1. Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)

    Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...

  2. Android TextWatcher的使用方法(监听ExitText的方法)

    我做了一个查询单词的简单app, 当在EditText中输入单词的时候,点击lookup,则在TextView区域显示出该单词的意思,当EditText中没有任何字符时,显示"word de ...

  3. v-on可以监听多个方法吗?

    原文地址 v-on可以监听多个方法 <template> <div class="about"> <button @click="mycli ...

  4. ScrollView监听滑动到顶部和底部的方法

    不需要监听滑动位置,只需要重写ScrollView的onOverScrolled和stopNestedScroll方法就可以了 public class ReadScrollView extends ...

  5. Android: ScrollView监听滑动到顶端和底端

    在项目中需要监听ScrollView滑动到顶端和底端的时候以实现自己的ScrollView,那么怎样去监听呢?今天查看了一下ScrollView的源码,找到了一种方法.先看一下源码中的overScro ...

  6. android dialog 原来dialog对话框也有自己的按键监听事件 onKeyDown方法

    探讨在一个activity中按menu键时弹出自己定义的dialog(自定义菜单对话框)时,再按一次手机的menu键发现这个自定义的dialog菜单并没有关闭,原来是这个dialog内部也有onKey ...

  7. VueJs 监听 window.resize 方法

    Vuejs 本身就是一个 MVVM 的框架. 但是在监听 window 上的 事件 时,往往会显得 力不从心. 比如 这次是 window.resize 恩,我做之前也是百度了一下.看到大家伙都为这个 ...

  8. 阅读layim代码小记,监听事件实现方法

    (function (win) { //注册事件 var chat = function () { $('#open').on('click', function () { sendMessage() ...

  9. Android成长日记-Android监听事件的方法

    1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedCh ...

随机推荐

  1. LwIP情景示例

    1. 你使用UDP作为探测包,但被探测的主机不在网络上. 在发送UDP packet之前,LwIP要将其保存下来(分配一个RAM类型的pbuf),并首先发送ARP Request,但得不到回应.如果你 ...

  2. Redis启动警告错误解决

    启动错误 (1)WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxc ...

  3. Oracle数据库和MySQL数据库的不同之处

    1.体积不同. Oracle它体积比较庞大,一般是用来开发大型应用(例如分布式)的.而MySQL的体积相对来说比较小,较之Oracle更容易安装.维护以及管理,操作也简单,最重要的是它是三个中唯一一个 ...

  4. iPerf - The network bandwidth measurement tool

    What is iPerf / iPerf3 ? iPerf3 is a tool for active measurements of the maximum achievable bandwidt ...

  5. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  6. 2. redis的数据类型

    一. string类型 字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容).一个字符串类型的值存储的最大容量是1GB 命令 (1)setnx ...

  7. Hadoop使用lzo压缩格式

    在hadoop中搭建lzo环境: wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz export CFLAGS ...

  8. Report_SRW在RDF中初始化的重要性(案例)

    2015-02-01 Created By BaoXinjian 一.摘要 在开发oracle report(report 6i)的时候,常常会用到fnd_global或fnd_profile来获取当 ...

  9. HDU5221 Occupation 树链剖分

    题意: 给出一棵树,root=1,树有点权,有一个人叫做M 有3种操作: 1 u v 把u到v路径上的所有点的点权都给M 2 u 若u的点权在M手上,拿走 3 u 把u为根的子树的所有点权都给M 每一 ...

  10. mongodb,redis,mysql 简要对比

    本篇内容大部分不是原创,转载的会贴有链接. 准备学习下数据库,想对目前的主流数据库做一个简单的了解分析,就搜集了资料整理到了一块. 当下主流的要数NoSql数据库了,拥有强大的高并发能力. mongo ...