Android:创建自定义View

news2024/11/16 6:00:25

点击查看创建自定义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 = false
    private var textPos: Int = 0

    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()
            }
        }
    }

    fun isShowText(): Boolean {
        return mShowText
    }

    fun setShowText(showText: Boolean) {
        mShowText = showText
        invalidate()
        requestLayout()
    }
}

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

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

相关文章

elementui 日历组件el-calendar使用总结

功能&#xff1a; 1.日历可以周视图、月视图切换&#xff1b; 2.点击月视图中日期可以切换到对应周视图&#xff1b; 3.点击周视图查看当日对应数据&#xff1b; 4.周、月视图状态下&#xff0c;点击前后按钮&#xff0c;分别切换对应上下的周、月&#xff1b; 5.点击回到…

MWA(Modern Web App)初学那些事-2-Basic HTML CSS

初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS 目录 初学MWA(Modern Web App&#xff09;那些事-2-Basic HTML & CSS前言一、本节学习目标二、HTML基础内容2.1关键元素2.4 Scripts 三、CSS 基础内容3.1 级联样式表-用于设置网页样式和布局3.2 CSS规则语…

Docker的虚拟化安装、常用命令和使用案例

文章目录 一、Docker的虚拟机安装1、完成虚拟机的更新2、完成Docker安装3、配置镜像加速器 二、Docker常用命令三、Docker的容器创建四、理解虚拟机中的Docker容器 一、Docker的虚拟机安装 1、完成虚拟机的更新 详见我的文章。 2、完成Docker安装 yum list installed|grep …

筑梦未来,精准构建:Chief Architect Premier X10 for Mac,首席建筑师的专业之选

Chief Architect Premier X10 for Mac&#xff0c;是建筑设计领域的一款顶尖软件&#xff0c;专为追求卓越设计与精准构建的用户量身打造。它融合了先进的3D建模技术与直观的操作界面&#xff0c;让设计师能够轻松实现创意与现实的完美融合。 这款软件提供了丰富的设计工具与资…

axios 下载大文件时,展示下载进度的组件封装——js技能提升

之前面试的时候&#xff0c;有遇到一个问题&#xff1a;就是下载大文件的时候&#xff0c;如何得知下载进度&#xff0c;当时的回复是没有处理过。。。 现在想到了。axios中本身就有一个下载进度的方法&#xff0c;可以直接拿来使用。 下面记录一下处理步骤&#xff1a; 参考…

【C++之C++11特性知识】

C学习笔记---026 C之C11特性知识1、C11特性知识介绍2、auto关键字3、范围for4、列表初始化5、final 与 override关键字6、lambda表达式7、右值引用和移动语义8、智能指针9、类型推导&#xff08;decltype关键字&#xff09;10、参考文档 C之C11特性知识 前言&#xff1a; 前面…

LVS+Nginx高可用集群---keepalived原理与实战

1.高可用集群架构keepalived双机主备原理 高可用&#xff1a;(HA) 部署nginx存在两台nginx。当主节点的nginx宕机停止服务的时候&#xff0c;nginx备用机起到跟nginx(主) keepalived的概念&#xff1a;解决单点故障&#xff1b;组件免费&#xff1b;可以实现高可用HA机制&…

css-grid布局(栅格布局)

css新世界-auto-fit grid 一个比flex更强大的布局,适合做整体布局 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); auto-fit的话有strech效果gap 不仅可以用于grid 也可用flex. 在grid-template-areas表示这个位置空着grid area 的 [a b]命名可重复命名 表示的…

AutoHotKey自动热键(十一)下载SciTE4AutoHotkey-Plus的中文增强版脚本编辑器

关于AutoHotkey的专用编辑器, SciTE4AutoHotkey是一个免费的基于 SciTE 的 AutoHotkey 脚本编辑器,除了 DBGp 支持, 它还为 AutoHotkey 提供了语法高亮, 调用提示, 参数信息和自动完成, 以及其他拥有的编辑特性和辅助工具.XDebugClient 是一个基于 .NET Framework 2.0 的简单开…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…

SpringBatch文件读写ItemWriter,ItemReader使用详解

SpringBatch文件读写ItemWriter&#xff0c;ItemReader使用详解 1. ItemReaders 和 ItemWriters1.1. ItemReader1.2. ItemWriter1.3. ItemProcessor 2.FlatFileItemReader 和 FlatFileItemWriter2.1.平面文件2.1.1. FieldSet 2.2. FlatFileItemReader2.3. FlatFileItemWriter 3…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

使用 PyAMF / Django 实现 Flex 类映射

1、问题背景 PyAMF 是一个用于在 Flex 和 Python 之间进行通信的库&#xff0c;在使用 PyAMF 与 Flex 应用进行通信时&#xff0c;经常会遇到错误。例如&#xff0c;在发送一个 Flex Investor 对象到 Python 时&#xff0c;会得到一个 ‘KeyError: first_name’ 的错误。这是因…

大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】

大数据面试SQL题复习思路一网打尽&#xff01;(文档见评论区)_哔哩哔哩_bilibiliHive SQL 大厂必考常用窗口函数及相关面试题 大数据面试SQL题-笔记01【运算符、条件查询、语法顺序、表连接】大数据面试SQL题-笔记02【...】 目录 01、力扣网-sql题 1、高频SQL50题&#xff08…

人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域&#xff0c;模型的训练目标是找到一组参数&#xff0c;使得模型能够从训练数据中学习到有用的模式&am…

mysql(5.5)启动服务和环境配置

正常启动 参考&#xff1a;Javaweb基础之mysql回溯笔记(一) 总的来说就是在mysql的安装目录下&#xff0c;找到bin下面的msyqld.exe&#xff0c;双击即启动了mysql服务&#xff1b; 启动方式二 也可以直接找到windows的服务项进行启动&#xff0c;操作如下&#xff1a; 打开…

eclipse免安装版64位 2018版本

前言 eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言&#xff0c;它只是一个框架和一组服务&#xff0c;用于通过插件组件构建开发环境。 一、下载地址 下载地址&#xff1a;http://source/download 选择如下图红色框文件内容下载 二、安装步骤 1、…

社交电商的新篇章:AI智能名片O2O商城小程序与传统微商的区别与融合

摘要 在数字经济蓬勃发展的今天&#xff0c;互联网技术的革新正以前所未有的速度重塑着商业格局。传统微商模式&#xff0c;尽管在初期借助社交媒体迅速崛起&#xff0c;但因其固有的局限性&#xff0c;如产品质量不一、营销手段单一、信任机制脆弱等&#xff0c;逐渐暴露出诸…

【实战场景】MongoDB迁移的那些事

【实战场景】MongoDB迁移的那些事 开篇词&#xff1a;干货篇【MongoDB迁移的方法】&#xff1a;1. 基于mongodump和mongorestore的迁移一、迁移前准备二、使用mongodump备份数据三、使用mongorestore还原数据四、注意事项 2. 基于MongoDB复制集的迁移一、迁移前准备二、配置新复…

Spring Boot整合Minio实现文件上传和读取

文章目录 一、简介1.分布式文件系统应用场景2.Minio介绍3.Minio优点 二、docker部署&#xff08;windows系统&#xff09;1.创建目录2.拉取镜像3.创建容器并运行4.访问控制台5.初始化配置 三、Spring Boot整合Minio1.创建demo项目2.引入依赖3.配置4.编写配置类5.MinIO工具类6.文…