<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、Scrollerhttp://developer.android.com/intl/zh-cn/reference/android/view/GestureDetector.htmlhttp://www.cnblogs.com/sw926/p/3208158.html;http://blog.csdn.net/pi9nc/article/details/39583377;http://blog.csdn.net/gemmem/article/details/7321910。

5.  Android中自己定义属性的格式具体解释

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——坑、技巧、调优的更多相关文章

  1. 如何合理的规划一次jvm性能调优

    https://blog.csdn.net/miracle_8/article/details/78347172 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的 ...

  2. 如何合理的规划jvm性能调优

    JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...

  3. jvm调优原则

    合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了 ...

  4. 【java虚拟机】jvm调优原则

    转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...

  5. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧

    性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...

  6. iOS-------应用性能调优的25个建议和技巧

    性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...

  7. iOS应用性能调优的25个建议和技巧

    本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...

  8. [转]iOS应用性能调优的25个建议和技巧

    写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...

  9. iOS应用性能调优的25个建议和技巧【转】

    转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation -  ...

随机推荐

  1. 认知 Git 和 GitHub

    今天被一个大牛的大哥问了个问题,问住了.原问题是“你是到github吗?git呢?” 我堂而皇之的说,“他们不是同一个吗?” 结果大牛大哥狠狠地回了我一句“百度去”..好吧我乖乖去百度了. 这是我百度 ...

  2. jersey+jetty实现文件上传

    服务配置与启动类 import org.glassfish.jersey.servlet.ServletContainer; import javax.ws.rs.Path; import org.e ...

  3. Lusac定理

    转载大佬的模版:http://www.cnblogs.com/vongang/archive/2012/12/02/2798138.html

  4. Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

    1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片 ...

  5. 29.局部和全局重载new delete

    #include <iostream> #include <Windows.h> using namespace std; //全局内存管理,统计释放内存,分配内存 //重载全 ...

  6. Mysql数据库的瓶颈处理一点建议

    Mysql数据库的瓶颈处理一点建议         我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈的出 ...

  7. Android线程间通讯的几种方式

    1.runOnUiThread(Runnable)              在子线程中直接使用该方法,可以更新UI runOnUiThread(new Runnable(){//更新UI       ...

  8. Spring源码分析专题 —— 阅读指引

    阅读源码的意义 更深入理解框架原理,印象更深刻 学习优秀的编程风格.编程技巧.设计思想 解决实际问题,如修复框架中的bug,或是参考框架源码,结合实际业务需求编写一个独有的框架 阅读源码的方法 首先是 ...

  9. 【2017"百度之星"程序设计大赛 - 初赛(A)】度度熊的01世界

    [链接]http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1006 [题意] 在这里写题意 [题 ...

  10. StartCoroutine的使用

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的.这个时候能够使用协程来完毕. 使 ...