QQ的一个聊天界面的listview每一行向左滑动的时候,会出现删除的按钮,特别炫酷,这个效果可以有,今天跟大家分享下。
先上demo的效果图
界面很丑,因为主要是介绍功能,界面什么的,搞那么复杂,下demo的时候还浪费资源,哈哈哈。
用到的几个类(4个)
SwipeItemLayout,SwipeListView,SwipeAdapter,FragmentTestActivity.
SwipeItemLayout就是listView的一个item,这个类集成了FrameLayout。SwipeListView是重写的一个ListView,其实主要在她的OnTouch事件的处理上。SwipeAdapter是一个adapter,这个不用解释了,FragmenTestActivity这个就是怎么用的了。
好,一个一个来
首先我们看一个item怎么写,先上代码,代码里面基本上有逐行的解释。
public class SwipeItemLayout extends FrameLayout {
//这个是内容的item,也就是不左滑的时候的布局
private View contentView = null;
//这个是左滑之后显示的那个部分,即多出的部分
private View menuView = null;
//这个是动画的速度控制器,其实没用到
private Interpolator closeInterpolator = null;
private Interpolator openInterpolator = null;
//控制控件滑动的,会平滑滑动,一个开一个关
private ScrollerCompat mOpenScroller;
private ScrollerCompat mCloseScroller;
//左滑之后,contentView左边距离屏幕左边的距离,基线,用于滑回
private int mBaseX;
//手指点击的初始位置
private int mDownX;
//当前item的状态,open和close两种
private int state = STATE_CLOSE;
private static final int STATE_CLOSE = 0;
private static final int STATE_OPEN = 1;
//构造函数
public SwipeItemLayout(View contentView,View menuView,Interpolator closeInterpolator, Interpolator openInterpolator){
super(contentView.getContext());
this.contentView = contentView;
this.menuView = menuView;
this.closeInterpolator = closeInterpolator;
this.openInterpolator = openInterpolator;
init();
}
private void init(){
//设置一个item的宽和高,其实就是设置宽充满而已
setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
//初始化mColoseScroller和mOpenScroller
if (closeInterpolator != null) {
mCloseScroller = ScrollerCompat.create(getContext(),
closeInterpolator);
} else {
mCloseScroller = ScrollerCompat.create(getContext());
}
if (openInterpolator != null) {
mOpenScroller = ScrollerCompat.create(getContext(),
openInterpolator);
} else {
mOpenScroller = ScrollerCompat.create(getContext());
}
//这也是设置宽和高
LayoutParams contentParams = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
content