Android仿QQ、微信ListView滑动删除item
2015-01-13 16:06
225 查看
最近做项目需要用到ListView滑动出现一个删除按钮来删除item,仿QQ。由于自己以前没做过,只能现学现卖,呵呵。百度一下资料还真不少,首先看到的是github上的开源项目SwipeListView库地址:https://github.com/47deg/android-swipelistview,项目和库一般不在一个地方,Example地址:https://github.com/47deg/android-swipelistview-sample,依赖于https://github.com/JakeWharton/NineOldAndroids 如图:
它的效果是按钮隐藏在item下面不会动,像一个女人在床上一动不动感觉不太好。我现在想要的效果是删除按钮在item后面能够随之而动,类似QQ一样,因为这样自己感觉会更好一点。在网上也找到了一些资料但是不够完美,自己有加以修改,效果挺理想,和qq一样,用在项目中也没丝毫问题,哦也!开始没发现,后来在github上又找到了一个demo,完全符合要求,地址:https://github.com/baoyongzhang/SwipeMenuListView 和 https://github.com/daimajia/AndroidSwipeLayout,效果如图:
下面是代码的一些详细内容
自定义ListView:
自定义item的布局:
下面是项目源码,欢迎光临......
它的效果是按钮隐藏在item下面不会动,像一个女人在床上一动不动感觉不太好。我现在想要的效果是删除按钮在item后面能够随之而动,类似QQ一样,因为这样自己感觉会更好一点。在网上也找到了一些资料但是不够完美,自己有加以修改,效果挺理想,和qq一样,用在项目中也没丝毫问题,哦也!开始没发现,后来在github上又找到了一个demo,完全符合要求,地址:https://github.com/baoyongzhang/SwipeMenuListView 和 https://github.com/daimajia/AndroidSwipeLayout,效果如图:
下面是代码的一些详细内容
自定义ListView:
package com.ryg.slideview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.ListView; public class CustomSwipeListView extends ListView { private static final String TAG = "ListViewCompat"; public static SwipeItemView mFocusedItemView; public CustomSwipeListView(Context context) { super(context); } public CustomSwipeListView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSwipeListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void shrinkListItem(int position) { View item = getChildAt(position); if (item != null) { try { ((SwipeItemView) item).shrink(); } catch (ClassCastException e) { e.printStackTrace(); } } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { int x = (int) event.getX(); int y = (int) event.getY(); // 我们想知道当前点击了哪一行 int position = pointToPosition(x, y); Log.e(TAG, "postion=" + position); if (position != INVALID_POSITION) { // 由于pointToPosition返回的是ListView所有item中被点击的item的position, // 而listview只会缓存可见的item,因此getChildAt()的时候,需要通过减去getFirstVisiblePosition() // 来计算被点击的item在可见items中的位置。 int firstPos = getFirstVisiblePosition(); mFocusedItemView = (SwipeItemView) getChildAt(position - firstPos); Log.d("gaolei", "position------------------" + position); Log.d("gaolei", "firstPos------------------" + firstPos); Log.d("gaolei", "mFocusedItemView-----isNull---------" + (mFocusedItemView != null)); } } default: break; } if (mFocusedItemView != null) { mFocusedItemView.onRequireTouchEvent(event); } return super.onTouchEvent(event); } }
自定义item的布局:
package com.ryg.slideview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Scroller; import android.widget.TextView; public class SwipeItemView extends LinearLayout { private static final String TAG = "SlideView"; private Context mContext; private LinearLayout mViewContent; private RelativeLayout mHolder; private Scroller mScroller; private OnSlideListener mOnSlideListener; private int mHolderWidth; private int mLastX = 0; private int mLastY = 0; private static final int TAN = 2; public interface OnSlideListener { public static final int SLIDE_STATUS_OFF = 0; public static final int SLIDE_STATUS_START_SCROLL = 1; public static final int SLIDE_STATUS_ON = 2; /** * @param view * current SlideView * @param status * SLIDE_STATUS_ON or SLIDE_STATUS_OFF */ public void onSlide(View view, int status); } public SwipeItemView(Context context) { super(context); initView(); } public SwipeItemView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mContext = getContext(); // 初始化弹性滑动对象 mScroller = new Scroller(mContext); // 设置其方向为横向 setOrientation(LinearLayout.HORIZONTAL); // 将slide_view_merge加载进来 View.inflate(mContext, R.layout.slide_view_merge, this); mViewContent = (LinearLayout) findViewById(R.id.view_content); mHolder = (RelativeLayout) findViewById(R.id.holder); mHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mHolderWidth = mHolder.getMeasuredWidth(); mHolder.setLayoutParams(new LinearLayout.LayoutParams(mHolderWidth, LayoutParams.MATCH_PARENT)); } public void setButtonText(CharSequence text) { ((TextView) findViewById(R.id.delete)).setText(text); } public void setContentView(View view) { mViewContent.addView(view); } public void setOnSlideListener(OnSlideListener onSlideListener) { mOnSlideListener = onSlideListener; } public void shrink() { if (getScrollX() != 0) { this.smoothScrollTo(0, 0); } } public void onRequireTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); int scrollX = getScrollX(); Log.d(TAG, "x=" + x + " y=" + y); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { if (!mScroller.isFinished()) { mScroller.abortAnimation(); } if (mOnSlideListener != null) { mOnSlideListener.onSlide(this, OnSlideListener.SLIDE_STATUS_START_SCROLL); } break; } case MotionEvent.ACTION_MOVE: { int deltaX = x - mLastX; int deltaY = y - mLastY; if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) { break; } int newScrollX = scrollX - deltaX; if (deltaX != 0) { if (newScrollX < 0) { newScrollX = 0; } else if (newScrollX > mHolderWidth) { newScrollX = mHolderWidth; } this.scrollTo(newScrollX, 0); } break; } case MotionEvent.ACTION_UP: { int newScrollX = 0; if (scrollX - mHolderWidth * 0.75 > 0) { newScrollX = mHolderWidth; } this.smoothScrollTo(newScrollX, 0); if (mOnSlideListener != null) { mOnSlideListener.onSlide(this, newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF : OnSlideListener.SLIDE_STATUS_ON); } break; } default: break; } mLastX = x; mLastY = y; } private void smoothScrollTo(int destX, int destY) { int scrollX = getScrollX(); int delta = destX - scrollX; mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3); invalidate(); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } }
下面是项目源码,欢迎光临......
相关文章推荐
- (4.2.5) 【android开源组件】SwipeListView 详解 实现微信,QQ等滑动删除效果
- Android listview 侧滑 SwipeListView 详解 实现微信,QQ等滑动删除效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- android滑动删除的listview,仿手机QQ的样子
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- android中listview的item滑动删除效果(已解决listview点击问题)
- Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)
- android 实现Listview左右滑动删除Item
- SwipeListView 详解 实现微信,QQ等滑动删除效果
- Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)
- SwipeListView 详解 实现微信,QQ等滑动删除效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- [Android]模仿QQ在listview上滑动出现删除键
- Android仿QQ消息列表ListView滑动删除效果
- AndroidUI_listview的item滑动删除效果