Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

原文地址:http://android.xsoftlab.net/training/custom-views/index.html

引言

Android框架含有大量的View类,这些类用来显示各式各样的数据,并可以直接与用户交互。但是某些时候,APP有一项很特殊的需求,但是框架中的View还不能满足这样的需求,这时就需要根据需要自己创建一个全新的View类了。这节课程将会学习如何创建这样的自定义View。

创建View类

一个设计良好的自定义View与其它任何设计良好的View类都很相似。它封装了一系列特殊的功能,并将简单易用的接口暴露了出来。它高效、合理的使用了CPU及内存等资源。除了要实现上面这些特点之外,自定义View还需要:

  • 遵循Android标准。
  • 提供可以工作于Android XML布局中的自定义样式属性。
  • 发送可访问事件。
  • Android平台的兼容性。

Android框架提供了一系列的基础类及XML标签来辅助你创建符合以上标准的View。这节课将会学习如何使用Android框架来创建自定义View的核心功能。

创建View的子类

Android中的所有View类都继承于View。自定义View可以直接继承View,也可以继承View子类(比如Button)。

为了使Android Developer Tools可以与你的View产生交互,应当至少提供一个含有Context与AttributeSet作为参数的构造方法。这个构造方法可以使布局编辑器创建或编辑View的实例。

class PieChart extends View {public PieChart(Context context, AttributeSet attrs) {super(context, attrs);}
}

定义自定义属性

如果要往UI中添加View,你需要以XML元素的形式指定该View,并通过元素属性控制View的行为与外貌。定义良好的自定义View还可以通过XML添加、设计这些样式。为了使自定义View拥有以下这些行为,你必须:

  • 在< declare-styleable >资源元素中定义自定义View的属性。
  • 在XML布局中指定属性的值。
  • 在运行时接收属性值。
  • 将接收到的属性值应用到View中。

这部分将会学习如何定义属性及如何指定它们的值。下部分会学习在运行时如何处理接收并使用这些值。

要定义自定义属性,需要在工程中添加< declare-styleable >资源。通常会将这些资源放在res/values/attrs.xml文件中。下面是一个attrs.xml文件的示例:

<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>

上面这段代码声明了两个自定义属性,showText 和 labelPosition,它们都属于一个名为PieChart的风格实体。风格实体的名字按照惯例与对应的自定义View的类名相一致。尽管不是必须要遵循这项惯例,但很多受欢迎的代码编辑者都喜欢依照这项命名惯例来提供实现声明。

一旦定义了自定义属性,你就可以像内置属性那样在XML文件中使用它们。唯一的不同就是,自定义属性属于不同的命名空间。它们不属于标准的http://schemas.android.com/apk/res/android命名空间,而属于http://schemas.android.com/apk/res/[your package name]。举个例子,下面是如何使用自定义属性的示例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews"><com.example.customviews.charting.PieChart
     custom:showText="true"custom:labelPosition="left" />
</LinearLayout>

为了避免重复定义命名空间,示例中使用了xmls指令。该指定使http://schemas.android.com/apk/res/com.example.customviews命名空间与custom别名产生了关联。你可以为命名空间使用任何你想使用的名称。

注意,这里在布局中引用的自定义View采用的是自定义View的权限定名。如果View类是个内部类,还必须通过外部类的类名进一步限定。举个例子, PieChart含有一个名叫PieView的内部类。如果要为这个类使用自定义属性,你应该使用标签:com.example.customviews.charting.PieChart$PieView.

应用自定义属性

当一个View从XML布局中被创建后,XML标签中的所有属性都会被读取,并通过View的构造方法以AttributeSet的形式传递到View中。尽管它可能是直接从AttributeSet中读取数据的,但是它还是有一些缺点:

  • 资源所引用的属性值不能够被解析
  • 不支持Style

相反的,可以将AttributeSet传给obtainStyledAttributes()方法。该方法会返回一个TypedArray对象,它内部包含了被间接引用的数组值。

Android资源编译器为了使使用obtainStyledAttributes()方法更加简便做了大量的工作。在资源目录中的每一个资源都会在R.java中定义相应的属性id。你可以使用这预定义的常量去TypedArray中读取属性。下面是PieChart类如何读取属性的示例:

public PieChart(Context context, AttributeSet attrs) {super(context, attrs);TypedArray a = context.getTheme().obtainStyledAttributes(attrs,R.styleable.PieChart,0, 0);try {mShowText = a.getBoolean(R.styleable.PieChart_showText, false);mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);} finally {a.recycle();}
}

注意TypedArray是一个共享资源,必须在使用完之后对其进行回收。

添加属性及事件

Attributes是控制View的外观与行为的一种强大的方式,但是它只有在View初始化的时候才会被读取。如果要提供动态的行为,则需要暴露相应的get,set方法。下面的代码展示了PieChart是如何暴露名为showText的属性方法的:

public boolean isShowText() {return mShowText;
}
public void setShowText(boolean showText) {mShowText = showText;invalidate();requestLayout();
}

注意在setShowText中调用了invalidate()方法与requestLayout()方法。这些方法可以确保View的行为更改生效。在更改完成属性之后不得不重新绘制该View,这样才能使View的外观生效。这样系统才会知道该View需要重新绘制。同样的,如果新属性值可能会引起尺寸或者形状的更改还需要请求新的布局。忘记调用这些方法会引起很难发现的Bug.

自定义View还应当支持事件监听器,以便与重要的事件交互。比如,PieChart暴露一个名为OnCurrentItemChanged的自定义事件,用来通知监听器用户旋转了饼图。

很容易忘记暴露属性和事件,尤其你是唯一一个自定义View的用户。在定义View接口时多花点心思可以在将来维护的时候少花点时间和精力。一个良好的习惯就是总是暴露任何成员属性的外观与行为的属性方法。

可访问性

自定义View应当支持更宽泛的用户。这其中包括视力有缺陷的残疾人。为了支持这部分用户的使用,应当:

  • 使用android:contentDescription属性标识你的输入字段
  • 在适当的时候通过sendAccessibilityEvent()方法发送可访问事件
  • 支持更多的控制器,比如D-pad及轨迹球

有关更多信息请参见 Making Applications Accessible。


阅读完本篇文章之后,可以继续阅读下一篇文章:Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制

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

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

相关文章

论文浅尝 | Iterative Cross-Lingual Entity Alignment Based on TransC

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;IEICE TRANSACTIONS on Information and Systems, 2020, 103(5): 1002-1005.链接&#xff1a;https://www.jstage.jst.go.jp/article/transinf/E103.D/5/E103.D_2019DAL0001/_pdf介绍这篇论文关注的任…

ARKit:增强现实技术在美团到餐业务的实践

前言 增强现实&#xff08;Augmented Reality&#xff09;是一种在视觉上呈现虚拟物体与现实场景结合的技术。Apple 公司在 2017 年 6 月正式推出了 ARKit&#xff0c;iOS 开发者可以在这个平台上使用简单便捷的 API 来开发 AR 应用程序。 本文将结合美团到餐业务场景&#xff…

腾讯天衍实验室新算法入选国际万维网大会 新冠疫苗AI问答上线

新冠疫苗的效用和安全性如何&#xff1f;怎么预约接种新冠疫苗&#xff1f;哪些人可以接种新冠疫苗&#xff1f;接种新冠疫苗是否收费&#xff1f;进入年底&#xff0c;随着全国新冠疫苗接种工作规范有序开展&#xff0c;各地接种人数在不断增加&#xff0c;但在逐步面向全民推…

百度一口气亮出NLP十年积累:完整技术布局全面披露,面向业界砸下11项七夕大礼

百度一口气亮出NLP十年积累&#xff1a;完整技术布局全面披露&#xff0c;面向业界砸下11项七夕大礼&#xff1a;https://zhuanlan.zhihu.com/p/197625888

Android官方开发文档Training系列课程中文版:创建自定义View之View的绘制

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/custom-drawing.html#draw 自定义View最重要的部分就是它的样子了。自定义View的绘制根据应用的需要或者简单亦或者复杂。这节课的内容涵盖了大多数通用的知识点。 重写onDraw()方法 绘制自定义View…

LeetCode 965. 单值二叉树

文章目录1. 题目2. 解题2.1 递归2.2 循环1. 题目 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 2. 解题 2.1 递归 class Solution { public:bool isUnivalT…

论文浅尝 - SIAM ICDM 2020 | 基于图时空网络的知识引导的诊断预测

论文笔记整理&#xff1a;吴锐&#xff0c;东南大学硕士。来源&#xff1a;SIAM ICDM 2020论文下载地址&#xff1a;https://epubs.siam.org/doi/abs/10.1137/1.9781611976236.3 动机基于电子病历&#xff08;EHR&#xff0c;Electronic Health Records&#xff09;对患者未来的…

Oceanus:美团HTTP流量定制化路由的实践

背景 Oceanus是美团基础架构部研发的统一HTTP服务治理框架&#xff0c;基于Nginx和ngx_lua扩展&#xff0c;主要提供服务注册与发现、动态负载均衡、可视化管理、定制化路由、安全反扒、session ID复用、熔断降级、一键截流和性能统计等功能。本文主要讲述Oceanus如何通过策略抽…

对商品的评论进行数据挖掘得到评论标签(商品属性+评论观点),以及用户的分组信息

对商品的评论进行数据挖掘得到评论标签&#xff08;商品属性评论观点&#xff09;&#xff0c;以及用户的分组信息&#xff1a; 第一步&#xff1a;对文本进行预处理&#xff0c;分词并进行语义角色标注 # -*- coding:utf-8 -*- import os from pyltp import Segmentor, Post…

文本对抗攻击入坑宝典

文 | 阿毅编 | 小轶如果是咱家公众号的忠实粉丝就一定还记得之前咱家一篇关于NLP Privacy的文章&#xff0c;不出意外的话&#xff0c;你们是不是现在依然还担心自己的隐私被输入法窃取而瑟瑟发抖。所以&#xff0c;我们又来了&#xff01;今天给大家讨论的是NLP Privacy中一个…

Android官方开发文档Training系列课程中文版:创建自定义View之View的交互

写在前面的话:这一章很有价值&#xff0c;想要提升安卓知识的一定要读一读。不做安卓的也可以得到其它方面的提升。 原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/making-interactive.html UI的绘制只是自定义View的一部分。你还需要使View可以以…

LeetCode 350. 两个数组的交集 II(哈希)

文章目录1. 题目2. 解题2.1 hash2.2 数组已排序1. 题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9] 说明&#xff1a;输出结果中每个元…

会议交流 | CCKS2020 第十四届全国知识图谱与语义计算大会

CCKS2020第十四届全国知识图谱与语义计算大会China Conference on Knowledge Graph and Semantic Computing, 2020南昌.江西&#xff0c;11月12日-15日主办: 中国中文信息学会语言与知识计算专业委员会承办: 江西师范大学会议网站&#xff1a;www.sigkg.cn/ccks2020大会主题&a…

用微前端的方式搭建类单页应用

前言 微前端由ThoughtWorks 2016年提出&#xff0c;将后端微服务的理念应用于浏览器端&#xff0c;即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。 美团已经是一家拥有几万人规模的大型互联网公司&#xff0c;提升整体效率至关重要&#xff0c;这需要很…

Android官方开发文档Training系列课程中文版:创建自定义View之View的优化

原文地址&#xff1a;http://android.xsoftlab.net/training/custom-views/optimizing-view.html 现在已经完成了一个拥有良好设计的View&#xff0c;它即可以响应手势&#xff0c;又可以在状态之间过渡。为了避免View有卡顿的感觉&#xff0c;需要确保动画始终是按照每秒60帧…

12种NumpyPandas高效技巧

文 | Kunal Dhariwal本文分享给大家 12 种 Numpy 和 Pandas 函数&#xff0c;这些高效的函数会令数据分析更为容易、便捷。最后&#xff0c;读者也可以在 GitHub 项目中找到本文所用代码的 Jupyter Notebook。项目地址&#xff1a;https://github.com/kunaldhariwal/12-Amazing…

LeetCode 1002. 查找常用字符(哈希)

1. 题目 给定仅有小写字母组成的字符串数组 A&#xff0c;返回列表中的每个字符串中都显示的全部字符&#xff08;包括重复字符&#xff09;组成的列表。例如&#xff0c;如果一个字符在每个字符串中出现 3 次&#xff0c;但不是 4 次&#xff0c;则需要在最终答案中包含该字符…

抖音算法推荐机制详解

抖音算法推荐机制详解&#xff01;&#xff08;科普向&#xff09; 众所周知抖音的流量分配是去中心化的&#xff0c;这种去中心化算法&#xff0c;让每个人都有机会爆红&#xff0c;可为什么别人几个粉玩抖音&#xff0c;就能轻松获得10w点赞?而你怒拍几十条也枉然? 抖音的…

论文浅尝 - ICLR2020 | 用于半监督分类的图形推理学习

论文笔记整理&#xff1a;周虹廷&#xff0c;浙江大学研究生。研究方向&#xff1a;知识图谱&#xff0c;图表示学习等。论文链接&#xff1a;https://arxiv.org/pdf/2001.06137.pdf本文是发表在ICLR2020上针对图数据做节点半监督分类任务的论文。现有的算法解决图上节点分类问…

WMRouter:美团外卖Android开源路由框架

WMRouter是一款Android路由框架&#xff0c;基于组件化的设计思路&#xff0c;功能灵活&#xff0c;使用也比较简单。 WMRouter最初用于解决美团外卖C端App在业务演进过程中的实际问题&#xff0c;之后逐步推广到了美团其他App&#xff0c;因此我们决定将其开源&#xff0c;希望…