做这个功能主要是项目需要:找了很多资料但是效果都不理想,后来就自己研究写了一个,拿出来共享给大家,贴上代码大家慢慢看看,还是比较容易懂的。
主要代码:
package com.zbq.widget; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.ListView; public class DelSlideListView extends ListView implements GestureDetector.OnGestureListener, View.OnTouchListener { private GestureDetector mDetector; private OnDeleteListioner mOnDeleteListioner; private int position; private float velocityX, velocityY; private ListViewonSingleTapUpListenner thisonSingleTapUpListenner; public DelSlideListView(Context context) { super(context); init(context); } public DelSlideListView(Context context, AttributeSet att) { super(context, att); init(context); } public void setDeleteListioner(OnDeleteListioner mOnDeleteListioner) { this.mOnDeleteListioner = mOnDeleteListioner; } public void setSingleTapUpListenner( ListViewonSingleTapUpListenner thisonSingleTapUpListenner) { this.thisonSingleTapUpListenner = thisonSingleTapUpListenner; } private int standard_touch_target_size = 0; private float mLastMotionX; public boolean deleteView = false; private ScrollLinerLayout mScrollLinerLayout; private boolean scroll = false; private int pointToPosition; private boolean listViewMoving; private boolean delAll = false; public boolean isLongPress = false; public boolean isDelAll() { return delAll; } public void setDelAll(boolean delAll) { this.delAll = delAll; } private void init(Context mContext) { mDetector = new GestureDetector(mContext, this); mDetector.setIsLongpressEnabled(false); standard_touch_target_size = (int) getResources().getDimension( R.dimen.delete_action_len); this.setOnTouchListener(this); } public boolean onDown(MotionEvent e) { if (thisonSingleTapUpListenner != null) { thisonSingleTapUpListenner.onSingleTapUp(); } mLastMotionX = e.getX(); pointToPosition = this.pointToPosition((int) e.getX(), (int) e.getY()); final int p = pointToPosition - this.getFirstVisiblePosition(); if (mScrollLinerLayout != null) { mScrollLinerLayout.onDown(); mScrollLinerLayout.setSingleTapUp(true); } if (deleteView && p != position) { deleteView = false; if (mScrollLinerLayout != null) { mScrollLinerLayout.snapToScreen(0); mScrollLinerLayout.setSingleTapUp(false); } position = p; scroll = false; return true; } isLongPress = false; position = p; scroll = false; listViewMoving = false; return false; } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { this.velocityX = velocityX; this.velocityY = velocityY; return false; } public void onLongPress(MotionEvent e) { } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (listViewMoving && !scroll) { if (mScrollLinerLayout != null) mScrollLinerLayout.snapToScreen(0); return false; } else if (scroll) { if (mScrollLinerLayout != null) { int deltaX = (int) (mLastMotionX - e2.getX()); if (deleteView) { deltaX += standard_touch_target_size; } if (deltaX >= 0 && deltaX <= standard_touch_target_size) { mScrollLinerLayout.scrollBy( deltaX - mScrollLinerLayout.getScrollX(), 0); } } } else { if (Math.abs(distanceX) > Math.abs(distanceY)) { final int pointToPosition1 = this.pointToPosition( (int) e2.getX(), (int) e2.getY()); final int p1 = pointToPosition1 - this.getFirstVisiblePosition(); if (p1 == position && mOnDeleteListioner.isCandelete(p1)) { mScrollLinerLayout = (ScrollLinerLayout) this .getChildAt(p1); if (mScrollLinerLayout != null) { int deltaX = (int) (mLastMotionX - e2.getX()); if (deleteView) { deltaX += standard_touch_target_size; } if (deltaX >= 0 && deltaX <= standard_touch_target_size && Math.abs(distanceY) < 5) { isLongPress = true; scroll = true; listViewMoving = false; mScrollLinerLayout.setSingleTapUp(false); mScrollLinerLayout.scrollBy( (int) (e1.getX() - e2.getX()), 0); } } } } } if (scroll) { return true; } return false; } public void onShowPress(MotionEvent e) { } public boolean onSingleTapUp(MotionEvent e) { if (deleteView) { position = -1; deleteView = false; mScrollLinerLayout.snapToScreen(0); scroll = false; return true; } return false; } public void setScroll(boolean b) { listViewMoving = b; } @Override public boolean onTouchEvent(MotionEvent event) { if (scroll || deleteView) { return true; } return super.onTouchEvent(event); } @Override public boolean onTouch(View v, MotionEvent event) { if (isDelAll()) { return false; } else { if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { int deltaX2 = (int) (mLastMotionX - event.getX()); if (scroll) { if (!deleteView && deltaX2 >= standard_touch_target_size / 2) { mScrollLinerLayout .snapToScreen(standard_touch_target_size); position = pointToPosition - this.getFirstVisiblePosition(); deleteView = true; } else { position = -1; deleteView = false; mScrollLinerLayout.snapToScreen(0); } scroll = false; return true; }/* else if (Math.abs(velocityX) > Math.abs(velocityY) && deltaX2 < -80) { mOnDeleteListioner.onBack(); return false; }*/ } return mDetector.onTouchEvent(event); } } public void deleteItem() { position = -1; deleteView = false; scroll = false; if (mScrollLinerLayout != null) { mScrollLinerLayout.snapToScreen(0); } } }
相关推荐
这个“Android 仿微信滑动删除效果demo源码”就是一个很好的学习资源,它可以帮助开发者实现类似微信的消息滑动删除功能。 首先,我们要了解滑动删除效果的核心机制。这一效果通常是通过在ListView、RecyclerView...
本教程将详细介绍如何在Android项目中实现“仿微信对话列表滑动删除效果”。 首先,我们需要理解滑动删除的核心原理。这种效果通常是通过在ListView或者RecyclerView等滚动视图上添加手势检测来实现的。当用户滑动...
综上所述,实现"Android 仿微信 ListView 滑动删除"的操作涉及多个技术点,包括手势检测、自定义Adapter、动画效果、事件处理以及可能的异步操作。通过这些技术的结合,我们可以创建一个功能丰富的、与微信类似的...
Android仿ios微信滑动删除、置顶的实现: 左划ListView的item,当前条目出现“删除”和“置顶”两个按钮,点击其他位置,按钮隐藏,点击“删除”,当前条目消失。点击“置顶”,当前条目显示在第一行
本篇文章将详细解析如何在Android中实现“android listview仿微信滑动删除”的功能。 首先,滑动删除(Swipe to Delete)是提高用户体验的一种方式,它允许用户通过简单的手势快速删除列表中的条目。在微信中,当...
在本教程中,我们将深入探讨如何在Android应用中复现“微信列表滑动出现删除、置顶效果”。 首先,我们需要了解该效果的核心技术点: 1. **SwipeRefreshLayout**:Android SDK提供了一个叫做SwipeRefreshLayout的...
总的来说,实现Android仿微信列表滑动删除的关键在于自定义`SwipeItemView`和`SwipeListView`,重写触摸事件处理,以及在滑动过程中进行精确的视图控制和动画效果。开发者可以根据实际需求调整代码细节,以适应不同...
在实际开发中,我们需要深入理解平台特性和UI组件,才能创建出既美观又实用的滑动删除体验。无论是Android还是iOS,都需要对系统的事件处理机制和动画框架有扎实的掌握,这样才能打造出与微信类似的流畅体验。
"Android ListView 仿微信侧滑删除"这个主题涉及到如何实现类似微信中常见的侧滑菜单功能,即用户在ListView的每一项上向左滑动时,会显示出一个包含删除按钮的视图,允许用户快速删除列表中的某一项。下面我们将...
以上就是实现Android仿QQ、微信滑动删除功能的基本步骤和技术要点。在实际开发中,可以根据项目需求进行调整和定制,比如添加更多动画效果,或者结合其他交互元素,使功能更加丰富和人性化。在SlideViewDemo中,你...
在Android开发中,微信和QQ等社交应用的交互设计经常被其他开发者借鉴,其中就包括在ListView中实现滑动显示删除或修改按钮的功能。这个功能不仅提升了用户体验,也让操作更加直观便捷。本教程将详细讲解如何实现这...
在Android应用开发中,微信的语音对讲功能是一种常见的交互方式,它允许用户通过按住按钮来录制语音,松开时发送,或者在录制过程中上滑取消。这个功能的实现涉及多个技术点,包括音频录制、手势识别以及UI交互设计...
在Android开发中,微信对话列表滑动删除功能是一项常见的用户交互设计,它为用户提供了一种高效、直观的方式来管理他们的聊天记录。实现这个功能主要涉及到ListView或者RecyclerView组件的自定义适配器以及手势检测...
Android界面UI侧滑方面的源码实例,这个是仿微信好友列表的滑动删除功能,在此基础上增加了可定义 SlideListViewDelete的功能。运行后,在模拟器上拖动任意一个列表项向左滑,右侧会出现“删除”功能,是不是觉得很...
总的来说,实现一个"Android开发,仿微信选择图片的图片选择器"需要综合运用Android SDK的多种功能,结合现代开发最佳实践,如模块化、依赖注入、异步处理等,确保功能的稳定性和用户体验。同时,测试代码(如...
在Android开发中,实现类似微信对话列表的滑动删除效果是一项常见的需求,它能提供用户友好的交互体验。本文将详细介绍如何在Android中高仿微信对话列表的滑动删除功能。 首先,我们要创建一个可滑动的ListView。在...
同时,可以使用`OnTouchListener`来监听整个输入框的触摸事件,以便处理滑动删除、确认等操作。 3. **数字键盘**:可以使用系统自带的软键盘,也可以自定义一个数字键盘。自定义键盘可以通过弹出`Dialog`或者`...
总的来说,实现“Android仿微信对话列表滑动删除效果”涉及到自定义ListView、监听触摸事件、计算滑动距离、以及执行动画等多方面的技术。通过这种方式,开发者可以为自己的应用添加类似微信的交互体验,提高用户的...
在仿微信聊天置顶的场景中,我们可以使用`LinkedList`来存储用户的聊天记录,因为它的插入和删除操作相对高效,特别是对于头部元素的操作,这正好符合置顶聊天的需求。 接着,我们探讨如何实现UI部分。在Android中...