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实现左滑删除按钮的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。