醉醉哒
相信有创建过“自定义View”经验的众多的开发者朋友当中有相当一部分人猿友是直接copy网上的一些代码拿来用,结果往往不尽如人意,碰到bug或者是需求发生变化时往往手忙脚乱,android自定义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、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;
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”如:
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:编辑器太难用了,太难用了。严重打击了我的写博客的欲望.