Android:创建自定义View

点击查看创建自定义view官网文档

一、简介

设计良好的自定义视图与任何其他精心设计的类一样。它通过一个简单的接口封装一组特定的功能,高效使用 CPU 和内存,诸如此类。除了是一个精心设计的类之外,自定义视图还必须执行以下操作:

  • 符合 Android 标准。
  • 提供适用于 Android XML 布局的自定义可设置样式属性。
  • 发送无障碍事件。
  • 与多种 Android 平台兼容。

Android 框架提供了一组基类和 XML 标记,以帮助您创建满足上述所有要求的视图。接下来将讨论如何使用 Android 框架创建视图类的核心功能。

您可以在自定义视图组件中找到更多信息。

二、子类化视图

Android 框架中定义的所有视图类都会扩展 View。您的自定义视图还可以直接扩展 View,或者您可以通过扩展某个现有视图子类(如 Button)来节省时间。

如需允许 Android Studio 与视图交互,您必须至少提供一个接受 Context 和 AttributeSet 对象作为参数的构造函数。此构造函数允许布局编辑器创建和编辑视图的实例。

class PieChart : View {constructor(context: Context) : super(context)constructor(context: Context, attrs: AttributeSet) : super(context, attrs)constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
}

三、定义自定义属性

如需向界面添加内置 View,请在 XML 元素中指定,并使用元素属性控制其外观和行为。您还可以使用 XML 添加自定义视图并为其设置样式如需在自定义视图中启用此行为,请执行以下操作:

  • 在 资源元素中为视图定义自定义属性。
  • 为 XML 布局中的属性指定值。
  • 在运行时检索属性值。
  • 将检索到的属性值应用于您的视图。

本部分将介绍如何定义自定义属性并指定其值。下一部分将介绍在运行时检索和应用值。

如需定义自定义属性,请向项目添加 资源。通常的做法是将这些资源放在 res/values/attrs.xml 文件中。下面是一个 attrs.xml 文件示例:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="PieChart"><attr name="showText" format="boolean" /><attr name="labelPosition" format="enum"><enum name="left" value="0"/><enum name="right" value="1"/></attr></declare-styleable>
</resources>

为避免必须重复冗长的命名空间 URI,该示例使用了 xmlns 指令。此指令将别名 custom 分配给命名空间 http://schemas.android.com/apk/res/com.example.customviews。 您可以为命名空间选择所需的任何别名。

注意将自定义视图添加到布局的 XML 标记的名称。它是自定义视图类的完全限定名称。如果您的视图类是内部类,请使用视图外部类的名称进一步限定它。 例如,PieChart 类有一个名为 PieView 的内部类。如需使用此类中的自定义属性,请使用 com.example.customviews.charting.PieChart$PieView 标记。

四、应用自定义属性

通过 XML 布局创建视图时,XML 标记中的所有属性都会从资源包中读取,并作为 AttributeSet 传递到视图的构造函数中。 虽然可以直接从 AttributeSet 读取值,但这样做有一些弊端:

  • 系统不会解析属性值中的资源引用。
  • 因此不会应用样式。

请改为将 AttributeSet 传递给 obtainStyledAttributes()。 此方法会传回一个 TypedArray 数组,其中包含已解除引用并设置了样式的值。

Android 资源编译器做了大量工作,以便您更轻松地调用 obtainStyledAttributes()。对于 res/ 目录中的每个 <declare-styleable> 资源,生成的 R.java 会同时定义属性 ID 数组和一组常量(用于定义数组中每个属性的索引)。您可以使用预定义的常量从 TypedArray 中读取属性。以下代码展示了 PieChart 类如何读取其属性:

init {context.theme.obtainStyledAttributes(attrs,R.styleable.PieChart,0, 0).apply {try {mShowText = getBoolean(R.styleable.PieChart_showText, false)textPos = getInteger(R.styleable.PieChart_labelPosition, 0)} finally {recycle()}}
}

请注意,TypedArray 对象是共享资源,必须在使用后回收。

请注意,setShowText 会调用 invalidate() 和 requestLayout()。这些调用对于确保视图可靠运行至关重要。在对视图属性进行任何可能会改变其外观的更改后,您需要使该视图失效,以便系统知道需要重新绘制该视图。同样,如果属性的变化方式可能会影响视图的大小或形状,您需要请求新的布局。忘记这些方法调用可能会导致难以发现的 bug。

自定义视图还必须支持事件监听器来传达重要事件。例如,PieChart 公开了一个名为 OnCurrentItemChanged 的自定义事件,以通知监听器用户旋转了饼图以将焦点放在新的饼图切片上。

公开属性和事件是很容易忘记的,尤其是当您是自定义视图的唯一用户时。花点时间仔细定义视图界面可以降低未来的维护成本。一种好的做法是始终公开任何会影响自定义视图的可见外观或行为的属性。

五、在设计时充分考虑无障碍功能

您的自定义视图必须支持众多用户。包括妨碍他们看到或使用触摸屏的残障用户。如需为残障用户提供支持,请执行以下操作:

  • 使用 android:contentDescription 属性为输入字段添加标签。
  • 根据需要调用 sendAccessibilityEvent() 来发送无障碍事件。
  • 支持备用控制器,例如方向键或轨迹球。

如需详细了解如何创建易于访问的视图,请参阅 让应用使用起来更没有障碍。

六、PieChart.kt代码

在这里插入图片描述

class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {private var mShowText: Boolean = falseprivate var textPos: Int = 0init {context.theme.obtainStyledAttributes(attrs,R.styleable.PieChart,0, 0).apply {try {mShowText = getBoolean(R.styleable.PieChart_showText, false)textPos = getInteger(R.styleable.PieChart_labelPosition, 0)} finally {recycle()}}}fun isShowText(): Boolean {return mShowText}fun setShowText(showText: Boolean) {mShowText = showTextinvalidate()requestLayout()}
}

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

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

相关文章

vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转

一 myChart.on(click, (params) > {if (params.componentType series && params.dataIndex ! undefined) {const months this.month_htqd[params.dataIndex]; // 获取点击柱状图的 X 轴坐标值alert(点击了柱状图&#xff0c;值为: ${months});// 根据点击的柱状图…

哪种SSL证书可以快速签发保护http安全访问?

用户访问网站&#xff0c;经常会遇到访问http网页时&#xff0c;提示网站不安全或者不是私密连接的提示&#xff0c;因为http是使用明文传输&#xff0c;数据传输中可能被篡改&#xff0c;数据不被保护&#xff0c;通常需要SSL证书来给数据加密。 SSL证书的签发速度&#xff0…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中&#xff0c;网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框&#xff0c;还是更复杂的模态对话框&#xff0c;都可能中断测试脚本的正常执行&#xff0c;导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…

Postgresql-12.5 安装及配置 -银河麒麟V10服务器版本

Postgresql-12.5 安装及配置 环境基于银河麒麟V10 服务器版本操作 此安装步骤Linux操作系统几乎通用 下载数据库安装包 链接&#xff1a;https://pan.baidu.com/s/1wt4Yjwv79W-fCd4tlMC4-w 提取码&#xff1a;0117 1.下载依赖 可以用系统自带的依赖库下载 yum install -…

基于PHP+MYSQL开发制作的趣味测试网站源码

基于PHPMYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分&#xff0c; 自己手动在数据库里修改数据&#xff0c;数据库里有就会优先查询数据库的信息&#xff0c; 没设置的话第一次查询缘分都是非常好的 95-99&#xff0c;第二次查就比较差 &#xff0c; 所以如果要…

什么是SQL锁

SQL锁是数据库系统中的一个重要概念&#xff0c;主要用于保证多用户环境下的数据库完整性和一致性。在多用户并发访问数据库时&#xff0c;通过加锁的方式防止其他事务访问指定的资源&#xff0c;从而控制并发的访问&#xff0c;确保数据的完整性和一致性。 SQL锁可以分为以下…

msyql (8.4,9.0) caching_sha2_password 转换 mysql_native_password用户认证

mysql 前言 caching_sha2_password 主要特性 用于增强用户账户密码的存储和验证安全性。这种插件利用 SHA-256 散列算法的变体来存储和验证密码 安全的密码散列&#xff1a; caching_sha2_password 使用基于 SHA-256 的算法来生成密码的散列值。这意味着即使数据库被未授权访…

地图项目涉及知识点总结

序&#xff1a;最近做了一个在地图上标记点的项目&#xff0c;用户要求是在地图上显示百万量级的标记点&#xff0c;并且地图仍要可用&#xff08;能拖拽&#xff0c;能缩放&#xff09;。调研了不少方法和方案&#xff0c;最终实现了相对流畅的地图系统&#xff0c;加载耗时用…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议&#xff08;EEPS 2024&#xff09; 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网&#xff1a;www.iceeps.com 大会时间&#xff1a;2024年8月9-11日 大会…

S7-1200PLC使用西门子报文 111 和 FB38002(Easy_SINA_Pos)实现V90 PN总线伺服定位控制

1、博途1200/1500 PLC V90 PN通信 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_fb284功能块文档说明-CSDN博客文章浏览阅读7k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。_fb284功能…

安装anaconda后jupyter notebook打不开 闪退

首先&#xff0c;通过清华源安装了最新的anaconda&#xff08;安装在了D盘&#xff09; 尝试打开jupyter&#xff0c;发现小黑框1s后自己关了&#xff0c;根本不打开浏览器 之后尝试按照这个做了一遍https://blog.csdn.net/gary101818/article/details/123560304还是不行。。…

Jmeter性能测试(九)

一、Jmeter性能测试需要特别注意的地方 1、参数化 2、请求参数 3、BeanShell 预处理程序更新jmeter请求参数 4、接口中不可重复的随机数处理 5、线程组设置 6、总结 二、参数化 1、参数化配置,多个参数用英文逗号隔开 2、wallet参数化文件,不要写表头,多个参数用英文逗号…

二叉树的前、中、后序遍历(递归法、迭代法)leetcode144/94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a;…

鸿蒙开发入门——ArkTS语法简介(万字简介)

ArkTS 作为鸿蒙开发的编程语言&#xff0c;我们先来一图看看这个语言&#xff0c;我们可以看到ArkTS是在TS&#xff08;TypeScript&#xff09;的基础上改造的&#xff0c;而TS又是在JS&#xff08;JavaSript&#xff09;上改造的&#xff0c;一句话总结就是ArkTS是TS的超集&a…

新版本 idea 创建不了 spring boot 2 【没有jkd8选项】

创建新项目 将地址换成如下 https://start.aliyun.com/

HackQuest介绍 web3 学习平台

HackQuest 官网地址&#xff1a; https://www.hackquest.io/zh HackQuest是一个专注于Web3技术教育的在线学习平台&#xff0c;旨在帮助全球开发者掌握区块链、加密货币和去中心化应用&#xff08;DApps&#xff09;领域的最新技能。该平台汇聚了超过14000名活跃开发者&#…

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一&#xff1a;环形链表 思路&#xff1a; 思考一&#xff1a;为什么&#xff1f; 思考二&#xff1a;快指针一次走3步、4步、......n步&#xff0c;能否相遇 step1&#xff1a; step2&#xff1a; 代码&#xff1a; 题二&#xff1a; 环形链表 I…

区块链技术在溯源领域的应用

区块链技术具有去中心化、不可篡改、可追溯等特点&#xff0c;使其在溯源领域具有广阔的应用前景。具体而言&#xff0c;区块链技术可以应用于以下几个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 产品溯源 产品溯源是指…

Nginx的核心功能

1. Nginx的核心功能 1.1 nginx反向代理功能 正向代理 代理的为客户端&#xff0c;对于服务器不知道真实客户的信息。例如&#xff1a;翻墙软件 反向代理服务器 代理的为服务器端。对于客户来说不知道服务器的信息。例如&#xff1a;nginx 项目部署图 web项目部署的虚拟机和Ng…