您的位置:首页 > 移动开发 > Android开发

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

2016-08-11 18:46 816 查看
我在开发的过程中,用到了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;
//用在用户手指离开MyScrollView,MyScrollView还在继续滑动,用来保存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中进行定义啦。

这些是我自己的一些个人方面的理解,希望能够帮助大家,也可能有些片面,希望有意见的朋友也能够互相交流,互相进步。谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: