高仿微信对话列表滑动删除效果

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) {

Message data = (Message) getItemAtPosition(position);

mFocusedItemView = data.getSlideView();

Log.e(TAG, “FocusedItemView=” + mFocusedItemView);

}

}

default:

break;

}

if (mFocusedItemView != null) {

mFocusedItemView.onRequireTouchEvent(event);

}

return true;

}

再看SlideView.java:

public class SlideView 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 = 120;

private int mLastX = 0;

private int mLastY = 0;

private static final int TAN = 2;

private boolean isScroller=false;//是否已经滑动

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 SlideView(Context context) {

super(context);

initView();

}

public SlideView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

private void initView() {

mContext = getContext();

mScroller = new Scroller(mContext);

setOrientation(LinearLayout.HORIZONTAL);

View.inflate(mContext, R.layout.slide_view_merge, this);

mViewContent = (LinearLayout) findViewById(R.id.view_content);

mHolderWidth = Math.round(TypedValue.applyDimension(

TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()

.getDisplayMetrics()));

}

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(isScroller){

this.shrink();

}else{

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;

}

if(isScroller){

this.shrink();

isScroller=false;

}else{

this.smoothScrollTo(newScrollX, 0);

if (mOnSlideListener != null) {

mOnSlideListener.onSlide(this,

newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF
OnSlideListener.SLIDE_STATUS_ON);

}

isScroller=true;

}

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();

}

}

上述代码做了很详细的说明,这就是滑动控件的完整代码,大家要明白的是:你所添加的view都是加在SlideView的子View : view_content中的,而不是直接加在SlideView中,只有这样我们才方便做滑动效果。

最后一步我们来看看适配器里面的代码:

public class Carpa_MySelf_MessageCenterAdapter extends BaseAdapter implements OnSlideListener,OnClickListener{

private LayoutInflater inflater;

private List messages;

private Context context;

private SlideView mSlideView;

private int position;//删除位置数据

private Handler handler;

public Carpa_MySelf_MessageCenterAdapter(Context context,ArrayList messages,Handler handler){

setData(messages);

this.context=context;

inflater=LayoutInflater.from(context);

this.handler=handler;

}

public void setData(ArrayList messages){

if(messages==null){

this.messages=new ArrayList();

}else{

this.messages=messages;

}

}

public void setPosition(int position){

this.position=position;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return messages.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return messages.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

SlideView slideView = (SlideView) convertView;

if (slideView == null) {

View itemView = inflater.inflate(R.layout.carpa_myself_message_center_item, null);

slideView = new SlideView(context);

slideView.setContentView(itemView);

holder = new ViewHolder(slideView);

slideView.setOnSlideListener(Carpa_MySelf_MessageCenterAdapter.this);

slideView.setTag(holder);

} else {

holder = (ViewHolder) slideView.getTag();

}

Message msgMessage=messages.get(position);

msgMessage.setSlideView(slideView);

msgMessage.getSlideView().shrink();

String sourceString=msgMessage.getSourceStr();

holder.tvContent.setText(“内容:”+msgMessage.getContentStr());

holder.tvTime.setText(UtilTools.fromatDate(msgMessage.getTimeStr()));

holder.deleteHolder.setOnClickListener(Carpa_MySelf_MessageCenterAdapter.this);

if(sourceString.equals(“Traffic”)){

holder.tvSource.setText(“信息来源:66”);

holder.iView.setBackgroundResource(R.drawable.carpa_wz);

}else if(sourceString.equals(“DaiJia”)){

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
[外链图片转存中…(img-JhHCCRhj-1715433415723)]
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

[外链图片转存中…(img-gva398nK-1715433415724)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-FF5nE4xl-1715433415725)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值