android可拖拽悬浮控件和Kotlin的可拖拽悬浮控件/可拖拽悬浮按钮带Demo附件
本文讲解的是一个实现了可拖拽的悬浮按钮,并添加了吸附边框的功能。
借鉴于: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附件相关推荐
- android 获取控件高度_安卓开发入门教程UI控件_ImageView
什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...
- 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)
阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...
- android 获取控件高度_安卓开发入门教程UI控件_ProgressBar
什么是ProgressBar ProgressBar是用于提示用户进行等待的UI控件,. 基础样例 1.loading图 效果图 代码 布局文件代码 <ProgressBarandroid:id ...
- Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸
Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...
- 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 布局的创 ...
- Android eclipse实现创建水果表并添加信息,将其以ListView控件显示
Android eclipse实现创建水果表并添加信息,将其以ListView控件显示 整个程序包含:三个.java文件以及两个.xml文件 1.Fruit.java: package com.gpn ...
- Android 遥控器按键 布局,Android 类遥控器圆形控件 扇形按钮 带中间按钮
Android 类遥控器圆形控件 扇形按钮 带中间按钮 前言 效果图 使用方法 添加依赖 在布局中使用 参数设定 设定是否有中间按钮 设定正常情况下的中间按钮的背景颜色 设定中间按钮的圆圈描边颜色 设 ...
- android开发模仿文件管理器_2020 Web界面开发:DevExtreme全新的Diagram控件、文件管理器...
DevExpress ASP.NET Web Forms Controls拥有针对Web表单(包括报表)的110+种UI控件,DevExpress ASP.NET MVC Extensions是服务器 ...
- treeview控件怎么使用修改发育树_树形控件在生产力工具中的设计
惊!半年实践血泪史,3000 字深度好文,一个爱树的设计师手把手教你如何设计「树 」! 树形控件是种常见的设计模式,几乎与图形化用户界面同时诞生,通过结构化的组织方式逐级展示内容,让整体信息架构一目了 ...
最新文章
- 剖析数据库中重要而又常被曲解的概念
- Web安全-伪静态网页
- 关于计算机类课程实验教学的思考
- Java中的HashMap和Hashtable有什么区别?
- Linux-定时任务(Crontab)基本用法
- 以数制转换问题讲解栈数据结构的基本概念及其在计算机中的应用
- jQuery自定义的属性内容包含单引号、双引号,页面显示异常
- 华为交换机学习指南基于端口划分VLAN的四种方案
- UCSC 基因组浏览器配置详解
- PBS集群上手管理手册
- 怎么在图片上加水印?
- c语言课程设计作业心得体会,c语言课程设计总结心得
- 自动驾驶|福特将在美国新建自动驾驶汽车工厂 计划未来两年投产
- iOS手机摄像头测心率
- 重大问题思考-2021年总结
- 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量为0.00001,第二个里面放2粒,第三个里面放4,第四个8 ,以此类推,棋盘上放的所有芝麻的重量?
- CSS综合案例——淘宝轮播图/焦点图布局的制作
- DataX数据交换,starrockswriter异常解决
- 【性能测试】如何完全卸载LoadRunner?
- 去哪些网站能够查阅医学最新文献?
热门文章
- Java编程常用英语汇总,让你写程序不再困难
- 安装ubuntu系统,报错WslRegisterDistribution failed with error: 0x8007019e
- 计算机在土木工程中的应用课设,计算机在土木工程中的应用编程试题
- 真心真诚的Java类型程序员的几个建议
- 实战 SQL Server 2008 数据库误删除数据的恢复(转)
- SQL SERVER 2008 误删数据且无全备恢复方法
- Solid Converter PDF注册码
- 28个超实用Chrome DevTools 调试技巧参考了前端调试通关秘籍
- 什么是wired memory
- android截屏快捷键 截屏工具 音量下键+电源键