本文讲解的是一个实现了可拖拽的悬浮按钮,并添加了吸附边框的功能。

借鉴于:https://www.jianshu.com/p/4f55bcbc1b83

在此之前,先了解下其简单的使用方式吧:

原文地址:https://blog.csdn.net/w630886916/article/details/82113050

Demo地址:https://download.csdn.net/download/w630886916/10629168

* 可拖拽的悬浮控件按钮
* 直接xml布局里引用即可。
* 要设置setOnClickListener点击事件,即可实现拖拽和点击功能。
* 尺寸大小,样式及背景图片遵循ImageView即可。

如图:

代码:

主页面:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)actionButton.setOnClickListener {Toast.makeText(this,"触发了可拖拽按钮的点击事件",Toast.LENGTH_SHORT).show()}}
}

核心控件(kotlin):

(java代码附件里有,使用方法一样)

/*** 可拖拽的悬浮控件按钮* 2018-08-27* 直接xml布局里引用即可。* 要设置setOnClickListener点击事件,即可实现拖拽和点击功能。* 尺寸大小,样式及背景图片遵循ImageView即可。*/
class DragFloatActionButton : ImageView {private var parentHeight: Int = 0private var parentWidth: Int = 0constructor(context: Context?) : super(context)constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)private var lastX: Int = 0private var lastY: Int = 0private var isDrag: Boolean = falseoverride fun onTouchEvent(event: MotionEvent): Boolean {val rawX = event.rawX.toInt()val rawY = event.rawY.toInt()when (event.action and MotionEvent.ACTION_MASK) {MotionEvent.ACTION_DOWN -> {isPressed = trueisDrag = falseparent.requestDisallowInterceptTouchEvent(true)lastX = rawXlastY = rawYval parent: ViewGroupif (getParent() != null) {parent = getParent() as ViewGroupparentHeight = parent.heightparentWidth = parent.width}}MotionEvent.ACTION_MOVE -> {if (parentHeight <= 0 || parentWidth === 0) {isDrag = false} else {isDrag = true}val dx = rawX - lastXval dy = rawY - lastY//这里修复一些华为手机无法触发点击事件val distance = Math.sqrt((dx * dx + dy * dy).toDouble()).toInt()if (distance == 0) {isDrag = false} else {var x = x + dxvar y = y + dy//检测是否到达边缘 左上右下x = if (x < 0) 0F else if (x > parentWidth - width) (parentWidth - width).toFloat() else xy = if (getY() < 0) 0F else if (getY() + height > parentHeight) (parentHeight - height).toFloat() else ysetX(x)setY(y)lastX = rawXlastY = rawYLog.i("aa", "isDrag=" + isDrag + "getX=" + getX() + ";getY=" + getY() + ";parentWidth=" + parentWidth)}}MotionEvent.ACTION_UP -> if (!isNotDrag()) {//恢复按压效果isPressed = false//Log.i("getX="+getX()+";screenWidthHalf="+screenWidthHalf);if (rawX >= parentWidth / 2) {//靠右吸附animate().setInterpolator(DecelerateInterpolator()).setDuration(500).xBy(parentWidth - width - x).start()} else {//靠左吸附val oa = ObjectAnimator.ofFloat(this, "x", x, 0F)oa.setInterpolator(DecelerateInterpolator())oa.setDuration(500)oa.start()}}}//如果是拖拽则消s耗事件,否则正常传递即可。return !isNotDrag() || super.onTouchEvent(event)}private fun isNotDrag(): Boolean {return !isDrag && (x == 0f || x == (parentWidth - width).toFloat())}
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"tools:context=".MainActivity"><com.internal.test.floatingactionbuttontest.DragFloatActionButtonandroid:id="@+id/actionButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@mipmap/ic_launcher"/></android.support.constraint.ConstraintLayout>

如果你想看控件原介绍,文初有链接。

基本上功能简单,直接使用即可。

附件:

Demo地址:https://download.csdn.net/download/w630886916/10629168

android可拖拽悬浮控件和Kotlin的可拖拽悬浮控件/可拖拽悬浮按钮带Demo附件相关推荐

  1. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

  2. 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)

    阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...

  3. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar

    什么是ProgressBar ProgressBar是用于提示用户进行等待的UI控件,. 基础样例 1.loading图 效果图 代码 布局文件代码 <ProgressBarandroid:id ...

  4. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸

    Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...

  5. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  6. Android eclipse实现创建水果表并添加信息,将其以ListView控件显示

    Android eclipse实现创建水果表并添加信息,将其以ListView控件显示 整个程序包含:三个.java文件以及两个.xml文件 1.Fruit.java: package com.gpn ...

  7. Android 遥控器按键 布局,Android 类遥控器圆形控件 扇形按钮 带中间按钮

    Android 类遥控器圆形控件 扇形按钮 带中间按钮 前言 效果图 使用方法 添加依赖 在布局中使用 参数设定 设定是否有中间按钮 设定正常情况下的中间按钮的背景颜色 设定中间按钮的圆圈描边颜色 设 ...

  8. android开发模仿文件管理器_2020 Web界面开发:DevExtreme全新的Diagram控件、文件管理器...

    DevExpress ASP.NET Web Forms Controls拥有针对Web表单(包括报表)的110+种UI控件,DevExpress ASP.NET MVC Extensions是服务器 ...

  9. treeview控件怎么使用修改发育树_树形控件在生产力工具中的设计

    惊!半年实践血泪史,3000 字深度好文,一个爱树的设计师手把手教你如何设计「树 」! 树形控件是种常见的设计模式,几乎与图形化用户界面同时诞生,通过结构化的组织方式逐级展示内容,让整体信息架构一目了 ...

最新文章

  1. 剖析数据库中重要而又常被曲解的概念
  2. Web安全-伪静态网页
  3. 关于计算机类课程实验教学的思考
  4. Java中的HashMap和Hashtable有什么区别?
  5. Linux-定时任务(Crontab)基本用法
  6. 以数制转换问题讲解栈数据结构的基本概念及其在计算机中的应用
  7. jQuery自定义的属性内容包含单引号、双引号,页面显示异常
  8. 华为交换机学习指南基于端口划分VLAN的四种方案
  9. UCSC 基因组浏览器配置详解
  10. PBS集群上手管理手册
  11. 怎么在图片上加水印?
  12. c语言课程设计作业心得体会,c语言课程设计总结心得
  13. 自动驾驶|福特将在美国新建自动驾驶汽车工厂 计划未来两年投产
  14. iOS手机摄像头测心率
  15. 重大问题思考-2021年总结
  16. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量为0.00001,第二个里面放2粒,第三个里面放4,第四个8 ,以此类推,棋盘上放的所有芝麻的重量?
  17. CSS综合案例——淘宝轮播图/焦点图布局的制作
  18. DataX数据交换,starrockswriter异常解决
  19. 【性能测试】如何完全卸载LoadRunner?
  20. 去哪些网站能够查阅医学最新文献?

热门文章

  1. Java编程常用英语汇总,让你写程序不再困难
  2. 安装ubuntu系统,报错WslRegisterDistribution failed with error: 0x8007019e
  3. 计算机在土木工程中的应用课设,计算机在土木工程中的应用编程试题
  4. 真心真诚的Java类型程序员的几个建议
  5. 实战 SQL Server 2008 数据库误删除数据的恢复(转)
  6. SQL SERVER 2008 误删数据且无全备恢复方法
  7. Solid Converter PDF注册码
  8. 28个超实用Chrome DevTools 调试技巧参考了前端调试通关秘籍
  9. 什么是wired memory
  10. android截屏快捷键 截屏工具 音量下键+电源键