一 概述
当下从QQ主界面出现Item侧滑菜单出现之后,很多公司的项目都需要添加这种让人感觉炫酷的功能,但是,目前android API中根本没有提供这种实现,因此就要用自定义的方法来实现该功能。本篇文章实现的基本思路如下:
1.自定义ListView,获取当前滑动的View。
2.自定义LinearLayout充当Item根布局。
3.ListView中按下后,事件交由自定义LinearLayout处理。
二 效果
三 具体实现
- 重写ListView 的onTouchEvent方法,代码如下:
@Override
public boolean onTouchEvent(MotionEvent ev)
{
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
int x = (int) ev.getX();
int y = (int) ev.getY();
int position = pointToPosition(x,y);
if (position != INVALID_POSITION)
{
mSwipeMenuLayout = (SwipeMenuLayout) getChildAt(position - getFirstVisiblePosition());
}
break;
}
if (mSwipeMenuLayout != null)
{
mSwipeMenuLayout.onTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
这些代码相对比较简单,没有什么复杂的逻辑,比较关键的是获取用户按下的点,
用ListView的pointToPosition方法,传入获取的x,y坐标得到当下点击
的Item的position,重点说一下 ListView的getChildAt(int index)方法,
因为ListView与GridView的View复用机制,这个方法默认得到的是当前可见
区域(列表可滚动)的子项!也就表示它的取值范围是在
>= ListView.getFirstVisiblePosition() &&
<= ListView.getLastVisiblePosition(); 因此在程序中获取当前
点击Item View所复用的是哪个Item的View 就需要用
position(当前通过xy坐标获取到的) -
(减去) ListView.getFirstVisiblePosition()
得到的即是复用的Item的position,感兴趣的话,自己可以尝试着看看。
2. 自定义LinearLayout重写其onTouchEvent方法:
/**
* Created by admin on 2016/1/20.
*/
public class SwipeMenuLayout extends LinearLayout
{
/**
* 关闭
*/
public static final int SLIDE_STATUS_OFF = 0;