<!--
Description:上拉刷新。装载下拉菜单是现在最流行的,在许多其他手势,可是对于刚開始学习的人来说。在实现上是有一定难度的。
网上非常多教程讲的都过于复杂。对于刚開始学习的人无法起到引导作用。特此写本文,帮助安卓新手入门理解此。
还有最为重要的一点:本文仅仅帮助你理解,并非想你成为代码搬运工!别被那么多代码吓到了,
当中非常多都是凝视。细致看凝视对你理解有非常大的帮助
Author:Booker L
Date:2014-05-16
-->
一,事先准备:
实现该功能,最主要的须要两个东西。一个是OnTouchListener,一个是OnScrollListener,必须得理解这两个东西
1,OnTouchListener:用于监測触碰事件,当发生手指碰到屏幕时,以及滑动时,须要用到该Listener来处理相应操作
2,OnScrollListener:用于监听ListView的滚动事件(不一定是ListView,应是支持该监听的全部控件),
当滚动到第一行或最后一行时须要的推断,当中会有三个參数。后面会解说道
二,Let's begin:
首先先自己定义两个listener并实现相应的接口,而且在可訪问公共变量的类中设置两个变量来推断当前滚动值和状态:
1, class TestClass extends Activity{
//在可訪问公共变量的类中设置两个变量来推断当前滚动值和状态
private boolean isFirstRow;//是否滚到第一行
private boolean isLastRow;是否滚到最后一行
.....
}
其次写两个自己定义类来实现相关接口:
//滚动监听类
2.1, class MyScrollListener implements OnScrollListener{
/**当滚动时触发的方法
*firstVisiableItem--当前list中能见的第一个item下标。也就是当前被滚到最前面的
*visiableItemCount--当前可以看见的item的总数
*totalItemcount--总共的item数量
*/
@Override
public void onScroll(AbsListView arg0, int firstVisiableItem, int visiableItemCount, int totalItemcount) {
//推断当前是否滚动到第一行(依据前面对參数的解释相信你可以理解)
if(firstVisiableItem==0&&totalItemcount>0){
isFirstRow=true;
}else{
//否者不是第一行
isFirstRow=false;
}
//推断是否到了滚动到了最后一行
if (firstVisiableItem + visiableItemCount == totalItemcount && totalItemcount > 0) {
isLastRow = true;
}else{
isLastRow=false;
}
}
/**当滚动状态发生变化时触发的方法
*scrollState--发生的变化的状态,共同拥有:SCROLL_STATE_IDLE(滚动,而且手指已经离开屏幕),SCROLL_STATE_FLING(手指高速滚动时),SCROLL_STATE_TOUCH_SCROLL(手指滚动,可是手指依旧在屏幕上)
*/
@Override
public void onScrollStateChanged(AbsListView arg0, int scrollState) {
//这种方法的使用视情况而定,这里不须要用到
}
}
//触摸监听类
2.2, class MyTouchListener implements OnTouchListener{
/**当中MotionEvent为重要參数,它提供了触摸事件的全部參数和方法*/
@Override
public boolean onTouch(View v, MotionEvent event) {
/*
这里须要做的几件事:
1,当发生down事件时,记录发生该事件的y坐标
2,当发生move事件时,推断移动中的y坐标是否可以达成下拉或上拉事件
3,当发生up事件时,假设达成上拉或下拉事件时,触发相应事件
/*
//为了可以形成视觉上的上拉下托简单效果,须要设置例如以下变量
//用于获取显示屏相关内容
DisplayMetrics dm =getResources().getDisplayMetrics();
//获取dpi值,以便较为精确的算出移动的像素
float density=dm.densityDpi/100;
//得到布局參数。用它来实现视觉上的拖动效果
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
//设置一个变量来记录原始y坐标
private float or_y=0f;
//event中调用getAction()来获取当前触发的是什么事件,这里我们要用到down,move,up这三个事件
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//发生down事件记录原始y坐标,getY()方法可重载。用于推断多点触控,这个不须要推断
or_y=event.getY();
break;
case MotionEvent.ACTION_MOVE:
//当手势移动时,获取当前y坐标,并与之前的坐标进行对照。来推断是往上还是往下
//设置变量获取移动值,往上托为正值,往下拉为负值
int y_dis=(int)(or_y-event.getY());
//推断是否达成拖动条件
if(isFirstRow&&y_dis<0){//处于第一行而且继续往下拉动
//得到移动距离的绝对值而且算出其移动的相对距离,
float distance=Math.abs(y_dis/density/2);
lp.topMargin=(int)distance;
//形成往下拉的效果,当中listView为相应的控件(不一定是ListView)
listView.setLayoutParams(lp);
}else if(isLastRow&&y_dis>0){//处于最后一行而且继续网上拉时
//同理
float distance=Math.abs(y_dis/density/2);
lp.bottomMargin=(int)distance;
listView.setLayoutParams(lp);
}
break;
case MotionEvent.ACTION_UP:
//当发生up事件时,假设达成条件可触发事件,即触发相应事件
if(isFirstRow){
lp.topMargin=0;
//调用获取刷新数据的接口方法getNewest();
}else if(isLastRow){
lp.bottomMargin=0;
//调用获取很多其它数据的接口方法getMore();
}
listView.setLayoutParams(lp);
break;
}
}
}
最后在listView中设置相应的监听就可以:
3, onCreate(){
//得到控件
listView=(ListView)R.findViewById(R.id.XXX);
//设置相应的listener就可以
listView.setOnTouchListener(new MyTouchListener());
listView.setOnScrollListener(new MyScrollListener());
}
DONE~AND ENJOY
版权声明:本文博主原创文章,博客,未经同意不得转载。