实例介绍
【实例简介】android仿QQ消息列表滑动删除源代码
【实例截图】
package cn.sunzn.scview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.ScaleAnimation;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;
public class SlideCutListView extends ListView {
private int slidePosition, preSlidePosition;
private int downY;
private int downX;
public static View itemView, preItemView;
private Scroller scroller;
private static final int SNAP_VELOCITY = 600;
private VelocityTracker velocityTracker;
public static boolean isSlide = false;
private boolean isResponse = true;
public static boolean isObstruct = true;
private int mTouchSlop;
private RemoveListener mRemoveListener;
private static Animation scaleHideAnimation;
private static Animation scaleShowAnimation;
public SlideCutListView(Context context) {
this(context, null);
}
public SlideCutListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlideCutListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
scroller = new Scroller(context);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
public void setRemoveListener(RemoveListener removeListener) {
this.mRemoveListener = removeListener;
}
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
Log.e("sunzn", "dispatchTouchEvent ACTION_DOWN isSlide = " isSlide);
addVelocityTracker(event);
downX = (int) event.getX();
downY = (int) event.getY();
slidePosition = pointToPosition(downX, downY);
if (slidePosition == AdapterView.INVALID_POSITION) {
return super.dispatchTouchEvent(event);
}
if (preItemView != null && preItemView.findViewById(R.id.tv_coating).getVisibility() == View.GONE) {
itemView = preItemView;
slidePosition = preSlidePosition;
} else {
itemView = getChildAt(slidePosition - getFirstVisiblePosition());
preItemView = itemView;
preSlidePosition = slidePosition;
}
break;
}
case MotionEvent.ACTION_MOVE: {
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY || (Math.abs(event.getX() - downX) > mTouchSlop && Math.abs(event.getY() - downY) < mTouchSlop)) {
isSlide = true;
}
break;
}
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
isObstruct = true;
break;
}
return super.dispatchTouchEvent(event);
}
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.VISIBLE) {
isSlide = false;
} else {
isSlide = true;
}
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
public boolean onTouchEvent(MotionEvent ev) {
if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
addVelocityTracker(ev);
final int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
Log.e("sunzn", "onTouchEvent ACTION_MOVE isSlide = " isSlide);
if (isObstruct) {
if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.VISIBLE && isResponse == true) {
scaleHideAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 1.0f);
scaleHideAnimation.setDuration(250);
scaleHideAnimation.setAnimationListener(new AnimationListener() {
public void onAnimationStart(Animation animation) {
isResponse = false;
isObstruct = false;
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationEnd(Animation animation) {
isResponse = true;
itemView.findViewById(R.id.tv_coating).setVisibility(View.GONE);
itemView.findViewById(R.id.tv_functions).setClickable(true);
itemView.findViewById(R.id.tv_functions).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mRemoveListener.removeItem(slidePosition);
}
});
}
});
itemView.findViewById(R.id.tv_coating).startAnimation(scaleHideAnimation);
} else if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.GONE && isResponse == true) {
scaleShowAnimation = new ScaleAnimation(0.0f, 1.0f, 1.0f, 1.0f);
scaleShowAnimation.setDuration(250);
scaleShowAnimation.setAnimationListener(new AnimationListener() {
public void onAnimationStart(Animation animation) {
isResponse = false;
isObstruct = false;
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationEnd(Animation animation) {
isSlide = false;
isResponse = true;
itemView.findViewById(R.id.tv_coating).setVisibility(View.VISIBLE);
}
});
itemView.findViewById(R.id.tv_coating).startAnimation(scaleShowAnimation);
}
}
break;
case MotionEvent.ACTION_UP:
isObstruct = true;
recycleVelocityTracker();
isSlide = true;
break;
}
return true;
}
return super.onTouchEvent(ev);
}
public void computeScroll() {
if (scroller.computeScrollOffset()) {
postInvalidate();
if (scroller.isFinished()) {
if (mRemoveListener == null) {
throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()");
}
itemView.scrollTo(0, 0);
}
}
}
private void addVelocityTracker(MotionEvent event) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
velocityTracker.addMovement(event);
}
private void recycleVelocityTracker() {
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
}
private int getScrollVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
return velocity;
}
public interface RemoveListener {
public void removeItem(int position);
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论