自己定义View——坑、技巧、调优
<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">醉醉哒</span>
相信有创建过“自己定义View”经验的众多的开发人员朋友其中有相当一部分人猿友是直接copy网上的一些代码拿来用,结果往往不尽如人意。碰到bug或者是需求发生变化时往往手忙脚乱。android自己定义View你真的知道么???
本文主要是整理介绍一下“自己定义View"的 一些easy踩坑的地方和一些优化。其中包含自己定义属性、手势交互以及优化自定View的具体点。这边可能须要读者们对"怎样创建一个自己定义View"有一定的了解或者实践。至于还没接触过自己定义View的读者们能够查看官网:http://developer.android.com/intl/zh-cn/training/custom-views/create-view.html(需翻墙)里面介绍得非常具体。
在此之前我们说说自己定义View 你一定须要知道的知识点:
1. invalidate():当view的某些内容发生变化的时候,须要调用invalidate来通知系统对这个view进行redraw http://developer.android.com/intl/zh-cn/reference/android/view/View.html#invalidate(。
2. requestLayout(:当某些元素变化会引起组件大小变化时,须要调用requestLayout方法 http://developer.android.com/intl/zh-cn/reference/android/view/View.html#requestLayout( ;
3.View的三大绘制流程:onMeasure()、onLayout()、onDraw();
4. 手势辅助类:GestureDetector、ViewDragHelper、Scroller:http://developer.android.com/intl/zh-cn/reference/android/view/GestureDetector.html;http://www.cnblogs.com/sw926/p/3208158.html;http://blog.csdn.net/pi9nc/article/details/39583377;http://blog.csdn.net/gemmem/article/details/7321910。
6. Paint Canvas
自己定义VIew具体调优建议:
1. 在Gradleproject中,始终使用 http://schemas.android.com/apk/res-auto的自己定义属性,然而在官网中没有提到这个:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2. 假设你的view是一个inner class。你必须指定这个view的outer class。
相同的,假设PieChart有一个inner
class 叫做PieView。
为了使用这个类中自设的属性。你应该使用com.example.customviews.charting.PieChart$PieView.
3. 在属性定义时指定多种类型值。比方说 我设置VIew的背景能够是“@drawable/图片ID”也能够是“#00FF00”如:
<attr name = "background" format = "reference|color" />
4. 使用obtainStyledAttributes() 来获取属性值 ,这样就不用推断 我的属性设置的是实际数据“str/#color”还是“@resID”了,使用方法如:
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对象是一个共享资源,必须被在使用后进行回收。
5. 发生动态行为时採用invalidate()
and requestLayout();
6. android:contentDescription属性标记输入字段 与sendAccessibilityEvent()在适当的时候通过调用发送訪问事件。參考:http://developer.android.com/intl/zh-cn/guide/topics/ui/accessibility/apps.html#custom-views和 Android无障碍服务 让应用具有辅助性服务.
7. 初始化时创建对象;不要在onDraw方法内创建绘制对象;
8. 让View支持 wrap_content 和 padding;
9.使用手势监听处理UI交互:GestureDetector;
10.使用过渡平滑:property
animation framework;
12.另外尽可能的降低绘制 即调用OnDraw();大多数时候导致onDraw都是由于调用了invalidate().因此请尽量降低调用invaildate() 的次数。假设可能的话,尽量调用 含有4个參数的invalidate() 方法而不是没有參数的invalidate()。没有參数的invalidate会强制重绘整个view。
13.另外一个非常耗时的操作是请求layout。不论什么时候运行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每个view的大小。假设找到有冲突的值,它会须要又一次计算好几次。另外须要尽量保持View的层级是扁平化的,这样对提高效率非常有帮助。
14.使用硬件加速 http://developer.android.com/intl/zh-cn/guide/topics/graphics/hardware-accel.html
15. 状态的存储与恢复:假设内存不足。而恰好我们的Activity置于后台,不幸被重新启动,或者用户旋转屏幕造成Activity重新启动,我们的View应该也能尽可能的去保存自己的属性。
--------------------------------------------------------------------------------------------------------------------
Ps:编辑器太难用了。太难用了。严重打击了我的写博客的欲望.
自己定义View——坑、技巧、调优的更多相关文章
- 如何合理的规划一次jvm性能调优
https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...
- 如何合理的规划jvm性能调优
JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...
- jvm调优原则
合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...
- 【java虚拟机】jvm调优原则
转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...
- 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧
性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...
- iOS-------应用性能调优的25个建议和技巧
性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...
- iOS应用性能调优的25个建议和技巧
本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...
- [转]iOS应用性能调优的25个建议和技巧
写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...
- iOS应用性能调优的25个建议和技巧【转】
转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation - ...
随机推荐
- CSS盒子模型图
下面这张图,是W3C标准的CSS盒子模型: 由上图可以清楚的看出各个部分的CSS属性.
- HDU 4731 Minimum palindrome 打表找规律
http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...
- python 时间库的用法 时区的转化
1. 月份的加减 https://blog.csdn.net/qq_18863573/article/details/79444094 第三方模块:python-dateutil import dat ...
- Flask框架简介
Flask框架诞生于2010年,是Armin ronacher 用python语言基于Werkzeug工具箱编写的轻量级Web开发框架! Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展. ...
- Spring 实现数据库读写分离(转)
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...
- linux6.0系统如何安装portmap
因为在6.0的系统里,portmap已经改名了.在Redhat或CentOS5中可以使用 service portmap start启动服务,然后在启动nfs服务,实现挂载. 6里面可是试试 serv ...
- 随时查看源码的网站---http://www.sooset.com/
由于工作需要经常要在Windows平台下参阅linux源码,以前都用http://lxr.linux.no/来浏览源码(如下图所示),最近发现sooset来浏览更方便,所以介绍给大家分享. 650) ...
- react+react-router+mobx+element打造管理后台系统---react-amdin-element
react-admin-element,一款基于react的后台管理系统. 那么我们和其他的后台管理系统有什么区别呢? demo地址:点我进入demo演示 github地址:点我进入github 1. ...
- BZOJ2631: tree(LCT)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- CISP/CISA 每日一题 10
CISA 每日一题(答)一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓库 ...