上一篇文章说了该控件继承ListView项目,数据基本不用管理了。那么我们就需要实现滑动弹出菜单内这个功能。而这个功能就需要坚持手指移动的事件。
要实现这个功能其实,很简单就是Override OnTouchEvent。 通过下面的代码我们就可以实现手指移动事件的监测了。
package io.github.nianhua110.myswipemenulistview;
import android.content.Context;
import android.graphics.Point;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.widget.ListAdapter;
import android.widget.ListView;
/**
* Created by kankan on 2016/5/10.
*/
public class MySwipeMenuListView extends ListView {
String TAG = this.getClass().getSimpleName();
private int MAX_Y = 5;
private int MAX_X = 3;
private float mDownX ;
private float mDownY;
public MySwipeMenuListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MySwipeMenuListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MySwipeMenuListView(Context context) {
super(context);
init();
}
@Override
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
}
void init(){
MAX_X = dp2dx(MAX_X);
MAX_Y = dp2dx(MAX_Y);
Log.i(TAG, "max_x is"+MAX_X + " max_y is "+MAX_Y);
}
private int dp2dx(int dp){
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
int tempHeight = displayMetrics.heightPixels;
int tempWidth = displayMetrics.widthPixels;
float temp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
Log.i(TAG, "height pixels is " + tempHeight + " width pixels is " + tempWidth);
return (int)temp;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// return true;
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getY();
Log.i(TAG, "down x is "+mDownX + " down y is "+ mDownY);
case MotionEvent.ACTION_MOVE:
float dx=Math.abs(mDownX- ev.getX());
float dy = Math.abs(mDownY - ev.getY());
Log.i(TAG, "on touch move x "+ev.getX() +" y "+ev.getY());
Log.i(TAG, "dx "+dx+" dy "+dy);
if(dx > MAX_X){
Log.i(TAG, "enough offset!");
}
break;
}
return super.onTouchEvent(ev);
}
}
滑动手指后该干嘛呢,那就是显示菜单了。怎么显示才菜单呢,我们查看一下作者的思路,作者的ACTON_MOVE 下面有个
mTouchView.onSwipe(ev);
函数,mTouchView的类是SwipeMenuLayout 该类 FragmentLayout的子类,FrameLayout就是显示的类,那么我们接下来分析一个这个类吧。
下一篇文章在分析吧。这一篇的源码点击下载