【Android】滑动确认的按钮

需求:部分场景下,防止用户误操作触发按钮,通过滑动的方式完成用户的点击事件。

向右滑动中图片

自定义组件实现思路:
1、定义一View组件,该组件可以通过手势拖动在其父类组件上滑动。
2、定义一ViewGroup组件。初始化时,该组件被View组件完全覆盖。

自定义组件实现:

1、实现组件SlideCover(上方完全覆盖的View):

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize= MeasureSpec.getSize(widthMeasureSpec);
            int heightSize= MeasureSpec.getSize(heightMeasureSpec);
            int widthMode= MeasureSpec.getMode(widthMeasureSpec);
            int heightMode= MeasureSpec.getMode(heightMeasureSpec);
            if(heightMode== MeasureSpec.AT_MOST){//如果是wrap_content布局以字体的高度作为控件高度
                setMeasuredDimension(MeasureSpec.makeMeasureSpec(widthSize, widthMode), MeasureSpec.makeMeasureSpec((int) (fontMetrics.bottom - fontMetrics.top) + coverPadding * 2, heightMode));
            }else {
                setMeasuredDimension(MeasureSpec.makeMeasureSpec(widthSize, widthMode), MeasureSpec.makeMeasureSpec(heightSize + coverPadding * 2, heightMode));
            }

        }
 protected void onDraw(final Canvas canvas) {
            super.onDraw(canvas);
            //计算文字中心点高度
            float height=  getMeasuredHeight() / 2-fontMetrics.top/2-fontMetrics.bottom/2;
            //绘制箭头
            canvas.drawText(">>>>", getMeasuredWidth() * left_margin, height, paint);
            if(null!=coverText){
                canvas.drawText(coverText, getMeasuredWidth() / 2,height, paint);
            }
        }

拖动事件:

public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction()== MotionEvent.ACTION_DOWN){//手指按下后的点击事件
                xTouch=event.getRawX();
            }else if(event.getAction()== MotionEvent.ACTION_MOVE){//移动中的点击事件
                xSlideOffset=event.getRawX()-xTouch;
                update();
            }else if(event.getAction()== MotionEvent.ACTION_UP){
                finish();
            }
            return true;
        }

2.SlideButton实现
属性定义

  //viewgroup背景的颜色
    private int bgColor;
    //viewgroup的字体大小
    private int bgTextsize;
    //viewgroup的文字内容
    private String bgText;
    //viewgroup的文字颜色
    private int bgTextColor;
    //当移动到哪个位置时结束
    private float offSetFinish;
    //SlideCover的背景颜色
    private Drawable coverBackground;
    //SlideCover的字体大小
    private int coverTextsize;
    //SlideCover的字体内容
    private String coverText;
    //SlideCover的字体颜色
    private int coverTextColor;
    //SlideCover的字体Padding
    private int coverPadding=0;
    /**
     * 绘制paint
     */
    private Paint bgPaint;
    /**
     * viewgourp的字体测量参数
     */
    private Paint.FontMetrics bgFontMetrics;
    /**
     * 子控件
     */
    private SlideCover slideCover;

    /**
     * slideCover点下去的坐标
     */
    private float xTouch=0;
    /**
     * slideCover滑动时的偏移量
     */
    private float xSlideOffset=0;
    /**
     * 滑动监听
     */
    private SlideListner slideListner;
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //测量子控件
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        //获取子控件slideCover
        SlideCover slideCover= (SlideCover) getChildAt(0);
        setMeasuredDimension(slideCover.getMeasuredWidth(),slideCover.getMeasuredHeight());
    }
protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //判断偏移量是否小于零,小于零偏移量设为0,否则会向左移动
        if(xSlideOffset<0){
            xSlideOffset=0;
        }else  if(xSlideOffset>getMeasuredWidth()){
            xSlideOffset=getMeasuredWidth();
        }
        //子控件位置
        slideCover.layout((int)(0+xSlideOffset),0,(int)(getMeasuredWidth()+xSlideOffset),getMeasuredHeight());
    }
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        bgPaint.setColor(bgColor);
        //绘制矩形
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), bgPaint);
        bgPaint.setColor(bgTextColor);
        //绘制文字
        float height=  getMeasuredHeight() / 2-bgFontMetrics.top/2-bgFontMetrics.bottom/2;
        if(bgText!=null){
            canvas.drawText(bgText, getMeasuredWidth() / 2,height, bgPaint);
        }

    }

每次slidecover控件拖动时需要调用slidebutton的requestLayout方法,实现拖动的展示效果。

代码下载 https://github.com/lyz00107/SlideButton

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中,滑动删除(Swipe to Delete)是一种常见的列表视图交互方式,允许用户在查看列表项时,通过滑动到某一特定区域(通常在列表项的右侧或底部)并点击某个确认删除的提示图标来移除该条数据。这种设计常见于邮件应用、联系人管理等场景。 以下是实现滑动删除的基本步骤: 1. **在布局上设置**:使用RecyclerView而不是ListView,因为它支持更好的滚动和自定义布局。为每个列表项添加一个可点击的布局,可能包括一个主内容区域和一个可滑动的删除区域。 2. **创建Adapter**:自定义Adapter继承自`RecyclerView.Adapter`,并在`onBindViewHolder`方法中设置滑动删除的触摸监听器。 3. **触摸监听器**:在ViewHolder中添加一个OnTouchListener,当手指在删除区域滑动时,开始跟踪手指的位置,并在抬起手指时检查是否满足滑动删除的条件(比如滑动距离超过一定的阈值)。 4. **删除逻辑**:如果滑动删除被确认,调用`notifyItemRemoved(position)`通知Adapter更新列表,然后从数据库或源数据结构中移除对应的条目。 5. **长按删除**:另一种常见做法是长按列表项后弹出一个确认对话框,提供清除的选项。 6. **处理动画**:滑动删除时通常会有动画效果,比如渐隐或缩放删除按钮,以及数据从列表中移除时的视觉变化。 相关问题-- 1. 如何在RecyclerView中启用滑动删除功能? 2. Android滑动删除是如何处理数据同步的? 3. 长按删除与滑动删除相比,有何不同点?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值