Android仿QQ微信侧滑删除效果

作者:JH_Manny 时间:2023-07-08 11:22:15 

仿QQ侧滑删除效果图

Android仿QQ微信侧滑删除效果

1.自定义listview


public class DragDelListView extends ListView {

private boolean moveable=false;
 private boolean closed=true;
 private float mDownX,mDownY;
 private int mTouchPosition,oldPosition=-1;
 private DragDelItem mTouchView,oldView;
 private Context context;
 public DragDelListView(Context context) {
   super(context);
   init(context);
 }
 public DragDelListView(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
   init(context);
 }
 public DragDelListView(Context context, AttributeSet attrs) {
   super(context, attrs);
   init(context);
 }
 private void init(Context context) {
   this.context=context;
 }

@Override
 public boolean onTouchEvent(MotionEvent ev) {
   switch (ev.getAction()) {
   case MotionEvent.ACTION_DOWN:
     mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
     mTouchView=(DragDelItem)getChildAt(mTouchPosition - getFirstVisiblePosition());
     mDownX = ev.getX();
     mDownY=ev.getY();
     if(oldPosition==mTouchPosition ||closed)
     {
       moveable=true;
       mTouchView.mDownX =(int)mDownX;
     }else
     {
       moveable=false;
       if(oldView!=null)
       {
         oldView.smoothCloseMenu();
       }
     }
     oldPosition=mTouchPosition;
     oldView=mTouchView;
     break;
   case MotionEvent.ACTION_MOVE:
     if (Math.abs(mDownX-ev.getX()) < Math.abs(mDownY-ev.getY()) * dp2px(2)) {
       break;
     }
     if (moveable)
     {
       int dis = (int) (mTouchView.mDownX -ev.getX());
       if(mTouchView.state==mTouchView.STATE_OPEN)
         dis+=mTouchView.mMenuView.getWidth();
       mTouchView.swipe(dis);
       ev.setAction(MotionEvent.ACTION_CANCEL);
     }

break;
   case MotionEvent.ACTION_UP:

if (moveable)
     {
       if ((mTouchView.mDownX -ev.getX()) > (mTouchView.mMenuView.getWidth()/2)) {
         // open
         mTouchView.smoothOpenMenu();
         closed=false;
       } else {
         // close
         mTouchView.smoothCloseMenu();
         closed=true;
       }
       ev.setAction(MotionEvent.ACTION_CANCEL);
     }
     break;
   }
   return super.onTouchEvent(ev);
 }

private int dp2px(int dp) {
   return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
       getContext().getResources().getDisplayMetrics());
 }

}

2.自定义滑动条目


public class DragDelItem extends LinearLayout {

public static final int STATE_CLOSE = 0;
 public static final int STATE_OPEN = 1;
 private View mContentView;
 public View mMenuView;
 public int mDownX;
 public int state = STATE_CLOSE;
 public boolean isFling;
 private int mBaseX;
 private Scroller scroll;

public DragDelItem(View contentView, View menuView) {
   super(contentView.getContext());
   scroll=new Scroller(getContext());
   mContentView = contentView;
   mMenuView = menuView;
   init();
 }

private DragDelItem(Context context, AttributeSet attrs) {
   super(context, attrs);
 }

private DragDelItem(Context context) {
   super(context);
 }

private void init() {
   setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
       LayoutParams.WRAP_CONTENT));
   LayoutParams contentParams = new LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
   mContentView.setLayoutParams(contentParams);

mMenuView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
       LayoutParams.WRAP_CONTENT));

addView(mContentView);
   addView(mMenuView);

}

public void swipe(int dis) {
   if (dis > mMenuView.getWidth()) {
     dis = mMenuView.getWidth();
   }
   if (dis < 0) {
     dis = 0;
   }
   mContentView.layout(-dis, mContentView.getTop(),
       mContentView.getWidth() - dis, getMeasuredHeight());
   mMenuView.layout(mContentView.getWidth() - dis, mMenuView.getTop(),
       mContentView.getWidth() + mMenuView.getWidth() - dis,
       mMenuView.getBottom());
 }

@Override
 public void computeScroll() {
   if (state == STATE_OPEN) {
     if (scroll.computeScrollOffset()) {
       swipe(scroll.getCurrX());
       postInvalidate();
     }
   } else {
     if (scroll.computeScrollOffset()) {
       swipe(mBaseX - scroll.getCurrX());
       postInvalidate();
     }
   }
 }

public void smoothCloseMenu() {
   state = STATE_CLOSE;
   mBaseX = -mContentView.getLeft();
   scroll.startScroll(0, 0, mBaseX, 0, 350);
   postInvalidate();
 }

public void smoothOpenMenu() {

state = STATE_OPEN;
   scroll.startScroll(-mContentView.getLeft(), 0,
       mMenuView.getWidth()/2, 0, 350);
   postInvalidate();
 }

@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mMenuView.measure(MeasureSpec.makeMeasureSpec(0,
       MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(
       getMeasuredHeight(), MeasureSpec.EXACTLY));
   mContentView.measure(MeasureSpec.makeMeasureSpec(0,
       MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(
       getMeasuredHeight(), MeasureSpec.EXACTLY));

}

@Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
   mContentView.layout(0, 0, getMeasuredWidth(),
       mContentView.getMeasuredHeight());
   mMenuView.layout(getMeasuredWidth(), 0,
       getMeasuredWidth() + mMenuView.getMeasuredWidth(),
       mContentView.getMeasuredHeight());

}

}

3.所用到的布局文件

—swipecontent.xml代码


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/rl_layout"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="#999999"
 android:padding="8dp" >
   <ImageView
     android:id="@+id/iv_icon"
     android:layout_width="50dp"
     android:layout_height="50dp"
     android:src="@drawable/ic_launcher" />

<TextView
     android:id="@+id/tv_name"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerVertical="true"
     android:layout_marginLeft="10dp"
     android:layout_toRightOf="@+id/iv_icon"
     android:text="name"
     android:textColor="@android:color/black"
     android:textSize="18sp" />
</RelativeLayout>

—swipemenu.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:orientation="horizontal"
 >

<TextView
   android:id="@+id/tv_open"
   android:layout_width="90dp"
   android:layout_height="match_parent"
   android:gravity="center"
   android:background="#C2C2C2"
   android:text="置顶"
   android:textColor="@android:color/white"
   android:textSize="18sp" />
 <TextView
   android:id="@+id/tv_del"
   android:layout_width="90dp"
   android:layout_height="match_parent"
   android:gravity="center"
   android:background="#FF0000"
   android:text="删除"
   android:textColor="@android:color/white"
   android:textSize="18sp" />

</LinearLayout>

4.主界面代码


public class MainActivity extends Activity {
 private List<ApplicationInfo> mAppList;
 private DragDelListView mListView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_list);

mAppList = getPackageManager().getInstalledApplications(0);
   mListView = (DragDelListView) findViewById(R.id.listView);
   mListView.setAdapter(new AppAdapter(mAppList));
 }
 class AppAdapter extends BaseAdapter {
   private List<ApplicationInfo> mAppList;
   public AppAdapter(List<ApplicationInfo> appList)
   {
     mAppList=appList;
   }
   @Override
   public int getCount() {
     return mAppList.size();
   }

@Override
   public ApplicationInfo getItem(int position) {
     return mAppList.get(position);
   }

@Override
   public long getItemId(int position) {
     return position;
   }

@Override
   public View getView(final int position, View convertView, ViewGroup parent) {

ViewHolder holder=null;
     View menuView=null;
     if (convertView == null) {
       convertView = View.inflate(getApplicationContext(),
           R.layout.swipecontent, null);
       menuView = View.inflate(getApplicationContext(),
           R.layout.swipemenu, null);
       convertView = new DragDelItem(convertView,menuView);
       holder=new ViewHolder(convertView);
     } else {
       holder = (ViewHolder) convertView.getTag();
     }
       ApplicationInfo item = getItem(position);
       holder.iv_icon.setImageDrawable(item.loadIcon(getPackageManager()));
       holder.tv_name.setText(item.loadLabel(getPackageManager()));
       holder.tv_open.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View arg0) {
           Toast.makeText(MainActivity.this, "置顶:"+position, Toast.LENGTH_SHORT).show();
         }
       });
       holder.tv_del.setOnClickListener(new View.OnClickListener() {

@Override
         public void onClick(View arg0) {
           Toast.makeText(MainActivity.this, "删除:"+position, Toast.LENGTH_SHORT).show();
         }
       });
     return convertView;
   }

class ViewHolder {
     ImageView iv_icon;
     TextView tv_name;
     TextView tv_open,tv_del;
     RelativeLayout relativeLayout;
     public ViewHolder(View view) {
       iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
       tv_name = (TextView) view.findViewById(R.id.tv_name);
       tv_open=(TextView)view.findViewById(R.id.tv_open);
       tv_del=(TextView)view.findViewById(R.id.tv_del);
       relativeLayout = (RelativeLayout) view.findViewById(R.id.rl_layout);
       //改变relativeLayout宽度
       WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
       int width = wm.getDefaultDisplay().getWidth();
       relativeLayout.setMinimumWidth(width-60);
       view.setTag(this);
     }
   }
 }
}

主界面布局代码


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >

<com.draglistview.DragDelListView
     android:id="@+id/listView"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />

</RelativeLayout>

标签:Android,侧滑删除
0
投稿

猜你喜欢

  • C# 抓取网页内容的方法

    2022-09-13 04:50:10
  • Java设计模式之装饰模式详解

    2022-09-27 05:55:32
  • 基于Java编写一个PDF与Word文件转换工具

    2023-05-30 19:23:12
  • Mybatis批量修改时出现报错问题解决方案

    2022-05-15 19:07:40
  • android 选项卡(TabHost)如何放置在屏幕的底部

    2023-07-09 21:19:59
  • Java多线程死锁示例

    2022-09-17 15:05:25
  • Java Servlet简单实例分享(文件上传下载demo)

    2022-03-03 06:35:04
  • Java中构造、生成XML简明教程

    2021-10-03 09:33:58
  • springboot @WebFilter注解过滤器的实现

    2023-07-06 11:14:54
  • Android Studio与SVN版本控制程序的协作使用指南

    2021-11-08 15:16:08
  • Java集合系列之ArrayList源码分析

    2023-01-31 03:02:36
  • WPF仿LiveCharts实现饼图的绘制

    2022-02-08 02:17:05
  • 一篇文章教你使用枚举来实现java单例模式

    2023-08-23 22:24:36
  • JAVA中JSONObject对象和Map对象之间的相互转换

    2023-07-13 15:04:28
  • spring获取bean的源码解析

    2023-10-11 22:15:43
  • C# 语言入门基础介绍

    2022-03-02 13:32:33
  • Java中Lambda表达式和函数式接口的使用和特性

    2023-06-20 20:05:42
  • 分享我在工作中遇到的多线程下导致RCW无法释放的问题

    2022-10-14 21:07:29
  • Java如何实现定时任务

    2021-11-07 02:57:38
  • Android PopupWindow被输入法弹上去之后无法恢复原位的解决办法

    2023-07-24 12:23:31
  • asp之家 软件编程 m.aspxhome.com