ListView 实现Item横向拉动,解决与listView触摸冲突问题

最近朋友要我帮忙,做像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了!

转载于:https://my.oschina.net/u/3367433/blog/866042

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值