Android的ScrollView的滚动的监听以及屏幕静止状态的监听实现

我在开发的过程中,用到了ScrollView,然后滚动的时候需要在底部显示出一个向上的箭头,点击可以返回我们的屏幕的顶端。

这里实现返回屏幕的顶端的代码网上搜索有很多,其中有listview的返回顶端和scrollview的返回顶端,本人这里给大家介绍一下scrollview的,在监听的地方加入如下代码:

scrollView.fullScroll(ScrollView.FOCUS_UP);
而ListView的返回顶端如下:

setListViewPos(0);
上面的是一个简单的小插曲,主要给自己加一个小记录。下面介绍正题:

在实现的过程中,首先使用了自定义的一个MyScrollView:

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

/**
 * Created by Administrator on 2016/8/11 0011.
 */
public class MyScrollView extends ScrollView {
    private OnScrollListener onScrollListener;
    //用在用户手指离开MyScrollViewMyScrollView还在继续滑动,用来保存Y的距离
    private int lastScrollY;

    public MyScrollView(Context context) {
        this(context, null);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    //写一个onScrollListener的监听回调方法
    public void setOnScrollListener(OnScrollListener onScrollListener) {
        this.onScrollListener = onScrollListener;
    }


    //用于用户手指离开MyScrollView的时候获取MyScrollView滚动的Y距离,然后回调给onScroll方法中
    private Handler handler = new Handler() {

        public void handleMessage(android.os.Message msg) {
            int scrollY = MyScrollView.this.getScrollY();

            //此时的距离和记录下的距离不相等,在隔5毫秒给handler发送消息
            if(lastScrollY != scrollY){
                lastScrollY = scrollY;
                handler.sendMessageDelayed(handler.obtainMessage(), 5);
            }
            if(onScrollListener != null){
                onScrollListener.onScroll(scrollY);
            }

        };

    };
    /**
     * 重写onTouchEvent, 当用户的手在MyScrollView上面的时候,
     * 直接将MyScrollView滑动的Y方向距离回调给onScroll方法中,当用户抬起手的时候,
     * MyScrollView可能还在滑动,所以当用户抬起手我们隔5毫秒给handler发送消息,在handler处理
     * MyScrollView滑动的距离
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(onScrollListener != null){
            onScrollListener.onScroll(lastScrollY = this.getScrollY());
        }
        switch(ev.getAction()){
            case MotionEvent.ACTION_UP:
                handler.sendMessageDelayed(handler.obtainMessage(), 5);
                break;
        }
        return super.onTouchEvent(ev);
    }
    //滚动的回调接口
    public interface OnScrollListener{
        //返回滑动的Y的距离
        public void onScroll(int scrollY);
    }
}
这个是继承了ScrollView的,所以我们在使用的时候,依然保持着ScrollView的一些特性,ScrollView下面只能有一个布局。在使用的过程中大家注意,xml的文件,我这边就不贴出来了,太长了。大家根据自己的情况,在最外层套一个自定义好的MyScrollView即可。

然后,我们开始正片环节:

首先对我们自定义的MyScrollView声明变量并且获取资源。

private MyScrollView home_scroll;

home_scroll = (MyScrollView) findViewById(R.id.home_scroll);
接下来就是对scroll进行滚动的监听啦。

home_scroll.setOnScrollListener(new MyScrollView.OnScrollListener() {
            @Override
            public void onScroll(int scrollY) {
                if (scrollY >= 100) {
                    home_btn_set.setVisibility(View.VISIBLE
);
                } else {
                    home_btn_set.setVisibility(View.GONE);     
                }
            }
        });
这个监听很好理解啦,当我们滚动的距离大于100的时候,我们的返回顶部的按钮显示,否则隐藏。这部分根据自己的需求来进行设定 。

但是有时候这个监听并不能很好的完成我们的需求。

有时候我们不仅仅需要监听他滚动的距离,还需要监听屏幕现在的状态是否是滚动的还是静止的。这时候就需要接下来的东西了:

home_scroll.setOnTouchListener(new View.OnTouchListener() {
            private int lastY = 0;
            private int touchEventId = -9983761;
            Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    View scroller = (View) msg.obj;
                    if (msg.what == touchEventId) {
                        if (lastY == scroller.getScrollY()) {
                            handleStop(scroller);
                        } else {
                            handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 20);
                            lastY = scroller.getScrollY();
                        }
                    }
                }
            };

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    handler.sendMessageDelayed(handler.obtainMessage(touchEventId, v), 20);
                }
                return false;
            }

            //这里写真正的事件
            private void handleStop(Object view) {
                MyScrollView scroller = (MyScrollView) view;
		     home_btn_set.setVisibility(View.VISIBLE);
                
            }
        });
这部分利用我们的onTouchListener()通过handler来进行实时的监听,当你不在触碰屏幕的时候,屏幕还在继续滑动,20毫秒发送一条消息,然后判断现在的位置。最后的停止以后的事件处理就是在我们的handleStop中进行定义啦。

这些是我自己的一些个人方面的理解,希望能够帮助大家,也可能有些片面,希望有意见的朋友也能够互相交流,互相进步。谢谢。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值