欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现悬浮可拖拽的Button

程序员文章站 2022-05-14 15:24:10
本文实例为大家分享了android实现悬浮可拖拽button的具体代码,供大家参考,具体内容如下 1、简介 最近,因为项目需要,需要制作一个界面上可拖拽的按钮,网上也有...

本文实例为大家分享了android实现悬浮可拖拽button的具体代码,供大家参考,具体内容如下

1、简介

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

2、效果图

在开始代码之前,首先看看效果图,如下:

Android实现悬浮可拖拽的Button

3、核心代码实现

3.1 draggingbutton 实现

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两个函数的使用,具体细节不在讲述,代码注释比较清晰。

4、举个栗子

4.1  activity中的布局

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <com.android.study.example.uidemo.dragging.draggingbutton
    android:id="@+id/tv_dragging"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:gravity="center"
    android:background="@drawable/drag_button_bg"
    android:layout_margin="20dp"
    android:padding="10dp"
    android:text="悬浮\n按钮1"
    android:textsize="15sp"
    android:layout_gravity="right"
    android:textcolor="#ffffff"/>
</linearlayout>

4.2 样式 drag_button_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true">
    <shape android:shape="oval">
      <!--填充颜色-->
      <solid android:color="#bf39b500" />
      <!--描边-->
      <stroke android:width="2dp" android:color="#bf39b500" />
    </shape>
  </item>
  <item>
    <shape android:shape="oval">
      <!--填充颜色-->
      <solid android:color="#ff8bc34a" />
      <!--描边-->
      <stroke android:width="2dp" android:color="#bf39b500"/>
    </shape>
  </item>
</selector>

4.3 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();
   }
  });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。