仿QQ聊天Listview横向拖动删除等操作

来源:互联网 发布:如何学好c语言 编辑:程序博客网 时间:2024/05/23 18:48

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 您上传的图片大小超过3M怎么办 两个人打架被拍视频上传了怎么办 小米手机打开后一直出现英文怎么办 百度云分享文件含有违规内容怎么办 百度网盘下载说本地空间不足怎么办 绘声绘影X9将滤镜拖到视频怎么办 苹果手机中间的按钮没用了怎么办? 图片怎么发的在百度里面应该怎么办 学java刚看的视频就忘了怎么办 qq上传照片一直显示排队中怎么办 微信支付不小心重复付款怎么办 学习通上传视频时 文件过大怎么办 电脑死机了怎么办 也不能关机了 还没发货淘宝退款卖家不处理怎么办 还没发货申请退款卖家不处理怎么办 快递写错电话被更改收货信息怎么办 货在派送中快递地址填错了怎么办 老板损坏了你保管的器材怎么办 闲鱼买家说不合适要退货怎么办 日本邮便局的单号我忘了怎么办 小米盒子自带播放器被删除了怎么办 在电视上装了央视影音要升级怎么办 用现金支付货款没有了证据怎么办 楚楚街不发货客服不理人怎么办 厨房那面墙借用别人的怎么办 天猫买东西商家不给发货怎么办 在唯品会上买的水果坏了怎么办 美团极速退款后商家仍然送餐怎么办 我的拼多多商家密码忘了怎么办 特约金服扣款连续扣了两次怎么办? 拼多多拒绝退款联系客服退款怎么办 镇江新设名称申报中字号怎么办 创维电视只有声音没有图像怎么办 京东E卡有密码忘记卡号怎么办? 香香鞋上的饰品老掉怎么办 联壁金融资金冻结提现不出来怎么办 联壁金融提现不到帐怎么办 联壁金融提现迟迟不到帐怎么办 客户说平安福现金价值低怎么办 2个月宝宝肚脐凸出来怎么办 西安华润万家预付卡丢了怎么办