今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个删除的事件,在事件中进行删除当选行的元素,刷新listview。
一共分为以下几步进行:
1、新建一个按钮的布局文件,用来作为动态添加的按钮:layout_button.xml
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android" android:text="删除" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn1"/>
2、定义按钮显示,隐藏的动画效果,简单的缩放动画:
btn_hide.xml:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale="1.0" android:toXScale="0" android:fromYScale="1.0" android:toYScale="1.0" android:pivotX="100%" android:pivotY="0" android:duration="200" />
btn_show.xml:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale="0" android:toXScale="1.0" android:fromYScale="1.0" android:toYScale="1.0" android:pivotX="100%" android:pivotY="0" android:duration="200" />
3、自定义ListView,继承自listView,并实现OnTouchListener,OnGestureListener接口,代码就不一步一步写了,里面我尽可能的注释详细一些:MyListView.java
package com.example.viewtest;
import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.ListView; import android.widget.RelativeLayout; /** * 项目名称:viewTest * 实现功能: 自定义ListView,增加滑动删除功能 * 类名称:MyListView * 类描述:(该类的主要功能) * 创建人:徐纪伟 * E-mail: [email protected] * 创建时间:2014年11月2日 下午3:37:40 * 修改人: * 修改时间: * 修改备注: * @version */ public class MyListView extends ListView implements OnTouchListener,OnGestureListener { /** * 手势识别类 */ private GestureDetector gestureDetector; /** * 滑动时出现的按钮 */ private View btnDelete; /** * listview的每一个item的布局 */ private ViewGroup viewGroup; /** * 选中的项 */ private int selectedItem; /** * 是否已经显示删除按钮 */ private boolean isDeleteShow; /** * 点击删除按钮时删除每一行的事件监听器 */ private OnItemDeleteListener onItemDeleteListener; /** * 构造函数,初始化手势监听器等 * @param context * @param attrs */ public MyListView(Context context, AttributeSet attrs) { super(context, attrs); gestureDetector = new GestureDetector(getContext(),this); setOnTouchListener(this); } public void setOnItemDeleteListener(OnItemDeleteListener onItemDeleteListener) { this.onItemDeleteListener = onItemDeleteListener; } @Override public boolean onTouch(View v, MotionEvent event) { //得到当前触摸的条目 selectedItem = pointToPosition((int)event.getX(), (int)event.getY()); //如果删除按钮已经显示,那么隐藏按钮,异常按钮在当前位置的绘制 if (isDeleteShow) { btnHide(btnDelete); viewGroup.removeView(btnDelete); btnDelete = null; isDeleteShow = false; return false; }else{ //如果按钮没显示,则触发手势事件 //由此去触发GestureDetector的事件,可以查看其源码得知,onTouchEvent中进行了手势判断,调用onFling return gestureDetector.onTouchEvent(event); } } @Override public boolean onDown(MotionEvent e) { //得到当前触摸的条目 if (!isDeleteShow) { selectedItem = pointToPosition((int)e.getX(), (int)e.getY()); } return true; }