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

时间:2023-02-09 14:57:31
<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">醉醉哒</span>

 

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


本文主要是整理介绍一下“自定义View"的 一些容易踩坑的地方和一些优化,其中包括自定义属性、手势交互以及优化自定View的具体点,这边可能需要读者们对"如何创建一个自定义View"有一定的了解或者实践,至于还没接触过自定义View的读者们可以查看官网: http://developer.android.com/intl/zh-cn/training/custom-views/create-view.html(需*)里面介绍得很详细。

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

在此之前我们说说自定义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的自定义属性,然而在官网中没有提到这个:
自定义View——坑、技巧、调优

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:编辑器太难用了,太难用了。严重打击了我的写博客的欲望.