Android仿腾讯QQ实现滑动删除 附源码下载

看了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开始写Blog,给大家分享自己的心得。

先看看效果图:

本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示。但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制。所以决定继承ListView然后结合PopupWindow。

首先是布局文件:

delete_btn.xml:这里只需要一个Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical" >
  <Button
  android:id="@+id/id_item_btn"
  android:layout_width="60dp"
  android:singleLine="true"
  android:layout_height="wrap_content"
  android:text="删除"
  android:background="@drawable/d_delete_btn"
  android:textColor="#ffffff"
  android:paddingLeft="15dp"
  android:paddingRight="15dp"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:layout_marginRight="15dp"
  />
</LinearLayout> 

主布局文件:activity_main.xml,ListView的每个Item的样式直接使用了系统的android.R.layout.simple_list_item_1

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

 <com.example.listviewitemslidedeletebtnshow.QQListView
  android:id="@+id/id_listview"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" >
 </com.example.listviewitemslidedeletebtnshow.QQListView>

</RelativeLayout>

接下来看看QQListView的实现:

package com.example.listviewitemslidedeletebtnshow;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;

public class QQListView extends ListView
{

 private static final String TAG = "QQlistView";

 // private static final int VELOCITY_SANP = 200;
 // private VelocityTracker mVelocityTracker;
 /**
 * 用户滑动的最小距离
 */
 private int touchSlop;

 /**
 * 是否响应滑动
 */
 private boolean isSliding;

 /**
 * 手指按下时的x坐标
 */
 private int xDown;
 /**
 * 手指按下时的y坐标
 */
 private int yDown;
 /**
 * 手指移动时的x坐标
 */
 private int xMove;
 /**
 * 手指移动时的y坐标
 */
 private int yMove;

 private LayoutInflater mInflater;

 private PopupWindow mPopupWindow;
 private int mPopupWindowHeight;
 private int mPopupWindowWidth;

 private Button mDelBtn;
 /**
 * 为删除按钮提供一个回调接口
 */
 private DelButtonClickListener mListener;

 /**
 * 当前手指触摸的View
 */
 private View mCurrentView;

 /**
 * 当前手指触摸的位置
 */
 private int mCurrentViewPos;

 /**
 * 必要的一些初始化
 *
 * @param context
 * @param attrs
 */
 public QQListView(Context context, AttributeSet attrs)
 {
 super(context, attrs);

 mInflater = LayoutInflater.from(context);
 touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

 View view = mInflater.inflate(R.layout.delete_btn, null);
 mDelBtn = (Button) view.findViewById(R.id.id_item_btn);
 mPopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT,
 LinearLayout.LayoutParams.WRAP_CONTENT);
 /**
 * 先调用下measure,否则拿不到宽和高
 */
 mPopupWindow.getContentView().measure(0, 0);
 mPopupWindowHeight = mPopupWindow.getContentView().getMeasuredHeight();
 mPopupWindowWidth = mPopupWindow.getContentView().getMeasuredWidth();
 }

 @Override
 public boolean dispatchTouchEvent(MotionEvent ev)
 {
 int action = ev.getAction();
 int x = (int) ev.getX();
 int y = (int) ev.getY();
 switch (action)
 {

 case MotionEvent.ACTION_DOWN:
 xDown = x;
 yDown = y;
 /**
 * 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的touch事件的下传
 */
 if (mPopupWindow.isShowing())
 {
 dismissPopWindow();
 return false;
 }
 // 获得当前手指按下时的item的位置
 mCurrentViewPos = pointToPosition(xDown, yDown);
 // 获得当前手指按下时的item
 View view = getChildAt(mCurrentViewPos - getFirstVisiblePosition());
 mCurrentView = view;
 break;
 case MotionEvent.ACTION_MOVE:
 xMove = x;
 yMove = y;
 int dx = xMove - xDown;
 int dy = yMove - yDown;
 /**
 * 判断是否是从右到左的滑动
 */
 if (xMove < xDown && Math.abs(dx) > touchSlop && Math.abs(dy) < touchSlop)
 {
 // Log.e(TAG, "touchslop = " + touchSlop + " , dx = " + dx +
 // " , dy = " + dy);
 isSliding = true;
 }
 break;
 }
 return super.dispatchTouchEvent(ev);
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev)
 {
 int action = ev.getAction();
 /**
 * 如果是从右到左的滑动才相应
 */
 if (isSliding)
 {
 switch (action)
 {
 case MotionEvent.ACTION_MOVE:

 int[] location = new int[2];
 // 获得当前item的位置x与y
 mCurrentView.getLocationOnScreen(location);
 // 设置popupWindow的动画
 mPopupWindow.setAnimationStyle(R.style.popwindow_delete_btn_anim_style);
 mPopupWindow.update();
 mPopupWindow.showAtLocation(mCurrentView, Gravity.LEFT | Gravity.TOP,
  location[0] + mCurrentView.getWidth(), location[1] + mCurrentView.getHeight() / 2
  - mPopupWindowHeight / 2);
 // 设置删除按钮的回调
 mDelBtn.setOnClickListener(new OnClickListener()
 {
  @Override
  public void onClick(View v)
  {
  if (mListener != null)
  {
  mListener.clickHappend(mCurrentViewPos);
  mPopupWindow.dismiss();
  }
  }
 });
 // Log.e(TAG, "mPopupWindow.getHeight()=" + mPopupWindowHeight);

 break;
 case MotionEvent.ACTION_UP:
 isSliding = false;

 }
 // 相应滑动期间屏幕itemClick事件,避免发生冲突
 return true;
 }

 return super.onTouchEvent(ev);
 }

 /**
 * 隐藏popupWindow
 */
 private void dismissPopWindow()
 {
 if (mPopupWindow != null && mPopupWindow.isShowing())
 {
 mPopupWindow.dismiss();
 }
 }

 public void setDelButtonClickListener(DelButtonClickListener listener)
 {
 mListener = listener;
 }

 interface DelButtonClickListener
 {
 public void clickHappend(int position);
 }

}

代码注释写得很详细,简单说一下,在dispatchTouchEvent中设置当前是否响应用户滑动,然后在onTouchEvent中判断是否响应,如果响应则popupWindow以动画的形式展示出来。当然屏幕上如果存在PopupWindow则屏幕ListView的滚动与Item的点击,以及从右到左滑动时屏幕Item的click事件。

接下来是MainActivity.java,这里代码很简单不做介绍了。

package com.example.listviewitemslidedeletebtnshow;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;

import com.example.listviewitemslidedeletebtnshow.QQListView.DelButtonClickListener;

public class MainActivity extends Activity
{
 private QQListView mListView;
 private ArrayAdapter<String> mAdapter;
 private List<String> mDatas;

 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 mListView = (QQListView) findViewById(R.id.id_listview);
 // 不要直接Arrays.asList
 mDatas = new ArrayList<String>(Arrays.asList("HelloWorld", "Welcome", "Java", "Android", "Servlet", "Struts",
 "Hibernate", "Spring", "HTML5", "Javascript", "Lucene"));
 mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);
 mListView.setAdapter(mAdapter);

 mListView.setDelButtonClickListener(new DelButtonClickListener()
 {
 @Override
 public void clickHappend(final int position)
 {
 Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();
 mAdapter.remove(mAdapter.getItem(position));
 }
 });

 mListView.setOnItemClickListener(new OnItemClickListener()
 {
 @Override
 public void onItemClick(AdapterView<?> parent, View view, int position, long id)
 {
 Toast.makeText(MainActivity.this, position + " : " + mAdapter.getItem(position), 1).show();
 }
 });
 }
}

楼主使用asm.jar以及gifcamera截的gif,由于button的动画很短感觉截图效果很卡不流畅,大家有什么好的截图,还望推荐。

有兴趣的还是下载源码看看效果,源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android App中ListView仿QQ实现滑动删除效果的要点解析

    本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

  • Android使用SwipeListView实现类似QQ的滑动删除效果

    QQ的滑动删除效果很不错,要实现这种效果,可以使用SwipeListView. 1. 下载com.fortysevendeg.swipelistview这个项目(以前GitHub上有,现在GitHub上没有了,百度了很多次才下载到的),导入Eclipse,右键单击,选择Properties->Android,选中Library下面的IsLibrary. 2. 新建一个项目MySwipeListView,加入SwipeListView这个库. 3. 在主窗体里面放入一个SwipeListView控

  • 类似于QQ的右滑删除效果的实现方法

    原理:删除的div在窗口的外面,用户看不到,用户右滑,显示次div <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@

  • Android仿腾讯QQ实现滑动删除 附源码下载

    看了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开始写Blog,给大家分享自己的心得. 先看看效果图: 本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0"

  • Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

  • 基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)

    基于jQuery实现仿搜狐辩论投票动画代码 ,一款个性的卡通小人正方反方辩论投票特效代码.移动动画效果平滑自然.具有非常好的用户体验.该源码兼容目前最新的各类主流浏览器. 效果演示   源码下载 html代码: <script type="text/javascript"> $(document).ready(function () { var a = 500; var b = 130; $("#white").animate({ width: 0, l

  • Android编程实现画板功能的方法总结【附源码下载】

    本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas.第一种方式的思路是,创建一个自定义View(推荐SurfaceView),在自定义View里通过Path对象记录手指滑动的路径调用lineTo()绘制:第二种方式的思路是,先用Canvas绘制一张空的Bitmap,通过ImageView的setImageBitmap()方

  • jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)

    今天我们继续内容滑动切换效果的第二部分讲解.如今我们的web开发都要适应移动设备,就是说我们的web页面要在移动设备如手机端也能正常访问,所以我将第一部分的基本切换效果做了加强,增加了响应式和触控滑动效果. 效果展示    源码下载 本文是hwSlider-内容滑动切换效果的第二部分,演示DEMO都是基于第一部分内容的基础上的,所以,如果您还没阅读过第一部分的话,请先移步参阅:基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一) 响应式 什么是响应式设计,这里我就不描述了.

  • 基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)

    内容滑动切换应用非常广,常见的有幻灯片焦点图.画廊切换等.随着WEB前端技术的广泛应用,内容滑动切换效果占据着web页面重要地位,因此本站Helloweba特别给广大前端爱好者安排了浅显易懂的内容滑动切换效果的开发教程. 先给大家展示下效果图,感觉还不错请参数实现代码,具体效果如下所示: 效果展示      源码下载 本次教程分三个部分: 1.使用jQuery开发基本的内容滑动切换效果, 2.支持移动端触控自适应的内容滑动切换效果, 3.封装内容滑动切换效果jQuery插件. 本文讲解第一部分,

  • Android编程实现滑动开关组件功能【附源码下载】

    本文实例讲述了Android编程实现滑动开关组件功能.分享给大家供大家参考,具体如下: 由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果. 这里有一个示例代码,它包括三个类:开关组件视图.状态监听接口.MainActivity 我们先来看看整个demo的效果图: 我们先来看看视图组件的完整代码,代码都已经注释: package com.bear.swtichbuttondemo; import java.util.ArrayList; i

  • 基于Jquery实现仿百度百科右侧导航代码附源码下载

    先给大家展示下效果图,看看是不是亲想要实现的效果,如果还满意的话请查看本文详情,同时大家也可以下载源码哦. 效果图: 效果展示  源码下载 代码说明: 仿百度百科右侧导航代码jquery插件,这个仿百科右侧导航js代码,在很久以前就像搞个用了,因为这个导航特别适合长篇文档使用,花了半天时间写了这个仿百科导航插件,不过和百度百科比起来还是有点弱,没有实现右侧导航区域滚动的功能,如果您的文档不是超级变态长,应该够用. 如果你的导航超级长,可能要用到侧边导航页可以滚动,一般情况下还是用不到,等过些时候

  • avalon js实现仿google plus图片多张拖动排序附源码下载

    源码下载:http://xiazai.jb51.net/201509/yuanma/drag_sort1(jb51.net).rar 效果展示如下: google plus 拖动+响应式效果: 要求 1. 两边对齐布局,即图片间间距一致,但左右两边的图片与边界的间距不一定等于图片间间距,兼容ie7,8,firefox,chrome. 2. 浏览器尺寸变化,在大于一定尺寸时,每行自动增加或减少图片,自动调整图片间间距,以满足两边对齐布局,这时每张图片尺寸固定(这里是200*200px):而小于一定

  • Jquery左右滑动插件之实现超级炫酷动画效果附源码下载

    分享一款基于jQuery超级酷动画滑动插件.这是一款基于jquery.pogo-slider插件实现的多个滑块切换特效.效果图如下,如果大家觉得还不错,很满意可以下载源码哦. 效果展示     源码下载 实现的代码. html代码: <div class="pogoSlider" id="js-main-slider"> <div class="pogoSlider-slide" data-transition="sl

随机推荐