Android实现悬浮可拖拽的Button
程序员文章站
2023-02-21 21:34:05
本文实例为大家分享了android实现悬浮可拖拽button的具体代码,供大家参考,具体内容如下
1、简介
最近,因为项目需要,需要制作一个界面上可拖拽的按钮,网上也有...
本文实例为大家分享了android实现悬浮可拖拽button的具体代码,供大家参考,具体内容如下
1、简介
最近,因为项目需要,需要制作一个界面上可拖拽的按钮,网上也有多实例,看了下大部分都是示例不全或讲解不清晰,效果图也不明显,借此自己记录一番自己的实现方案,以备不时之需,同时也为广大学者可以直接通过拷贝方式完成项目所需。
2、效果图
在开始代码之前,首先看看效果图,如下:
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(); } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。