Android开发仿QQ聊天滑动listview
2015-03-24 13:46
295 查看
主要是对分发事件的处理,代码如下:
public class SweepOnTouchListener implements OnTouchListener {
private ListView mListView;
private SweepLayout mDownView;
private SweepLayout mLastDownView;
private int mLastX, mLastY;
private boolean mSweep = false;
private boolean mIntercept = false;//是否取消点击事件
private int mMinFlingVelocity;
private int mMaxFlingVelocity;
private final static int TAN = 2;
private VelocityTracker mVelocityTracker;
public SweepOnTouchListener(ListView listview){
this.mListView = listview;
ViewConfiguration vc = ViewConfiguration.get(mListView.getContext());
mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
}
//取消点击事件
private void cancelTouchEvent(MotionEvent event){
MotionEvent cancelEvent = MotionEvent.obtain(event);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
mListView.onTouchEvent(cancelEvent);
cancelEvent.recycle();
}
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Rect rect = new Rect();
int mDownX = (int)event.getX();
int mDownY = (int)event.getY();
//获得item
for(int i = 0; i < mListView.getChildCount(); i ++){
View childView = mListView.getChildAt(i);
childView.getHitRect(rect);
if(rect.contains(mDownX, mDownY)){
mDownView = (SweepLayout) childView;
break;
}
}
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(event);
//当获得的item与上一个item不一致时,item恢复初始位置,取消其点击事件
if(mDownView != mLastDownView){
if(mLastDownView != null && mLastDownView.getScrollX() > 0) {
mLastDownView.shrik(100);
mDownView = null;
mIntercept = true;
}
}
view.onTouchEvent(event);
break;
case MotionEvent.ACTION_MOVE:
if(mDownView == null) return false;
mVelocityTracker.addMovement(event);
int deltaX = (int)event.getX() - mLastX;
int deltaY = (int)event.getY() - mLastY;
if((deltaX < 0 || mDownView.getScrollX() >0) && Math.abs(deltaX) >= TAN * Math.abs(deltaY)){
mSweep = true;
mIntercept = true;
}
if(mSweep && mDownView != null){
int distance = mDownView.getScrollX() - deltaX;
if(distance < 0) distance = 0;
if(distance > mDownView.getHolderWidth()) distance = mDownView.getHolderWidth();
mDownView.scrollTo(distance, 0);
mListView.requestDisallowInterceptTouchEvent(true);
}
if(mIntercept){
cancelTouchEvent(event);
}
break;
case MotionEvent.ACTION_UP:
if(mVelocityTracker != null){
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000);
}
if(mDownView != null){
boolean finishScroll = false;
if(mDownView.getScrollX() > 0.35 * mDownView.getHolderWidth()){
finishScroll = true;
}
if(mVelocityTracker != null){
float velocityX = mVelocityTracker.getXVelocity();
float velocityY = mVelocityTracker.getYVelocity();
//计算滑动速度和方向,如果速度为负值则为左滑,item为滑动位置,否则为初始位置
if(velocityX < 0 && Math.abs(velocityX) >= mMinFlingVelocity && Math.abs(velocityX) <= mMaxFlingVelocity && Math.abs(velocityX) >= TAN * Math.abs(velocityY)){
finishScroll = true;
mIntercept = true;
}else if(velocityX > 0 && Math.abs(velocityX) >= mMinFlingVelocity && Math.abs(velocityX) <= mMaxFlingVelocity && Math.abs(velocityX) >= TAN * Math.abs(velocityY)){
finishScroll = false;
mIntercept = true;
}
}
if(finishScroll){
mDownView.showSlide(100);
}else{
mDownView.shrik(100);
}
}
//如果点击的item为展开的item,并且没有滑动过,则item回到初始位置。
if(mDownView == mLastDownView){
if(mDownView != null){
if(mDownView.getScrollX() > 0 && !mSweep){
mDownView.shrik(100);
mIntercept = true;
}
}
}
if(mIntercept){
cancelTouchEvent(event);
}
mSweep = false;
mIntercept = false;
mLastDownView = mDownView;
mVelocityTracker.recycle();
break;
}
mLastX = (int)event.getX();
mLastY = (int)event.getY();
return false;
}
}
源码下载
相关文章推荐
- Android开发实现仿QQ消息SwipeMenuListView滑动删除置顶功能【附源码下载】
- Android UI开发第六篇——仿QQ的滑动Tab
- Android开发实现qqminihd 左右滑动菜单效果
- ANDROID 动态添加的listView,仿QQ滑动删除
- android开发之ExpandableListView的使用,实现类似QQ好友列表
- Android Widget 开发详解(二) +支持listView滑动的widget
- Android UI开发第六篇——仿QQ的滑动Tab
- Android仿QQ、微信ListView滑动删除item
- android listview 滑动删除加刷新功能 仿QQ消息列表
- android开发之修改ListView默认滑动条样式
- android开发之ExpandableListView的使用,实现类似QQ好友列表
- Android UI开发第六篇——仿QQ的滑动Tab
- [Android]模仿QQ在listview上滑动出现删除键
- Android实战简易教程-第十四枪(介绍SwipeMenuListView-简单实现类似QQ的滑动删除效果)
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
- Android仿QQ消息列表ListView滑动删除效果
- Android开发————ListView滑动删除内部内容
- Android蓝牙聊天程序的扩展开发(基于Google Sample,类QQ设计)
- android 自定义listview实现仿微信/QQ设置界面的开发