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

news2024/11/6 3:08:16

一、自定义编辑框

效果图:

主要的代码为:

class EditLayout @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
    private var editTitle: String
    private var editContent: String
    private var editType: Int
    private var isMust: Boolean
    private var tvLabelEdit: TextView
    private var ivMustEdit: ImageView
    private var etEdit: EditText
    private var editable: Boolean

    init {
        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 = editTitle
        etEdit.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_TEXT
            2 -> InputType.TYPE_CLASS_NUMBER
            else -> 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? = null
    private 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_CONTENT
            height = WindowManager.LayoutParams.WRAP_CONTENT
            flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            gravity = Gravity.END

            type = 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.root
        floatRootView?.setOnTouchListener(ItemViewTouchListener(layoutParams, windowManager))
        floatRootView?.setBackgroundColor(Color.TRANSPARENT)

        val outMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(outMetrics)

        layoutParams.format = PixelFormat.TRANSPARENT
        mBinding.tvOpenDoorAll.setOnClickListener {
        }
        mBinding.clLeft.setOnClickListener {
            Log.e("TAG", "缩小")
            indenteOrExpand()
        }

    }

    /** 缩进或者展开 **/
    private fun indenteOrExpand() {
        mBinding.llContentOperate.let {
            if (it.visibility == View.GONE) {
                it.visibility = View.VISIBLE
                mBinding.ivIndenteExpand.setImageResource(R.mipmap.ic_indentation_float)
            } else {
                it.visibility = View.GONE
                mBinding.ivIndenteExpand.setImageResource(R.mipmap.ic_expand_float)
            }
        }
    }

    inner class ItemViewTouchListener(
        private val wl: WindowManager.LayoutParams,
        private val windowManager: WindowManager
    ) : View.OnTouchListener {
        //        private var x = 0
        private var y = 0
        override 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 - x
                    val movedY = nowY - y
//                    x = nowX
                    y = nowY
                    wl.apply {
//                        x += movedX
                        y += 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.coloradmin.cn/o/1129136.html

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

相关文章

Android12 启动页适配

印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

Java中的CAS简述

目录 1、CAS是什么 2、CAS的生活化例子 3、Java中的atomic包 4、unsafe类 5、CAS的缺点及解决方案 小结 1、CAS是什么 CAS(Compare and Swap)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。它是一种乐观锁的实现方式&a…

分布式限流:Redis

目录 1:如何实现分布式限流 2:限流的几种类别 2.1:固定窗口限流 2.2:滑动窗口限流 2.3:漏桶限流 2.4:令牌桶限流 3:实现分布式限流:Redis 3.1:引入Redisson的依赖包 3.2:初始化Redisson 3.3:创建Redisson的限流类 1:如何实现分布式限流 1:把统计用户的使用频率等这些…

Springcloud介绍

1.基本介绍 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring …

欧拉图和哈密顿图

欧拉图 在连通图G中,经过G的每条边一次且仅一次的通路,称为欧拉通路若欧拉通路为回路,则称为欧拉回路含有欧拉回路的图称为欧拉图有欧拉通路则G可以一笔画出有欧拉回路则G是连通的且无奇点(欧拉图无奇点) 哈密顿图 …

2023了,是时候使用pnpm了!

2023了,是时候使用pnpm了! Excerpt 2023了,是时候使用pnpm了! 什么是pnpm pnpm代表performant npm(高性能的npm),同npm和Yarn,都属于Javascript包管理安装工具,它较npm和…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图,目前企业中有20个VLAN, 编号为VLAN1~VLAN20, 为了确保内部网络的可靠性,使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽,现管理员希望通过配置MSTP 的负载均衡实现网络带宽…

【proteus】8086 写一个汇编程序并调试

参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)p103-105,p119-122. 参考程序是p70,例4-1 在上一篇的基础上: 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图: …

2.1 向量与线性方程组

一、行图像与列图像 线性代数的中心问题是求解线性方程组。线性的意思是这些方程的未知数是一次的,即每个未知数只会乘数字,而不会出现 x x x 与 y y y 相乘的项。下面是一个由两个未知数组成的方程组: 两个方程 两个未知数 { x − 2 y 1…

Django学习笔记——文件上传(界面还怪好看得嘞)

定义文件上传函数 #文件上页面 def uploadFileIndex(request):return render(request, "uploadFile.html")#文件上传接口 def uploadFile(request):if request.method POST and request.FILES[file]:uploaded_file request.FILES[file]fs FileSystemStorage()# 选…

螺旋矩阵[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2&#xf…

vue如何使用冻结对象提升代码效率及其原理解析

先给大家伙整个实际工作中一定会碰到的问题 如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据 来看看源码, html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度 <template><div id&quo…

Txt病毒

一.txt病毒原理 利用翻转字符串的方法 混淆伪装 &#xff08;jpg 、doc、ppt 等&#xff09; &#xff08;1&#xff09;更改程序图标 &#xff08;2&#xff09;将程序重命名 readtxt.exe 鼠标放到 read 与 txt 中间 设置格式为 RLO // 这个“RLO”是一个转义字符&#xf…

交互式 Web 应用 0 基础入门

初探 Gradio&#xff1a;轻松构建交互式 Web 应用 文章目录 初探 Gradio&#xff1a;轻松构建交互式 Web 应用Why Gradio?安装 Gradio创建交互式界面1. gr.Interface2. gr.Blocks 强大的组件库输入输出组件控制组件布局组件 示例交互式数据可视化多组件同时&#xff08;嵌套&a…

Netty框架详解

一、Netty简介 Netty是一款基于Java NIO的网络编程、高性能、异步事件驱动的网络应用框架。它的设计目标是提供简单易用、高性能、可扩展的网络编程框架。 二、Netty主要特点 高并发&#xff1a;Netty使用异步的、非阻塞的I/O模型&#xff0c;通过事件驱动的方式处理网络操作…

回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测

回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入…

潮流玩具演绎城市文化,泡泡玛特入选2023“上海礼物”

每一座城市都有其独特的文化氛围和历史背景&#xff0c;“城市礼物”承载着地域特色、文化内涵和人文精神&#xff0c;不断复制和传递着城市文化。近年来&#xff0c;上海市文旅局会同有关各方&#xff0c;从旅游商品的研发设计、品牌塑造、展售渠道等方面&#xff0c;创建“上…

【软件教程】如何用C++交叉编译出能在Android运行的ELF程序或so动态库

一、配置NDK交叉编译平台 1. 打开Android的官方ndk下载链接https://developer.android.com/ndk/downloads?hlzh-cn&#xff0c;下载windows 64位ndk环境包。 2. 解压后将具有以下文件的路径加入到系统环境变量。 3. 配置好环境变量&#xff0c;如下图所示&#xff0c;Path中存…

mysql 数据库 表结构生成word文档

1、背景 我们在做项目时&#xff0c;表设计文档都是非常重要的&#xff0c;可以让开发人员快速了解表与业务的关系、表之间的关系。 产品在不停迭代的过程中&#xff0c;表的结构也会有相应的变化&#xff0c;我们需要将变化更新的表设计文档中。以前我们是人工方式更新文档&…