Android仿QQ微信侧滑删除效果
更新时间:2016年12月29日 14:30:26 作者:JH_Manny
这篇文章主要为大家详细介绍了Android仿QQ微信侧滑删除效果,自定义仿QQ侧滑删除,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
仿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 ItemTouchHelper实现可拖拽和侧滑的列表的示例代码
- Android高仿QQ6.0侧滑删除实例代码
- Android开发中记一个SwipeMenuListView侧滑删除错乱的Bug
- Android recyclerview实现拖拽排序和侧滑删除
- Android 模仿QQ侧滑删除ListView功能示例
- Android自定义view系列之99.99%实现QQ侧滑删除效果实例代码详解
- android的RecyclerView实现拖拽排序和侧滑删除示例
- android ListView和GridView拖拽移位实现代码
- android 大图片拖拽并缩放实现原理
- Android使用ItemTouchHelper实现侧滑删除和拖拽
相关文章
图解Windows环境下Android Studio安装和使用教程
这篇文章主要介绍了图解Windows环境下Android Studio安装和使用教程的相关资料,需要的朋友可以参考下2015-12-12Android添加glide库报错Error: Failed to resolve: com.android.suppo
这篇文章主要给大家介绍了关于Android添加glide库报错Error: Failed to resolve: com.android.support:support-annotations:26.0.2的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。2017-11-11Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法
这篇文章主要介绍了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法,涉及Android属性设置及activity操作的相关技巧,需要的朋友可以参考下2015-11-11Android中的sqlite查询数据时去掉重复值的方法实例
今天小编就为大家分享一篇关于Android中的sqlite查询数据时去掉重复值的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-01-01
最新评论