自定义View——坑、技巧、调优

相信有创建过“自定义View”经验的众多的开发者朋友当中有相当一部分人猿友是直接copy网上的一些代码拿来用,结果往往不尽如人意,碰到bug或者是需求发生变化时往往手忙脚乱,android自定义View你真的知道么???


本文主要是整理介绍一下“自定义View"的 一些容易踩坑的地方和一些优化,其中包括自定义属性、手势交互以及优化自定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. 在Gradle工程中,始终使用 http://schemas.android.com/apk/res-auto的自定义属性,然而在官网中没有提到这个:

2. 如果你的view是一个inner class,你必须指定这个view的outer class。同样的,如果PieChart有一个inner class 叫做PieView。为了使用这个类中自设的属性,你应该使用com.example.customviews.charting.PieChart$PieView.

3. 在属性定义时指定多种类型值,比如说 我设置VIew的背景可以是“@drawable/图片ID”也可以是“#00FF00”如:

[java]  view plain  copy
  1. <attr name = "background" format = "reference|color" />  

4. 使用obtainStyledAttributes() 来获取属性值 ,这样就不用判断 我的属性设置的是实际数据“str/#color”还是“@resID”了,用法如:

[java]  view plain  copy
  1. TypedArray a = context.getTheme().obtainStyledAttributes(  
  2.        attrs,  
  3.        R.styleable.PieChart,  
  4.        00);  
  5.   try {  
  6.       mShowText = a.getBoolean(R.styleable.PieChart_showText, false);  
  7.       mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);  
  8.   } finally {  
  9.       a.recycle();  
  10.   }  
清注意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应该也能尽可能的去保存自己的属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值