最近朋友要我帮忙,做像QQ那样横向拉动显示删除的按钮做操作。
思路:写一个Item的容器,比屏幕宽度宽按钮的宽度(自定义),当时横向拉动的时候请求父控件不拦截触摸事件。下面直接上原代码,代码中注释详细,请看代码。
import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.LinearLayout; /** * Created by 小辉 on 2017/3/21. * @des: * 此控件为LinearLayout加长型,加长的长度为原来的1/4,所以控件可分5份, * 控件设置为match_parent,那这边的4份为显示,剩余的一份超出屏幕为隐藏 * 滑动效果已经监听,可按手指滑动来显示隐藏部分。 */ public class ItemView extends LinearLayout{ private int width;//控件的宽度 private int height;//控件的高度 private boolean needShowItem=true;//删除键是否显示true没显示,需要显示 private float x,down_X,count;//x为控件移动前的位置,count为移动的距离 public ItemView(Context context, AttributeSet attrs) { super(context, attrs); } public ItemView(Context context) { this(context,null); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = MeasureSpec.getSize(widthMeasureSpec);//计算出来的宽高 height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension((width*5/4), height);//加长宽度四分之一(可以自定义长度) x=getX(); } @Override public boolean onTouchEvent(MotionEvent event) { // getParent().requestDisallowInterceptTouchEvent(true); int action = event.getAction(); float my_width=getWidth();//这是加宽1/4后的长度 switch (action){ case MotionEvent.ACTION_DOWN: down_X=event.getX();//点击下去的坐标 break; case MotionEvent.ACTION_MOVE: count=event.getX()-down_X;//移动的距离 if(count>5||count<-5){ //横向滑动 定义为5摸索出来的 getParent().requestDisallowInterceptTouchEvent(true); //当不显示删除的时候,只响应往左拉,也就是count<0 if(needShowItem&&count<0){ if(count<(-my_width/5)){ //超出控件位置,防止拉出空白 setX(x + (-my_width/5)); }else{ setX(x + count); } } //当显示删除的时候,只响应往右拉,也就是count>0 if(!needShowItem&&count>0){ if(count>my_width/5){ //超出控件位置,防止拉出空白 setX(x + my_width/5); }else { setX(x + count); } } } break; case MotionEvent.ACTION_UP: if(needShowItem){ // 删除未显示状态,拉出超过一半删除控件的位置,则显示删除 if(count<(-my_width/10)){ //往左偏移1/5的宽度,拉出删除 setX(x-(my_width/5)); x=getX(); //已显示状态,改变需要显示状态为false needShowItem=false; }else{ //拉出距离不够删除控件一半位置 ,回到原来的位置 setX(x); } }else { if(count>(my_width/10)){ setX(x+(my_width/5)); x=getX(); //删除键消失,改变需要显示状态为true needShowItem=true; }else{ setX(x); } } getParent().requestDisallowInterceptTouchEvent(false); break; } return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } }
请尊重他人成果,复制内容请注明出处!
忘记教你们使用了,这个就是一个容易view,继承LinearLayout,直接当做一个LinearLayout使用就可以了,宽度为权重分布。以此view为例,这控件为5份,屏幕显示部分为4份,多余一份可以做功能按钮(删除或者其他),多余的一份是隐藏在屏幕右边,触摸时间已经完成,直接在Adapter里面做隐藏按钮的点击事件就OK了!