自定义View绘制流程函数调用链(简化版)
一、自定义View的分类:
1.自定义ViewGroup
自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。
例如:应用底部导航条中的条目,一般都是上面图标(ImageView),下面文字(TextView),那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片,使用起来会更加方便。
2.自定义View
在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或其他的View,不包含子View。
例如:制作一个支持自动加载网络图片的ImageView,制作图表等。
PS: 自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦更诸多问题。
View类的四个构造方法
构造1:public View(Context context);
构造2:public View(Context context, @Nullable AttributeSet attrs)
构造3:public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
构造4:public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
构造函数参数说明:
Context - 上下文;
AttributeSet - xml文件中的属性;
int defStyleAttr - Theme中的默认样式;
int defStyleResource - defStyleAttr未使用(为0,或者未匹配到),则应用于View的默认样式;
R.style中系统为view定义了很多默认主题Theme,主题中有对某些属性的默认赋值。
常用的是就是第一,第二个构造函数,后面两个构造方法一般系统不会主动调用,需要手动调用。具体区别看代码注释
CustomView.java
public class CustomView extends View {
/**
* 一般在直接new一个view的时候使用
* @param context
*/
public CustomView(Context context) {
super(context);
}
/**
* 一般在layout文件中使用的时候回调用,关于它的属性(包括自定义属性)都会在attrs中传递进来。
* @param context
* @param attrs
*/
public BigView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//如果在这里这样写就会调用到三个参数的构造方法
//this(context, attrs,0);
}
/**
* @param context
* @param attrs
* @param defStyleAttr 默认的style,指的是当期application或者activity所用的theme中默认的style,
* 且只有明确调用的时候才会生效,
* 如 this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
* 注意:即使在view中使用了style这个属性,也不会调用这个构造方法,所以这个构造方法
* 也不考虑。
*/
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
}
/**
* android5.0以后的api才有,暂不考虑
* 如果第三个参数为0或者没有定义defStyleAttr时,第四个参数才起作用,它是style的引用
* @param context
* @param attrs
* @param defStyleAttr
* @param defStyleRes
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public BigView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
参考文章
https://blog.csdn.net/u010126792/article/details/88890930