在Android开发中 自定义view不可避免的事情,那么实现有三种方式,分别是:组合控件、自绘控件和继承控件。
下面就主要讲解继承控件
就是继承目前自己有的控件,从而创建新控件,保留继承的父控件的特性,并且还可以引入自己想要的新特性。下面就以一个简单的支持横向滑动删除Item的自定义ListView的例子来介绍一些继承view的实现。
1首先创建一个删除按钮布局delete_btn.xml,这个布局是在横向滑动列表Item后显示的view。
具体的xml代码如下
<Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#eeeeee" android:padding="5dp" android:text="删除" android:textColor="#ff0000" android:textSize="16sp"></Button>
2、创建Delete ListView类,继承自ListView,并实现了OnTouchListener和OnGestureListener接口:
public class DeleteListView extends ListView implements View.OnTouchListener, GestureDetector.OnGestureListener { //手势探测 private GestureDetector mGestureDetector; private DeleteItemListener deleteItemListener; // 删除按钮 private View mDeleteBtn; // list列表item的布局 private ViewGroup mItemLayout; // 选择的列表item private int mSelectedItem; // 当前删除按钮是否显示出来了 private boolean isDeleteShown; public interface DeleteItemListener { void deleteItemListener(int index); } public DeleteListView(Context context) { super(context); } public DeleteListView(Context context, AttributeSet attrs) { super(context, attrs); // 创建手势监听器对象 mGestureDetector = new GestureDetector(getContext(), this); // 监听onTouch事件 setOnTouchListener(this); } public void setDeleListener(DeleteItemListener listener) { deleteItemListener = listener; } @Override public boolean onTouch(View v, MotionEvent event) { if (isDeleteShown) { hideDeleteBtn(); return false; } else { return mGestureDetector.onTouchEvent(event); } } @Override public boolean onDown(MotionEvent e) { if (!isDeleteShown) { mSelectedItem = pointToPosition((int) e.getX(), (int) e.getY()); } return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float x, float y) { // 如果当前删除按钮没有显示出来,并且x方向滑动的速度大于y方向的滑动速度 if (!isDeleteShown && Math.abs(x) > Math.abs(y)) { mDeleteBtn = LayoutInflater.from(getContext()).inflate( R.layout.delete_btn, null); mDeleteBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mItemLayout.removeView(mDeleteBtn); hideDeleteBtn(); isDeleteShown = false; deleteItemListener.deleteItemListener(mSelectedItem); } }); mItemLayout = (ViewGroup) getChildAt(mSelectedItem - getFirstVisiblePosition()); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.addRule(RelativeLayout.CENTER_VERTICAL); mItemLayout.addView(mDeleteBtn, params); isDeleteShown = true; } return false; } public boolean deleteBtnIsShow() { return isDeleteShown; } public void hideDeleteBtn() { mItemLayout.removeView(mDeleteBtn); mDeleteBtn = null; isDeleteShown = false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { }3在界面上的引用就很簡單了,当然这是一个很简单的demo,没有做深入的详细写,只是描述一下做一个滑动显示删除按钮的listview的简单view,希望可以帮到大家。关于手势的操作,在ondown的时候获取到那个item不要拦截掉,ontouch的时候获取到当前的显示状态,做相关操作,在faling的时候,判断下x轴上滑动的距离比较y轴上的距离,根据当前的显示状态,动态的添加上这个删除的按钮,点击事件回调出去,删除这一个item。