Android - 可拖动按钮悬浮button

一、可以拖动的View全局拖动,直接贴代码

public class MainActivity extends Activity {private LinearLayout btn_test;// 控件上一次所处的坐标private float lastX = 0;private float lastY = 0;// 记录控件开始位置private float beginX = 0;private float beginY = 0;// 屏幕的宽度和高度private int screenWidth;private int screenHeight;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取屏幕的宽度和高度WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);screenWidth = windowManager.getDefaultDisplay().getWidth();screenHeight = windowManager.getDefaultDisplay().getHeight();btn_test = findViewById(R.id.btn_test);//点击事件响应btn_test.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplication(), "点击事件", Toast.LENGTH_SHORT).show();}});//拖动事件响应btn_test.setOnTouchListener(new View.OnTouchListener() {@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://获取点击时x y 轴的数据lastX = event.getRawX();lastY = event.getRawY();// 记录控件开始位置beginX = lastX;beginY = lastY;break;case MotionEvent.ACTION_UP:Log.d("抬起", "up" + event.getX() + ":" + event.getY());// 解决拖拽的时候松手点击事件触发if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){}else{return true;}break;case MotionEvent.ACTION_MOVE://获得x y轴的偏移量int dx = (int) (event.getRawX() - lastX);int dy = (int) (event.getRawY() - lastY);//获得控件上下左右的位置信息,加上我们的偏移量,新得到的位置就是我们控件将要出现的位置int l = v.getLeft() + dx;int b = v.getBottom() + dy;int r = v.getRight() + dx;int t = v.getTop() + dy;//判断四个实际位置,如果有一边已经划出屏幕,那就把这边位置设置为0然后相反的边的位置就设置成控件的高度或者宽度if (l < 0) {l = 0;r = l + v.getWidth();}if (t < 0) {t = 0;b = t + v.getHeight();}if (r > screenWidth) {r = screenWidth;l = r - v.getWidth();}if (b > screenHeight) {b = screenHeight;t = b - v.getHeight();}//然后使用我们view的layout重新在布局中把我们的控件画出来v.layout(l, t, r, b);//并把现在的x y设置给lastx lastylastX = (int) event.getRawX();lastY = (int) event.getRawY();v.postInvalidate();//绘制break;default:break;}return false;}});}
}

二、xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/btn_test"android:layout_marginBottom="@dimen/dp_130"android:layout_marginLeft="@dimen/dp_15"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_width="@dimen/dp_60"android:layout_height="@dimen/dp_60"android:orientation="vertical"android:background="@drawable/ic_launcher_background"tools:ignore="MissingConstraints"><TextViewandroid:layout_marginTop="@dimen/dp_10"android:layout_gravity="center_horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮"android:textColor="#ffffff"android:textSize="@dimen/sp_14" /><TextViewandroid:layout_marginTop="@dimen/dp_0"android:layout_gravity="center_horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="移动/点击"android:textColor="#ffffff"android:textSize="@dimen/sp_12" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/130514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何基于 vue3+el-upload 二次封装上传文件组件到阿里云 oss(附上传进度条)

如何基于 vue3el-upload 二次封装上传文件组件到阿里云 oss 附进度条 一、创建生成全局唯一标识符 方法二、导入计算文件Md5(spark-md5)三、安装依赖ali-oss四、创建导出ali-oss 方法五、创建上传文件 组件(完整代码)六、引入使用组件 一、创建生成全局唯一标识符 方法 在util…

数据库的事务四大特性(ACID)、详解隔离性以及隔离级别、锁

文章目录 &#x1f389;数据库的事务四大特性&#xff08;ACID&#xff09;以及隔离性一、事务的四大特性✨1、原子性&#xff08;Atomicity&#xff09;&#x1f38a;2、一致性&#xff08;Consistency&#xff09;&#x1f38a;3、隔离性&#xff08;Isolation&#xff09;&a…

leetcode:389. 找不同

一、题目 函数原型&#xff1a;char findTheDifference(char * s, char * t) 二、思路 作者原先的思路是先将两个字符串从小到大排序&#xff0c;然后两个字符串依次比较。若出现字符串t中的元素和字符串s不相等&#xff0c;则说明该元素就是被添加的字母。 但是&#xff0c;该…

【LeetCode】118. 杨辉三角

118. 杨辉三角 难度&#xff1a;简单 题目 给定一个非负整数 *numRows&#xff0c;*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例…

农业水土环境与面源污染建模及对农业措施响应

目录 ​专题一 农业水土环境建模概述 专题二 ArcGIS入门 专题三 农业水土环境建模流程 专题四 DEM数据制备流程 专题五 土地利用数据制备流程 专题六 土壤数据制备流程 专题七 气象数据制备流程 专题八 农业措施数据制备流程 专题九 参数率定与结果验证 专题十 模型结…

算法随想录算法训练营第四十七天| 647. 回文子串 516.最长回文子序列

647. 回文子串 题目&#xff1a;给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字…

Python之Excel——复制一个sheet当做模板,生成多个sheet

目录 专栏导读背景思路1、加载模板2、项目文件2、完整版代码:3、视频演示:4、总结:&#x1f44d; 该系列文章专栏&#xff1a;[Python办公自动化专栏] 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&…

一文弄懂synchronized

简述 synchronized是什么? synchronized 关键字是一种同步锁&#xff0c;它可以保证在一个时刻只有一个线程可以执行某段代码。synchronized 关键字可以用在方法、代码块、静态方法和静态代码块上。 synchronized怎么用&#xff1f; synchronized是Java中用于实现线程同步…

Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

1. 前言 最近在使用OpenCV处理图片的时候&#xff0c;经常会遇到需要转换图像的情况&#xff0c;网上相关资料比较少&#xff0c;也不全&#xff0c;有时候得费劲老半天才能搞定。 自己踩了坑后&#xff0c;在这里记录下&#xff0c;都是我在项目中遇到的图像转化操作&#xf…

AI开源 - LangChain UI 之 Flowise

原文&#xff1a;AI开源 - LangChain UI 之 Flowise 一、Flowise 简介 Flowise 是一个为 LangChain 设计的用户界面(UI)&#xff0c;使得使用 LangChain 变得更加容易&#xff08;低代码模式&#xff09;。 通过拖拽可视化的组件&#xff0c;组建工作流&#xff0c;就可以轻…

ScrapeKit库中Swift爬虫程序写一段代码

以下是一个使用ScrapeKit库的Swift爬虫程序&#xff0c;用于爬取网页视频的代码&#xff1a; import ScrapeKit// 创建一个配置对象&#xff0c;用于指定爬虫ip服务器信息 let config Configuration(proxyHost: "duoip", proxyPort: 8000)// 创建一个爬虫对象 let s…

t2017递推1攀天梯

1、攀天梯(2006夏令营检测题) Description 北武当山又名真武山&#xff0c;古称龙王山。北武当山主峰四周几乎都是陡壁悬崖&#xff0c;只有一条人造“天梯”可攀&#xff0c;天梯由N级就山凿筑的石阶组成。 现在&#xff0c;聪聪打算通过天梯攀上北武当山主峰。攀天梯时&am…

diffusers-Load pipelines,models,and schedulers

https://huggingface.co/docs/diffusers/using-diffusers/loadinghttps://huggingface.co/docs/diffusers/using-diffusers/loading 有一种简便的方法用于推理是至关重要的。扩散系统通常由多个组件组成&#xff0c;如parameterized model、tokenizers和schedulers&#xff0c…

Spring-Spring 之底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Bean是否是懒加载initMeth…

LeetCode 421. 数组中两个数的最大异或值

原题链接&#xff1a;https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/?envTypedaily-question&envId2023-11-04 题目分析 异或且时间复杂度在nlogn内第一反应想到字典树&#xff0c;扫一遍存进字典树&#xff0c;然后遍历每个数&…

【Git企业开发】第四节.Git的分支管理策略和bug分支

文章目录 前言一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 1.2 企业分支管理策略二、bug分支三、删除临时分支四、总结总结 前言 一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 通常合并分支时&#xff0c;如果可能&#xff0c;Git 会…

AI:51-基于深度学习的电影评价

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…

Dart 语法总结

Dart语法总结 变量Hello World变量声明数据类型函数使用面向对象Dart 特殊运算符 变量 Hello World /*** 1.main函数是dart入口* 2. 参数args&#xff0c; 类型为List<String> - 泛型 */ void main(List<String> args) {print("hello world"); }变量声…

centos系统源码编译安装nginx,并编写服务脚本

1.安装编译所需的依赖项&#xff1a; yum install -y gcc pcre-devel openssl-devel zlib-devel2.下载 Nginx 源代码&#xff1a; wget http://nginx.org/download/nginx-1.21.3.tar.gz tar -xf nginx-1.21.3.tar.gz cd nginx-1.21.33.配置编译选项并进行编译和安装&#xff…