Android ListView实现仿iPhone实现左滑删除按钮的简单实例
需要自定义ListView。这里就交FloatDelListView吧。
复写onTouchEvent方法。如下:
@Override
publicbooleanonTouchEvent(MotionEventev){
switch(ev.getAction()){
caseMotionEvent.ACTION_DOWN:<BR>//获取按下的条目视图(childview)
intchildCount=getChildCount();
int[]listViewCoords=newint[2];
getLocationOnScreen(listViewCoords);
intx=(int)ev.getRawX()-listViewCoords[0];
inty=(int)ev.getRawY()-listViewCoords[1];
for(inti=0;i<childCount;i++){
downChild=getChildAt(i);//
Rectrect=newRect();
assertdownChild!=null;
downChild.getHitRect(rect);
intchildPosition=getPositionForView(downChild);
if(rect.contains(x,y)){
downX=ev.getRawX();
intdownPosition=childPosition;
velocityTracker=VelocityTracker.obtain();
assertvelocityTracker!=null;
velocityTracker.addMovement(ev);
break;
}
}
isSwipe=false;
break;
caseMotionEvent.ACTION_MOVE:
velocityTracker.addMovement(ev);<BR>//计算水平和垂直方向移动速度
velocityTracker.computeCurrentVelocity(1000);
floatvelocityX=Math.abs(velocityTracker.getXVelocity());
floatvelocityY=Math.abs(velocityTracker.getYVelocity());
<BR>//水平移动距离
floatdeltaX=ev.getRawX()-downX;
floatdeltaMode=Math.abs(deltaX);
if(deltaX>150){//rightswipe(右滑)
isSwipeToLeft=false;
}elseif(deltaX<-150){//leftswipe(左滑)
isSwipeToLeft=true;
}<BR>//如果水平滑动距离大于零,并且水平滑动速率比垂直大,说明是水平滑动
if(deltaMode>0&&velocityY<velocityX){<BR>//这里的FloatDelButtonLayout是自定义的LinearLayout。
((FloatDelButtonLayout)downChild).showDelButton(ev,isSwipeToLeft);
isSwipe=true;
}
break;
caseMotionEvent.ACTION_CANCEL:
caseMotionEvent.ACTION_UP:
downChild.setSelected(false);
if(isSwipe){
isSwipe=false;
returntrue;
}
break;
}
returnsuper.onTouchEvent(ev);
}
FloatDelButtonLayou.java:
publicclassFloatDelButtonLayoutextendsLinearLayout{
<BR>//提供删除按钮的接口
privateOnDelListenerdelListener;
<BR>//当前视图在列表中的索引,在delListener中使用
privateintindex;
<BR>//右滑还是左滑?<BR>privatebooleanisSwipeToLeft;<BR>
publicvoidsetOnDelListener(OnDelListenerlistener,inti){
delListener=listener;
index=i;
}
publicFloatDelButtonLayout(Contextcontext){
super(context,null);
}
publicFloatDelButtonLayout(Contextcontext,AttributeSetattrs){
super(context,attrs,0);
}
publicFloatDelButtonLayout(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
<BR>//用来显示或者隐藏删除按钮。
publicvoidshowDelButton(MotionEventev,booleanisSwipeToLeft){
this.isSwipeToLeft=isSwipeToLeft;
onTouchEvent(ev);
}
privateOnClickListenerclickDel=newOnClickListener(){
@Override
publicvoidonClick(Viewv){
delListener.onDel(index);
}
};
<BR>/**<BR>*这里的event是我们显示的从FloatDelListView的onTouchEvent里面传进来的,<BR>*/
@Override
publicbooleanonTouchEvent(MotionEventevent){
switch(MotionEventCompat.getActionMasked(event)){
caseMotionEvent.ACTION_MOVE:<BR>//获取删除按钮对象,视图layout中必须要有id为del_button的Button标签
Buttonview=(Button)findViewById(R.id.del_button);
view.setText(R.string.del);<BR>//设置Button的MarginLayoutParams,当然可以做成各种动作,比如渐隐之类的显示出来。
MarginLayoutParamslayoutParams=(MarginLayoutParams)view.getLayoutParams();
assertlayoutParams!=null;
if(isSwipeToLeft){
view.setVisibility(View.VISIBLE);
view.setOnClickListener(clickDel);
layoutParams.leftMargin=-200;
}else{
view.setVisibility(View.GONE);
layoutParams.leftMargin=0;
}
view.setLayoutParams(layoutParams);
invalidate();
break;
}
returnsuper.onTouchEvent(event);
}
publicinterfaceOnDelListener{
voidonDel(inti);
}
}
以上这篇AndroidListView实现仿iPhone实现左滑删除按钮的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。