标签:
今天研究了一下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: xujiwei558@126.com
* 创建时间: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;
}
@Override