【安卓深度控件开发(1.1)】Creating Custom Views (官方示例文档汉化版...

<p><strong>个人的习惯了,无所谓什么东西,先看官方的东西,再去自我发展和超越,就像常常有人问我学 .Net 看什么书比较好,我总是回答“MSDN”(个人做 .Net 还比较久了,任何文档都没有 MSDN 的好。真心喜欢,谁让人家有中文呢~~~)。</strong></p> <p><strong>好吧,不多说。这一章就直接做成 </strong><a href="http://developer.android.com/training/custom-views/index.html" target="_blank"><strong>Creating Custom Views</strong></a><strong> 的汉化版了,就算是汉化原创吧 ~~</strong></p> <p>&#160;</p> <p>官方示例下载:<a href="http://developer.android.com/shareables/training/CustomView.zip">CustomView.zip</a></p> <p>&#160;</p> <h1>创建自定义视图</h1> <p>Android 框架中包含了很多视图类,用于与用户交互和显示各种类型的数据集。但有时您的应用程序有一些内建的视图不能满足的独特需求。本单元演示如何创建您自己的具有健壮性和可重用性的视图。</p> <p>&#160;</p> <h2>创建一个视图类</h2> <p>一个精心设计的自定义视图非常类似于任何其他设计良好的类。它封装一组特定的功能,具有易于使用的界面,有效率的使用 CPU 和内存,依此类推。自定义视图还应:</p> <ul> <li>符合 Android 标准 </li> <li>提供用于 Android XML 布局的自定义 styleable 特性 </li> <li>发送辅助事件 </li> <li>多个 Android 平台兼容 </li> </ul> <p>Android 框架提供了一套基本类和 XML 标记,以帮助您创建一个视图,满足所有这些要求。本课将讨论如何使用 Android 框架来创建视图类的核心功能。</p> <p>&#160;</p> <h3>子类化一个 View</h3> <p>所有在 Android 框架中定义的视图都最终继承 <a href="http://developer.android.com/reference/android/view/View.html" target="_blank">View</a>。您的自定义视图同样可以直接继承 <a href="http://developer.android.com/reference/android/view/View.html" target="_blank">View</a>,或可以通过继承一个现有视图的子类,例如 <a href="http://developer.android.com/reference/android/widget/Button.html" target="_blank">Button</a> 来节省时间。</p> <p>要允许 <a href="http://developer.android.com/guide/developing/tools/adt.html" target="_blank">Android 开发工具</a>与您的视图进行最低限度的交互,您必须提供包括 <a href="http://developer.android.com/reference/android/content/Context.html" target="_blank">Context</a> 与 <a href="http://developer.android.com/reference/android/util/AttributeSet.html" target="_blank">AttributeSet</a> 参数的构造函数。此构造函数允许布局编辑器来创建与编辑您的视图实例。</p> <div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre><span style="color: #0000ff">class</span> PieChart <span style="color: #0000ff">extends</span> View { <span style="color: #0000ff">public</span> PieChart(Context context, AttributeSet attrs) { <span style="color: #0000ff">super</span>(context, attrs); } }</pre> </div>

<br />

<h3>定义自定义参数</h3>

<p>向用户界面添加内建视图时,您通过 XML 元素指定它,并使用元素参数来控制其外观和行为。一个设计良好的自定义视图同样支持通过 XML 样式添加。要为您的自定义视图支持此行为,您必须:</p>

<ul> <li>使用 <font color="#006600">&lt;declare-styleable&gt;</font> 资源元素定义您的视图的自定义参数集 </li>

<li>在您的 XML 布局中指定参数的值 </li>

<li>在运行时检索参数值 </li>

<li>将检索到的参数的值应用于您的视图 </li> </ul>

<p>本节讨论如何定义自定义参数和指定其值。下一节处理在运行时检索和应用的值。</p>

<p>若要定义自定义参数,请将 <font color="#006600">&lt;declare-styleable&gt;</font> 资源添加到项目中。通常将这些资源放入 <font color="#006600">res/values/attrs.xml</font> 文件。如下是一个 <font color="#006600">attr.xml</font> 文件示例:</p>

<div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre>&lt;resources&gt; &lt;declare-styleable name=&quot;<span style="color: #8b0000">PieChart</span>&quot;&gt; &lt;attr name=&quot;<span style="color: #8b0000">showText</span>&quot; format=&quot;<span style="color: #8b0000">boolean</span>&quot; /&gt; &lt;attr name=&quot;<span style="color: #8b0000">labelPosition</span>&quot; format=&quot;<span style="color: #8b0000">enum</span>&quot;&gt; &lt;enum name=&quot;<span style="color: #8b0000">left</span>&quot; value=&quot;<span style="color: #8b0000">0</span>&quot;/&gt; &lt;enum name=&quot;<span style="color: #8b0000">right</span>&quot; value=&quot;<span style="color: #8b0000">1</span>&quot;/&gt; &lt;/attr&gt; &lt;/declare-styleable&gt; &lt;/resources&gt;</pre> </div> 这段代码在 <font color="#006600">PieChart</font> 声明实体下定义了两个自定义参数,<font color="#006600">showText</font> 与 <font color="#006600">labelPosition</font> 。声明实体的名称一般应与其对应的自定义视图的名称相同。虽然不是必需的,但在许多代码编辑器中可能通过此名称提供自动完成特性。

<br />

<p>完成自定义参数之后,您就可以在 XML 布局文件中像内建的参数那样使用它们。唯一的不同就是这些自定义参数属于不同的名称空间。而不是在 <font color="#006600">http://schemas.android.com/apk/res/android</font> 中。新的名称空间样式为 <font color="#006600">http://schemas.android.com/apk/res/[your package name]</font> 。如下是使用 PieChart 自定义参数的示例:</p>

<div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre><span style="color: #0000ff">&lt;?</span>xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;<span style="color: #0000ff">?&gt;</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">LinearLayout</span> <span style="color: #ff0000">xmlns</span>:<span style="color: #ff0000">android</span>=<span style="color: #0000ff">&quot;http://schemas.android.com/apk/res/android&quot;</span> <span style="color: #ff0000">xmlns</span>:<span style="color: #ff0000">custom</span>=<span style="color: #0000ff">&quot;http://schemas.android.com/apk/res/com.example.customviews&quot;</span><span style="color: #0000ff">&gt;</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">com.example.customviews.charting.PieChart</span> <span style="color: #ff0000">custom</span>:<span style="color: #ff0000">showText</span>=<span style="color: #0000ff">&quot;true&quot;</span> <span style="color: #ff0000">custom</span>:<span style="color: #ff0000">labelPosition</span>=<span style="color: #0000ff">&quot;left&quot;</span> <span style="color: #0000ff">/&gt;</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">LinearLayout</span><span style="color: #0000ff">&gt;</span></pre> </div>

<p>为了避免重复长的命名空间 URI,该示例使用 xmlns 指令。此指令将别名 <font color="#006600">custom</font> 分配到名称空间 <font color="#006600">http://schemas.android.com/apk/res/com.example.customviews</font> ,您可以为您的名称空间选择任何你希望的别名。 </p>

<p>请注意在布局中添加自定义视图的 XML 标记的名称。它是自定义视图类的完全限定的名称。如果您的视图类是一个内部类,必须进一步限定与视图的外部类的名称。进一步。例如,<font color="#006600">PieChart</font> 类有一个称为 <font color="#006600">PieView</font> 的内部类。若要使用此类中的自定义参数,将使用标记 <font color="#006600">com.example.customviews.charting.PieChart$PieView</font>。</p>

<p>&#160;</p>

<h3>应用自定义参数</h3>

<p>当从 XML 布局创建一个视图时,所有的 XML 标记中的参数是从资源包中读取和传递到视图的构造函数中的 <a href="http://developer.android.com/reference/android/util/AttributeSet.html" target="_blank">AttributeSet</a>。虽然它也可以直接从 <a href="http://developer.android.com/reference/android/util/AttributeSet.html" target="_blank">AttributeSet</a> 中读取值,但这样做所以具有一些缺点:</p>

<ul> <li>不解析资源引用参数值 </li>

<li>不应用样式 </li> </ul>

<p>相反,使用 <a href="http://developer.android.com/reference/android/util/AttributeSet.html" target="_blank">AttributeSet</a> 的 <a href="http://developer.android.com/reference/android/content/res/Resources.Theme.html#obtainStyledAttributes(android.util.AttributeSet, int[], int, int)" target="_blank">obtainStyledAttributes()</a>。此方法返回传递 <a href="http://developer.android.com/reference/android/content/res/TypedArray.html" target="_blank">TypedArray</a> 数组,已经解析引用和样式的值。</p>

<p>Android 资源编译器做大量的工作让你轻松调用 <a href="http://developer.android.com/reference/android/content/res/Resources.Theme.html#obtainStyledAttributes(android.util.AttributeSet, int[], int, int)" target="_blank">obtainStyledAttributes()</a>。每个资源 <font color="#006600">res</font> 目录中生成 R.java 定义参数 id 数组和一组每个参数的数组索引常量。您可以使用预定义的常量从 <a href="http://developer.android.com/reference/android/content/res/TypedArray.html" target="_blank">TypedArray</a> 读取该参数。下面是 PieChart 如何读取参数的示例:</p>

<div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre>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(); } }</pre>

</div>

<p>请注意 <a href="http://developer.android.com/reference/android/content/res/TypedArray.html" target="_blank">TypedArray</a> 对象共享的资源,必须在使用后释放得到循环利用。</p>

<p>&#160;</p>

<h3></h3>

<h3>增加属性与事件</h3>

<p>参数是一种有效的方法控制视图的行为和外观,但它们只能在视图初始化时读取。若要提供动态行为,对每个自定义属性公开 getter 和 setter 。下面的代码显示了 <font color="#006600">PieChart</font> 如何公开 <font color="#006600">showText</font> 属性:</p>

<div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span> isShowText() { <span style="color: #0000ff">return</span> mShowText; }

<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setShowText(<span style="color: #0000ff">boolean</span> showText) { mShowText = showText; invalidate(); requestLayout(); }</pre>

</div>

<p>注意 setShowText 调用 <a href="http://developer.android.com/reference/android/view/View.html#invalidate()">invalidate()</a> 和 <a href="http://developer.android.com/reference/android/view/View.html#requestLayout()">requestLayout()</a> 。 这是确保该视图的行为可靠的关键。您必须在更改任何可能会影响其外观的属性之后使视图无效,让系统知道它需要重绘。同样,如果属性的更改会影响视图的大小或形状,需要请求新的布局。忘记调用这些方法可能导致难以发现的 bug。</p>

<p>自定义视图也应支持沟通重要事件的事件侦听器。例如 <font color="#006600">PieChart</font> 公开一个名为 <font color="#006600">OnCurrentItemChanged</font> 的事件通知用户已旋转饼图,激活新的饼图扇区。</p>

<p>很容易忘记要公开的属性和事件,尤其是当你的自定义视图的唯一用户。花一些时间来仔细定义您的视图界面减少了日后的维修费用。一个好的规则是总是公开任何可能影响自定义视图可见外观或行为的属性。</p>

<p>&#160;</p>

<h3></h3>

<h3>辅助功能设计</h3>

<p>您的自定义视图应支持最广泛的用户。若要支持残障用户,您应该:</p>

<ul> <li>在您的输入字段中使用 <font color="#006600">android:contentDescription</font> 属性 </li>

<li>通过在适当的时候调用 <a href="http://developer.android.com/reference/android/view/accessibility/AccessibilityEventSource.html#sendAccessibilityEvent(int)" target="_blank">sendAccessibilityEvent()</a> 发送辅助功能事件。 </li>

<li>支持备用控制器,例如 D-pad 和轨迹球 </li> </ul>

<p>有关创建可访问的视图的详细信息,请参阅 Android 开发人员指南中的<a href="http://developer.android.com/guide/topics/ui/accessibility/apps.html#custom-views" target="_blank">使应用程序可以访问</a>。</p>

转载于:https://my.oschina.net/jock/blog/115089

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值