Android如何实现悬浮可拖拽的Button
创始人
2024-12-21 19:20:31
0次

简介

最近,因为项目需要,需要制作一个界面上可拖拽的按钮,网上也有多实例,看了下大部分都是示例不全或讲解不清晰,效果图也不明显,借此自己记录一番自己的实现方案,以备不时之需,同时也为广大学者可以直接通过拷贝方式完成项目所需。

核心代码实现

1DraggingButton 实现

public class DraggingButton extends android.support.v7.widget.AppCompatButton {   private int lastX = 0;  private int lastY = 0;  private int beginX = 0;  private int beginY = 0;   private int screenWidth = 720;  private int screenHeight = 1280;    public DraggingButton(Context context) {    this(context, null);  }   public DraggingButton(Context context, @Nullable AttributeSet attrs) {    this(context, attrs, 0);  }   public DraggingButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);     initData(context);  }   private void initData(Context context){    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    DisplayMetrics dm = new DisplayMetrics();    wm.getDefaultDisplay().getMetrics(dm);    screenWidth = dm.widthPixels;    screenHeight = dm.heightPixels;  }   @Override  public boolean onTouchEvent(MotionEvent event)  {     switch (event.getAction())    {      case MotionEvent.ACTION_DOWN:        lastX = (int) event.getRawX();   // 触摸点与屏幕左边的距离        lastY = (int) event.getRawY();   // 触摸点与屏幕上边的距离        beginX = lastX;        beginY = lastY;        break;      case MotionEvent.ACTION_MOVE:         int dx =(int)event.getRawX() - lastX;    // x轴拖动的绝对距离        int dy =(int)event.getRawY() - lastY;    // y轴拖动的绝对距离         // getLeft(): 子View的左边界到父View的左边界的距离, getRight():子View的右边界到父View的左边界的距离        // 如下几个数据表示view应该在布局中的位置        int left = getLeft() + dx;        int top = getTop() + dy;        int right = getRight() + dx;        int bottom = getBottom() + dy;        if(left < 0){          left = 0;          right = left + getWidth();        }        if(right > screenWidth){          right = screenWidth;          left = right - getWidth();        }        if(top < 0){          top = 0;          bottom = top + getHeight();        }        if(bottom>screenHeight){          bottom = screenHeight;          top = bottom - getHeight();        }        layout(left, top, right, bottom);        lastX = (int) event.getRawX();        lastY = (int) event.getRawY();        break;      case MotionEvent.ACTION_UP:        // 解决拖拽的时候松手点击事件触发        if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){          return super.onTouchEvent(event);        }else{          setPressed(false);          return true;        }      default:        break;    }    return super.onTouchEvent(event);  }}

核心代码已经奉献,通过自定义的DraggingButton即可实现可拖拽功能,具体原理主要在于onTouchEvent和layout两个函数的使用,具体细节不在讲述,代码注释比较清晰。

举个栗子

activity中的布局

  

样式 drag_button_bg.xml

                                                                        

activity 中的代码

private DraggingButton mDraggintView;mDraggintView = (DraggingButton) findViewById(R.id.tv_dragging);  mDraggintView.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {    Toast.makeText(FloatingActionBtnTestActivity.this, "click", Toast.LENGTH_SHORT).show();   }  });

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...