Android基础知识梳理Android 开发知识

Android自定义view的4个构造函数

2019-10-18  本文已影响0人  hahauha

自定义View绘制流程函数调用链(简化版)

20171025162206297.jpeg

一、自定义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

https://blog.csdn.net/abc6368765/article/details/56494434

上一篇下一篇

猜你喜欢

热点阅读