这一篇文章主要实现随手指移动的菜单。效果如图。
在上一篇基础上,我们将Button改为Layout,那么,我们就可以使得TextView和图片一起显示,甚至可以实现更复杂的显示。
那么我们实现SwipeMenuView 继承LineLayout, 代码如下。基本上就是在初始化代码中添加一个TextView和一个图标。就这些而已。
/**
* Created by kankan on 2016/5/14.
*/
public class SwipeMenuView extends LinearLayout {
public SwipeMenuView(Context context) {
super(context);
init(context);
}
public SwipeMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
void init(Context context){
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
setOrientation(HORIZONTAL);
setLayoutParams(layoutParams);
TextView textView = new TextView(context);
textView.setText("hello");
textView.setTextColor(Color.RED);
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.mipmap.ic_launcher);
addView(textView);
addView(imageView);
}
}
在SwipeMenuLayout类里面生成一个SwipeMenuView对象替换Button对象。只改变了init函数,其它未变。编译就可以看到静态的图片文字列表了。
void init(Context context){
setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
SwipeMenuView swipeMenuView = new SwipeMenuView(context);
this.addView(swipeMenuView);
}
简单的菜单现在已经实现了,下一步实现菜单随着你的手指沿X轴运动。
在第一章里面已经实现了SwipeMenuListView类里面的手指移动响应,要想使得菜单跟着移动,要把这个响应引入到SwipeMenuLayout类里面。首先我们先看看SwipeMenuListView里面的onTouchEvent事件的函数,我们添加了SwipeMenuLayout对象的响应。
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!");
}
View view = getChildAt(0);
if(view instanceof SwipeMenuLayout){
mTouchView =(SwipeMenuLayout)view;
mTouchView.onSwipe(ev);
}
break;
}
return super.onTouchEvent(ev);
}
}
接下来我们转入SwipeMenuLayout类里面的onSwipe函数了。该函数里面我们实现在X方向将移动坐标设置为菜单的起点坐标。代码也很简单,如下。
public void onSwipe(MotionEvent event){
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
View view = getChildAt(0);
view.layout((int) event.getX(),view.getTop() , view.getRight(), view.getBottom());
Log.i(TAG,"the position of view is "+view.getTop()+" ;the position of x is "+event.getX()
+" ; the posistion of bottom is "+view.getBottom());
//view.layout(0,(int)(event.getX()), view.getRight(), view.getBottom());
break;
}
}
编译后,就可以说实现上面的效果了。
(本章完)点击打开链接
http://download.csdn.net/detail/nianhua120/9520049