创建一个视图类

精心设计的自定义视图与其他精心设计的类非常相似。它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等。不过,作为一个设计良好的班级,自定义视图应该:

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

1.子视图##

Android框架中定义的所有视图类都会扩展View。你的自定义视图也可以继承View,或者扩展其中一个现有视图子类来节省时间,例如Button。

要允许Android Studio与视图进行交互,至少必须提供一个构造函数,该构造函数将 参数Context和AttributeSet对象作为参数。该构造函数允许布局编辑器创建和编辑视图的实例。

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

2.定义自定义属性

要View为您的用户界面添加内置内容,您需要在XML元素中指定它并使用元素属性控制其外观和行为。编写良好的自定义视图也可以通过XML添加和设置样式。要在自定义视图中启用此行为,您必须:

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

要定义自定义属性,请将 资源添加到您的项目中。习惯上把这些资源放到一个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。
按照惯例,可修改实体的名称与定义自定义视图的类的名称相同
尽管遵循这个约定并不是严格必要的,但是许多流行的代码编辑器依赖于这个命名约定来提供语句完成。

一旦定义了自定义属性,就可以像使用内置属性一样在布局XML文件中使用它们。唯一的区别是自定义属性区别于android原生的声明。

http://schemas.android.com/apk/res/android android   原生的命名空间
http://schemas.android.com/apk/res/[your package name]   自定义属性的命名空间 

完整的xml代码

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

为了避免重复使用长名称空间URI,示例使用了一个xmlns指令。该指令将别名分配custom给名称空间http://schemas.android.com/apk/res/com.example.customviews。你可以选择任何你想要的命名空间的别名(上面代码用到的别名是custom)。

注意将自定义视图添加到布局的XML标记的名称。它是自定义视图类的完全限定名称。如果你的视图类是一个内部类,你必须进一步用视图外部类的名称来限定它。进一步。例如, PieChart该类有一个名为的内部类PieView。要使用这个类的自定义属性,你可以使用标签com.example.customviews.charting.PieChart.PieView (内部类的写法)

应用自定义属性##

从XML布局创建视图时,将从资源束中读取XML标记中的所有属性,并以视图的形式传递到视图的构造函数中AttributeSet。尽管可以AttributeSet直接读取值,但这样做有一些缺点:

  • 属性值中的资源引用未解析
  • 样式不适用

通过obtainStyledAttributes()方法进行处理可以解决上面出现的问题:

相反,传递AttributeSet给obtainStyledAttributes()。该方法返回TypedArray已经解除引用和样式化的值数组。

Android资源编译器为您的调用工作做了大量工作obtainStyledAttributes() 。对于 res目录中的每个资源,生成的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对象是共享资源,使用后必须回收。

添加属性和事件
属性是控制视图行为和外观的有效方式,但只有在初始化视图时才能读取它们。要提供动态行为,请为每个自定义属性公开属性getter和setter对。以下代码片段显示了如何PieChart公开一个名为的属性showText:

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

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

自定义视图还应该支持事件监听器来传达重要事件。例如,PieChart 公开调用的自定义事件OnCurrentItemChanged以通知侦听器用户已将饼图旋转到专注于新饼图片段。

很容易忘记公开属性和事件,特别是当您是自定义视图的唯一用户时。花一些时间仔细确定您的视图界面可以减少未来的维护成本。遵循的一条好规则是始终公开影响自定义视图的可见外观或行为的任何属性。

参考文档
https://developer.android.google.cn/training/custom-views/create-view.html

android自定义View学习(二)----自定义绘图
https://blog.csdn.net/qq_26296197/article/details/79435060

android自定义View学习(一)----创建一个视图类相关推荐

  1. Android自定义控件学习(四)------创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的设计,自定义视图应该: 符合And ...

  2. android自定义View学习(二)----自定义绘图

    自定义绘图 自定义视图中最重要的部分是它的外观.根据您的应用需求,自定义绘图可以很容易或复杂.本篇涵盖了一些最常见的操作 onDraw() 绘制自定义视图中最重要的步骤是重写该onDraw()方法.参 ...

  3. Android自定义View 学习整理

    Paint类:画笔 Canvas类:画布,画出成品:与屏幕显示不是一个概念,相当于一个透明图层 ARGB 不在onDraw()中创建变量:因为当需要重绘时就会调用onDraw(),创建的变量会一直被重 ...

  4. android 弹出菜单环形,『Android自定义View实战』实现一个小清新的弹出式圆环菜单...

    前言 Android表现快捷菜单的形式有很多种,比如使用PopupWindow弹出来的小弹窗,类似QQ的侧拉功能菜单,以及之前讲过的弧形菜单( Android 自定义弧形旋转菜单栏--卫星菜单),这次 ...

  5. android 光圈动画,Android 自定义View学习(4)波浪效果+光圈扩散效果

    这篇博客的效果是我仿照WPJY大神的一篇博客做的,加入了一些我自己的改动 先来看下效果 效果图上可能有些卡,但实际运行很流畅 上代码喽~~ /** * 外层的几层光环 */ private Paint ...

  6. Android自定义View的实现方法,带你一步步深入了解View(四)

    不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了LayoutInflater的原理分析.视图的绘制流程.视图的状态及重绘等知识,算是把View中很多重要的知识 ...

  7. Android自定义View的实现方法,带你一步步深入了解View

    如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.那么下面我们就来依次学习一下,每种方式分别是如何自定义View的. 一.自绘控件 自绘控件的意思就 ...

  8. android自定义view的实现方法,Android自定义View的实现方法

    一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了. 如果说要按类型来划分的话,自定义Vi ...

  9. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

最新文章

  1. 程序员的小天地:注释中的快乐
  2. shmdt() 与 shmctl() 的区别
  3. 同时运行两个PHP吗,PHP-避免由两个工作人员同时运行后台作业
  4. php设计之初用于什么,PHP设计模式(七)之门面模式
  5. [iBoard 电子学堂][第二卷 C程序设计语言 ]第二篇 数据类型与运算符
  6. 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
  7. RealVIZ Stitcher Unlimited v5.5.1 1CD
  8. Zen coding
  9. SCM供应链管理系统解决方案:实现供应可视化、管理信息化,成本可控化
  10. 32位Linux系统时间截止,linux – 如果系统设置为2038年以后的日期,则ntpdate失败
  11. comsol奶酪模型 comsol多孔材料
  12. intellij no executable code found at line
  13. [经济管理]《余世维-有效沟通II》VOB AVI双版本下载及我的笔记
  14. .mht文件转换为html
  15. iOS—知乎日报总结
  16. Python 绘制隐函数图像
  17. 发送企业微信工资条消息
  18. 论文Pyramid Attention Network for Semantic Segmentation笔记
  19. 机器学习日记(13)
  20. mx250 计算能力_mx250相当于gtx多少 性能接近

热门文章

  1. 简单封装POI导出excel
  2. think php left join,Thinkphp两张数据表left join怎么让相同字段不被覆盖?
  3. java单一登录_java实现单一登录 踢人效果
  4. .net core精彩实例分享 -- 应用配置和数据库访问
  5. SQL 2019——新特征
  6. php 目录管理,PHP_php目录管理函数小结,chdir : 改变目录。 dir : 目录类 - phpStudy...
  7. 创建一个delete触发器_基于 Django 信号机制实现类似触发器的效果
  8. teamspeak3服务器搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!
  9. mysql练习(重)
  10. java-io流理解