软件编程
位置:首页>> 软件编程>> Android编程>> Android ListView实现仿iPhone实现左滑删除按钮的简单实例

Android ListView实现仿iPhone实现左滑删除按钮的简单实例

作者:jingxian  发布时间:2023-06-15 04:25:59 

标签:listview,左滑,删除,按钮

需要自定义ListView。这里就交FloatDelListView吧。

复写onTouchEvent方法。如下:


@Override
 public boolean onTouchEvent(MotionEvent ev) {
   switch (ev.getAction()) {
     case MotionEvent.ACTION_DOWN:<BR>// 获取按下的条目视图(child view)
       int childCount = getChildCount();
       int[] listViewCoords = new int[2];
       getLocationOnScreen(listViewCoords);
       int x = (int) ev.getRawX() - listViewCoords[0];
       int y = (int) ev.getRawY() - listViewCoords[1];
       for (int i = 0; i < childCount; i++) {
         downChild = getChildAt(i); //
         Rect rect = new Rect();
         assert downChild != null;
         downChild.getHitRect(rect);

int childPosition = getPositionForView(downChild);

if (rect.contains(x, y)) {
           downX = ev.getRawX();
           int downPosition = childPosition;

velocityTracker = VelocityTracker.obtain();
           assert velocityTracker != null;
           velocityTracker.addMovement(ev);
           break;
         }
       }
       isSwipe = false;
       break;
     case MotionEvent.ACTION_MOVE:
       velocityTracker.addMovement(ev);<BR> // 计算水平和垂直方向移动速度
       velocityTracker.computeCurrentVelocity(1000);
       float velocityX = Math.abs(velocityTracker.getXVelocity());
       float velocityY = Math.abs(velocityTracker.getYVelocity());
<BR> // 水平移动距离
       float deltaX = ev.getRawX() - downX;
       float deltaMode = Math.abs(deltaX);
       if (deltaX > 150) {// right swipe(右滑)
         isSwipeToLeft = false;
       } else if (deltaX < -150) {// left swipe(左滑)
         isSwipeToLeft = true;
       }<BR> // 如果水平滑动距离大于零,并且水平滑动速率比垂直大,说明是水平滑动
       if (deltaMode > 0 && velocityY < velocityX) {<BR>// 这里的FloatDelButtonLayout是自定义的LinearLayout。
         ((FloatDelButtonLayout) downChild).showDelButton(ev, isSwipeToLeft);
         isSwipe = true;
       }
       break;
     case MotionEvent.ACTION_CANCEL:
     case MotionEvent.ACTION_UP:
       downChild.setSelected(false);
       if (isSwipe) {
         isSwipe = false;
         return true;
       }
       break;
   }
   return super.onTouchEvent(ev);
 }

FloatDelButtonLayou.java :


public class FloatDelButtonLayout extends LinearLayout {
<BR> // 提供删除按钮的接口
 private OnDelListener delListener;
<BR> // 当前视图在列表中的索引,在delListener中使用
 private int index;
<BR> // 右滑 还是 左滑?<BR>  private boolean isSwipeToLeft;<BR>
 public void setOnDelListener(OnDelListener listener, int i) {
   delListener = listener;
   index = i;
 }

public FloatDelButtonLayout(Context context) {
   super(context, null);
 }

public FloatDelButtonLayout(Context context, AttributeSet attrs) {
   super(context, attrs, 0);
 }

public FloatDelButtonLayout(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
 }
<BR> // 用来显示或者隐藏删除按钮。
 public void showDelButton(MotionEvent ev, boolean isSwipeToLeft) {
   this.isSwipeToLeft = isSwipeToLeft;
   onTouchEvent(ev);
 }

private OnClickListener clickDel = new OnClickListener() {
   @Override
   public void onClick(View v) {
     delListener.onDel(index);
   }
 };
<BR> /**<BR> * 这里的event是我们显示的从FloatDelListView的onTouchEvent里面传进来的,<BR>   */
 @Override
 public boolean onTouchEvent(MotionEvent event) {
   switch (MotionEventCompat.getActionMasked(event)) {
     case MotionEvent.ACTION_MOVE:<BR> // 获取删除按钮对象,视图layout中必须要有id为del_button的Button标签
       Button view = (Button) findViewById(R.id.del_button);
       view.setText(R.string.del);<BR> // 设置Button的MarginLayoutParams,当然可以做成各种动作,比如渐隐之类的显示出来。
       MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
       assert layoutParams != 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;
   }
   return super.onTouchEvent(event);
 }

public interface OnDelListener {
   void onDel(int i);
 }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com