android——自定义控件(编辑框)、悬浮窗

一、自定义编辑框

效果图:

主要的代码为:

class EditLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {private var editTitle: Stringprivate var editContent: Stringprivate var editType: Intprivate var isMust: Booleanprivate var tvLabelEdit: TextViewprivate var ivMustEdit: ImageViewprivate var etEdit: EditTextprivate var editable: Booleaninit {LayoutInflater.from(context).inflate(R.layout.layout_edit, this)tvLabelEdit = findViewById(R.id.tv_label_edit)ivMustEdit = findViewById(R.id.iv_must_edit)etEdit = findViewById(R.id.et_edit)val typedArray = context.obtainStyledAttributes(attrs, R.styleable.EditLayout)editTitle = typedArray.getString(R.styleable.EditLayout_editTitle) ?: ""editContent = typedArray.getString(R.styleable.EditLayout_editContent) ?: ""editType = typedArray.getInt(R.styleable.EditLayout_editType, 1)editable = typedArray.getBoolean(R.styleable.EditLayout_editable, true)isMust = typedArray.getBoolean(R.styleable.EditLayout_isMust, false)typedArray.recycle();applyLabel()applyIv()applyEdit()}private fun applyLabel() {tvLabelEdit.text = editTitleetEdit.setText(editContent)}private fun applyIv() {ivMustEdit.visibility = if (isMust) View.VISIBLE else View.GONE}private fun applyEdit() {etEdit.inputType = when (editType) {1 -> InputType.TYPE_CLASS_TEXT2 -> InputType.TYPE_CLASS_NUMBERelse -> InputType.TYPE_CLASS_TEXT}etEdit.isEnabled = editable}fun getEditText(): EditText {return etEdit}fun getInputText(): String {return etEdit.text.toString()}fun setInputText(input: String) {etEdit.setText(input)}
}

使用3个原生控件组合而成,具体的代码可以到这里下载:

https://download.csdn.net/download/wy313622821/88467564

二、悬浮窗

主要的代码:

@SuppressLint("ClickableViewAccessibility")
class FloatWindow(private val mContext: Context) : LifecycleService() {private var floatRootView: View? = nullprivate val mBinding: WindowFloatBinding by lazy {DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.window_float, null, false)}private val windowManager: WindowManager by lazy {mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager}private val layoutParams: WindowManager.LayoutParams by lazy {WindowManager.LayoutParams().apply {width = WindowManager.LayoutParams.WRAP_CONTENTheight = WindowManager.LayoutParams.WRAP_CONTENTflags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL orWindowManager.LayoutParams.FLAG_NOT_FOCUSABLEgravity = Gravity.ENDtype = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY} else {WindowManager.LayoutParams.TYPE_PHONE}}}private var mAllDoorListen: () -> Unit = {}init {floatRootView = mBinding.rootfloatRootView?.setOnTouchListener(ItemViewTouchListener(layoutParams, windowManager))floatRootView?.setBackgroundColor(Color.TRANSPARENT)val outMetrics = DisplayMetrics()windowManager.defaultDisplay.getMetrics(outMetrics)layoutParams.format = PixelFormat.TRANSPARENTmBinding.tvOpenDoorAll.setOnClickListener {}mBinding.clLeft.setOnClickListener {Log.e("TAG", "缩小")indenteOrExpand()}}/** 缩进或者展开 **/private fun indenteOrExpand() {mBinding.llContentOperate.let {if (it.visibility == View.GONE) {it.visibility = View.VISIBLEmBinding.ivIndenteExpand.setImageResource(R.mipmap.ic_indentation_float)} else {it.visibility = View.GONEmBinding.ivIndenteExpand.setImageResource(R.mipmap.ic_expand_float)}}}inner class ItemViewTouchListener(private val wl: WindowManager.LayoutParams,private val windowManager: WindowManager) : View.OnTouchListener {//        private var x = 0private var y = 0override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {Log.e("TAG", "位置改变")when (motionEvent.action) {MotionEvent.ACTION_DOWN -> {
//                    x = motionEvent.rawX.toInt()y = motionEvent.rawY.toInt()}MotionEvent.ACTION_MOVE -> {
//                    val nowX = motionEvent.rawX.toInt()val nowY = motionEvent.rawY.toInt()
//                    val movedX = nowX - xval movedY = nowY - y
//                    x = nowXy = nowYwl.apply {
//                        x += movedXy += movedY}//更新悬浮球控件位置windowManager.updateViewLayout(view, wl)}else -> {}}return false}}/** 悬浮窗显示 */fun show() {windowManager.addView(floatRootView, layoutParams)}/** 悬浮窗移除 */fun remove() {floatRootView?.let {windowManager.removeViewImmediate(it)floatRootView = null}}/** 设置全部开启按钮监听 */fun setOpenAllListener(mListen: () -> Unit) {mAllDoorListen = mListen}
}

详细的代码请到这里下载:https://download.csdn.net/download/wy313622821/88468147

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

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

相关文章

五、W5100S/W5500+RP2040树莓派Pico<UDP Client数据回环测试>

文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP Client回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来…

线框图软件:Balsamiq Wireframes mac中文介绍

Balsamiq Wireframes mac是一款用于创建线框图的软件工具。它旨在帮助用户快速制作出清晰、简洁的界面原型,以便在设计和开发过程中进行协作和沟通。 Balsamiq Wireframes具有简单直观的用户界面,使用户能够快速添加和编辑各种用户界面元素,如…

Java采集传感器数据,亲测有效!

背景 先说背景, 最近公司项目需要用到传感器,采集设备温湿度,倾斜角,电流…,公司采购采购了一个温湿度传感器给我们开发测试使用,如下图: 看着还挺精致有没有。 进入正题 有了这个温湿度传感器…

Spring | Spring Cache 缓存框架

Spring Cache 缓存框架: Spring Cache功能介绍Spring Cache的Maven依赖Spring Cache的常用注解EnableCaching注解CachePut注解Cacheable注解CacheEvict注解 Spring Cache功能介绍 Spring Cache是Spring的一个框架,实现了基于注解的缓存功能。只需简单加一…

ubuntu 22.04安装百度网盘

百度网盘 客户端下载 (baidu.com) 下载地址 sudo dpkg -i baidunetdisk_4.17.7_amd64.deb

高防CDN:保卫您的网站免受攻击之利与弊

在当今数字化时代,网络安全对于网站经营者至关重要。高防CDN(Content Delivery Network)技术旨在提供强大的安全性,以保护网站免受恶意攻击。本文将探讨高防CDN为普通网站带来的优势与不足之处,并分析国内外高防CDN的发…

谷歌真的不喜欢 Node.js ?

有人在 Quora 上提问,为什么谷歌不喜欢 Node.js 呢,Google 的 UX 工程师和来自 Node.js 团队的开发者分别回答了他们对这个问题的看法,对于编程语言来说,每一门语言都有它自己的优势,重要的是如何用它去解决问题。 谷…

SpringBoot集成Redis主从架构实现读写分离(哨兵模式)

一、前言 这里会使用到spring-boot-starter-data-redis包,spring boot 2的spring-boot-starter-data-redis中,默认使用的是lettuce作为redis客户端,也推荐使用lettuce,Redis使用哨兵集群,这里会通过lettuce连接到哨兵…

Flume基本使用--mysql数据输出

MySQL数据输出 在MySQL中建立数据库school,在数据库中建立表student。SQL语句如下: create database school; use school; create table student(id int not null,name varchar(40),age int,grade int,primary key(id) ); 请使用Flume实时捕…

1. 两数之和、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1)Producer :消息生产者,就是向kafka broker发消息的客户端2)Consumer :消息消费者,向kafka broker获取消息的客户端3&…

【代码随想录】算法训练计划03

1、203. 移除链表元素 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 思路&#xf…

hdlbits系列verilog解答(模块按名字)-22

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 此问题类似于模块。您将获得一个名为的 mod_a 模块,该模块按某种顺序具有 2 个输出和 4 个输入。您必须按名称将 6 个端口连接到顶级模块的端口: module mod_a ( output out1, output …

DVWA-Cross Site Request Forgery (CSRF)

大部分网站都会要求用户登录后,使用相应的权限在网页中进行操作,比如发邮件、购物或者转账等都是基于特定用户权限的操作。浏览器会短期或长期地记住用户的登录信息,但是,如果这个登录信息被恶意利用呢?就有可能发生CSRF CSRF的英文全称为Cross Site Request Forgery,中文…

如何通过内网穿透实现公网远程连接Redis数据库

公网远程连接Redis数据库【内网穿透】 文章目录 公网远程连接Redis数据库【内网穿透】前言1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址…

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker,所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager,或 manager 降级为 worke…

深眸科技以需求定制AI视觉解决方案,全面赋能产品外观缺陷检测

产品外观是影响产品质量最重要的因素之一,其平整度、有无瑕疵等不仅影响到产品美观,甚至能够直接影响产品本身的使用和后续加工,给企业带来重大经济损失。 随着人工智能技术的快速发展,机器视觉与AI技术的结合应用加速渗透进工业…

MongoDB 的集群架构与设计

一、前言 MongoDB 有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。 Master-Slaver 是一种主从复制的模式,目前已经不推荐使用。Re…

Linux Mint 21.2 “EDGE” ISO 发布

Linux Mint 团队近日宣布发布最新 Linux Mint 21.2 “Victoria “版本的 “EDGE “ISO 版本,并提供下载。 “这个镜像是为那些硬件太新而无法启动 Linux Mint 21.x 中包含的 5.15 LTS 内核的用户制作的。 Linux Mint 21.2 “Victoria “于2023年7月中旬发布&#x…