注意点
1. 支持特殊属性
- 支持wrap_content
如果不在onMeasure()中对wrap_content作特殊处理,那么wrap_content属性将失效。
具体原因请看文章:为什么你的自定义View wrap_content不起作用? - 支持padding & margin
如果不支持,那么padding和margin(ViewGroup情况)的属性将失效。
- 对于继承View的控件,padding是在draw()中处理;
- 对于继承ViewGroup的控件,padding和margin会直接影响measure和layout过程。
2 多线程应直接使用post方式
View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。
3. 避免内存泄露
主要针对View中含有线程或动画的情况:当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题。
启动或停止线程/ 动画的方式:
- 启动线程/ 动画:使用view.onAttachedToWindow(),因为该方法调用的时机是当包含View的Activity启动的时刻
- 停止线程/ 动画:使用view.onDetachedFromWindow(),因为该方法调用的时机是当包含View的Activity退出或当前View被remove的时刻
4. 处理好滑动冲突
当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。
自定义View
1. View自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--自定义属性集合:CircleView-->
<!--在该集合下,设置不同的自定义属性-->
<declare-styleable name="CircleView">
<!--在attr标签下设置需要的自定义属性-->
<!--此处定义了一个设置图形的颜色:circle_color属性,格式是color,代表颜色-->
<!--格式有很多种,如资源id(reference)等等-->
<attr name="circle_color" format="color"/>
</declare-styleable>
</resources>
2. 解析自定义属性
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 加载自定义属性集合CircleView
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleView);
// 解析集合中的属性circle_color属性
// 该属性的id为:R.styleable.CircleView_circle_color
// 将解析的属性传入到画圆的画笔颜色变量当中(本质上是自定义画圆画笔的颜色)
// 第二个参数是默认设置颜色(即无指定circle_color情况下使用)
mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED);
// 解析后释放资源,容易遗留
a.recycle();
... // 其他处理
}
3. 在xml布局文件中使用
<!--必须添加schemas声明才能使用自定义属性-->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- 注意添加自定义View组件的标签名:包名 + 自定义View类名-->
<!--设置自定义颜色 app:circle_color-->
<scut.carson_ho.diy_view.CircleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#000000"
android:padding="30dp"
app:circle_color="#FF4081"
/>
</RelativeLayout>