我在开发的过程中,用到了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中进行定义啦。
这些是我自己的一些个人方面的理解,希望能够帮助大家,也可能有些片面,希望有意见的朋友也能够互相交流,互相进步。谢谢。