scrollview中停止滚动的监听

http://stackoverflow.com/questions/3738965/android-detect-when-scrollview-has-finished-scrolling-and-bouncing-back

ScrollView 用的是scroller做的滑动, 但是 scroller 被scrollView隐藏了 你无法调用   你可以直接自己写个Scrollview 代码完全copy 自带的scrollView 然后把scroller暴露出来!

可以派生的。如果(mScroller.computeScrollOffset()返回false则表示滚动结束了。

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class ObservableScrollView extends ScrollView {

    private OnScrollChangeListener onScrollChangeListener = null;
    private OnScrollStopListener onScrollStopListener = null;

    private OnBorderListener onBorderListener = null;

    private boolean isBorderMonitor = false;

    private boolean isStart = false;

    public ObservableScrollView(Context context) {
        this(context, null);
        // TODO Auto-generated constructor stub
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initObservableScrollView();
        // this(context, attrs, com.android.internal.R.attr.scrollViewStyle);
        // TODO Auto-generated constructor stub
    }

    public ObservableScrollView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        initObservableScrollView();
        // TODO Auto-generated constructor stub
    }

    private void initObservableScrollView() {

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //requestDisallowInterceptTouchEvent(disallowIntercept);
        //disallowIntercept=true不让父元素拦截元素;disallowIntercept=false,没有拦截
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

    public void setOnScrollStopListener(OnScrollStopListener onScrollStopListener) {
        this.onScrollStopListener = onScrollStopListener;
    }

    public void setOnScrollChangeListener(
            OnScrollChangeListener onScrollChangeListener) {
        this.onScrollChangeListener = onScrollChangeListener;
    }

    public void setOnBorderListener(OnBorderListener onBorderListener) {
        this.isBorderMonitor = true;
        this.onBorderListener = onBorderListener;
    }

    private void onScrollFinished(){
        if(null != onScrollStopListener){
            onScrollStopListener.onScrollStop(this);
        }
    }

    private void onScrollStart(int l, int t) {
        if (!isStart) {
            isStart = true;
            new ScrollListener(l,t).start();
        }
    }

    class ScrollListener extends Thread {
        int oldX, oldY;

        public ScrollListener(int oldx, int oldy) {
            this.oldX = oldx;
            this.oldY = oldy;
        }

        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            while (isStart) {
                int newX = getScrollX();
                int newY = getScrollY();
                if (newX == oldX && newY == oldY) {
                    onScrollFinished();
                    isStart = false;
                } else {
                    oldX = newX;
                    oldY = newY;
                }
            }
        }
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        onScrollStart(l,t);
        super.onScrollChanged(l, t, oldl, oldt);
        if (onScrollChangeListener != null) {
            onScrollChangeListener.onScrollChanged(this, l, t, oldl, oldt);
        }
        if (isBorderMonitor) {
            if (0 == t && null != onBorderListener) {
                onBorderListener.onBottom();
            } else if ((getChildAt(0).getMeasuredHeight() <= t + getHeight())
                    && null != onBorderListener) {
                onBorderListener.onTop();
            }
        }
    }

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

    public interface OnScrollStopListener {
        public void onScrollStop(ObservableScrollView scrollView);
    }

    /**
     * OnBorderListener, Called when scroll to top or bottom
     *
     * @author Myth 2013-5-22
     */
    public static interface OnBorderListener {

        /**
         * Called when scroll to bottom
         */
        public void onBottom();

        /**
         * Called when scroll to top
         */
        public void onTop();
    }

    public void setBorderMonitor(boolean isBorderMonitor) {
        this.isBorderMonitor = isBorderMonitor;
    }
}
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class ObservableScrollView extends ScrollView {

    private OnScrollChangeListener onScrollChangeListener = null;
    private OnScrollStopListener onScrollStopListener = null;

    private OnBorderListener onBorderListener = null;

    private boolean isBorderMonitor = false;

    private boolean isStart = false;

    public ObservableScrollView(Context context) {
        this(context, null);
        // TODO Auto-generated constructor stub
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initObservableScrollView();
        // this(context, attrs, com.android.internal.R.attr.scrollViewStyle);
        // TODO Auto-generated constructor stub
    }

    public ObservableScrollView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        initObservableScrollView();
        // TODO Auto-generated constructor stub
    }

    private void initObservableScrollView() {

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //requestDisallowInterceptTouchEvent(disallowIntercept);
        //disallowIntercept=true不让父元素拦截元素;disallowIntercept=false,没有拦截
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

    public void setOnScrollStopListener(OnScrollStopListener onScrollStopListener) {
        this.onScrollStopListener = onScrollStopListener;
    }

    public void setOnScrollChangeListener(
            OnScrollChangeListener onScrollChangeListener) {
        this.onScrollChangeListener = onScrollChangeListener;
    }

    public void setOnBorderListener(OnBorderListener onBorderListener) {
        this.isBorderMonitor = true;
        this.onBorderListener = onBorderListener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(ev.getAction() == MotionEvent.ACTION_UP){
            // 手指松开.
            if (null != onScrollStopListener) {
                onScrollStopListener.onScrollStop(this);
            }
        }
        return super.onTouchEvent(ev);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (onScrollChangeListener != null) {
            onScrollChangeListener.onScrollChanged(this, l, t, oldl, oldt);
        }
        if (isBorderMonitor) {
            if (0 == t && null != onBorderListener) {
                onBorderListener.onBottom();
            } else if ((getChildAt(0).getMeasuredHeight() <= t + getHeight())
                    && null != onBorderListener) {
                onBorderListener.onTop();
            }
        }
    }

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

    public interface OnScrollStopListener {
        public void onScrollStop(ObservableScrollView scrollView);
    }

    /**
     * OnBorderListener, Called when scroll to top or bottom
     *
     * @author Myth 2013-5-22
     */
    public static interface OnBorderListener {

        /**
         * Called when scroll to bottom
         */
        public void onBottom();

        /**
         * Called when scroll to top
         */
        public void onTop();
    }

    public void setBorderMonitor(boolean isBorderMonitor) {
        this.isBorderMonitor = isBorderMonitor;
    }
}
public class CustomScrollView extends ScrollView {

        private OnOverScrolledListener mOnOverScrolledListener = null;
        /**
         * @param context
         */
        public CustomScrollView(Context context) {
                super(context);
                // TODO Auto-generated constructor stub
        }

        /**
         * @param context
         * @param attrs
         */
        public CustomScrollView(Context context, AttributeSet attrs) {
                super(context, attrs);
                // TODO Auto-generated constructor stub
        }

        /**
         * @param context
         * @param attrs
         * @param defStyle
         */
        public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
                // TODO Auto-generated constructor stub
        }

        /* (non-Javadoc)
         * @see android.widget.ScrollView#arrowScroll(int)
         */
        @Override
        public boolean arrowScroll(int arg0) {
                // TODO Auto-generated method stub
                return super.arrowScroll(arg0);
        }

        /* (non-Javadoc)
         * @see android.widget.ScrollView#computeScroll()
         */
        @Override
        public void computeScroll() {
                // TODO Auto-generated method stub
                super.computeScroll();
        }

/**
         * @return the mOnOverScrolledListener
         */
        public OnOverScrolledListener getOnOverScrolledListener() {
                return mOnOverScrolledListener;
        }

        /**
         * @param mOnOverScrolledListener the mOnOverScrolledListener to set
         */
        public void setOnOverScrolledListener(OnOverScrolledListener mOnOverScrolledListener) {
                this.mOnOverScrolledListener = mOnOverScrolledListener;
        }

public interface OnOverScrolledListener{
        public abstract void onOverScrolled(View view, int scrollX, int scrollY, boolean clampedX, boolean clampedY);
    }

    /* (non-Javadoc)
     * @see android.widget.ScrollView#onOverScrolled(int, int, boolean, boolean)
     */
    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        // TODO Auto-generated method stub
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        if(mOnOverScrolledListener != null) {
            mOnOverScrolledListener.onOverScrolled(this, scrollX, scrollY, clampedX, clampedY);
        }
        Log.i("CustomScrollView", "===DBG:onOverScrolled");
    }

}
时间: 2024-07-31 14:34:46

scrollview中停止滚动的监听的相关文章

如何为JOPtionPane的showConfirmDialog对话框中的按钮设置监听

最近刚学了java图形界面编程,想独立写个记事本,过程当中想要为对话框中的按钮设置监听,但是查看了一下api也没找到相应的方法,只找到这个: Returns: an integer indicating the option selected by the user showConfirmDialog这个方法只返回一个int值来标识用户选择了哪一个按钮.找了半天也没找到设置监听的方法..... 就在这时.....灵光一闪~~~~ 很多方法在正常情况下是返回0的,非正常情况返回-1. 于是我就用如

简述Java中Http/Https请求监听方法

一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采用Fiddler2作为分析工具,Fiddler很强大,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,是越墙抓包之利器.关于工具的介绍可以参考下面的链接: http://www.cnblogs.com/TankXiao/archive/2012/02

关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy2012Email:[email protected]qq:    1046011462 一.场景假设 假设有博客系统中需要实现如下功能: 系统中用户发布文章,修改文章,删除文章时,需要一些相关的操作

QT中使用Event Filter监听按钮事件,Release后按钮不见

Accepted : 42   Submit : 122 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 五虎棋是流传在东北民间的一种游戏,GG小的时候,经常被表哥虐得很惨. 由于各个地区的规则可能不大相同,并且GG的回忆不一定很准,所以,如果规则和你平常玩的的有冲突,请以这里为主. 棋盘是横五条,纵五条直线,形成25个交叉点,双方轮流把棋子放到交叉点上 (由于所需各自和棋子数目不多,才12+13,GG小的时候,用的是象棋的棋盘和棋子,真的

Qt Gui中父控件监听子控件的IO事件

父对象重新定义自己继承自QObject的函数bool eventFilter(QObject* watched, QEvent* event). 子控件安装父对象的eventFilter: 例如, QTableView * itsView = new QTableView; itsView->viewport()->installEventFilter(this); Qt Gui中父控件监听子控件的IO事件

android HorizontalScrollView实现滚动状态监听

网上大部分都是直接调用onScrollChanged(int x, int y, int oldx, int oldy) 这个方法的,实际上只是将这个方法的protected改为public而已,本质上上还是没有什么多大的帮助,不多说,直接上代码 package com.dzc.gallery; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import a

Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置

http://m.blog.csdn.net/blog/yusewuhen/43706169 转载请注明出处: http://blog.csdn.net/androiddevelop/article/details/38815493 希望得到的效果是ListView不能滚动,但是最大的问题在与ListView Item还必有点击事件,如果不需要点击事件那就简单了,直接设置ListView.setEnable(false); 如果还需要点击事件,滚动与点击都是在ListView Touch处理机制

服务中电话状态的监听

public class AddressService extends Service { public static final String tag = "AddressService"; private TelephonyManager mTM; private MyPhoneStateListener mPhoneStateListener; private final WindowManager.LayoutParams mParams = new WindowManager

[转]Android应用中返回键的监听及处理

用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: 标签:    Android SDK 代码片段(2) [全屏查看所有代码] 1. [图片] 截图 2. [代码][Java]代码     跳至                         [2]     [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21