Android自定义View基础知识

一.declare-styleable 中的 format 枚举

属性名 属性说明 使用示例
reference 引用某一个资源Id app:custParams="@drawable/id"
color 颜色 app:custParams="@color/id"
boolean 布尔值 app:custParams="true"
dimension 尺寸 app:custParams="20dp"
float 浮点值 app:custParams="0.7"
integer 整型 app:custParams="10"
string 字符串 app:custParams="自定义属性"
fraction 百分比 app:custParams="50%"
enum 枚举值 app:custParams="Vertical"
flag 位或运算 app:custParams="LEFT/TOP"

一般来说,属性声明方式为:



enum、flag的声明比较特殊



      
      



      
      

二 自定义View的四个构造函数
在自定义View时,分别有不同参数的4个构造函数,它们分别被谁调用的?

  /**
   * 最简单的构造函数
   * Simple constructor to use when creating a view from code.
   * @param context The Context the view is running in, 
   * through which it can access the current theme, resources, etc.
   */
   public View(Context context)

参数只有上下文的构造函数,一般使用系统默认主题及属性,该方法通常由java代码生成一个控件实例时调用该构造方法,例如以下的使用方式:

ImageView image = new ImageView(MainActivity.this)
   /**
     * Constructor that is called when inflating a view from XML. This is called
     * when a view is being constructed from an XML file, supplying attributes
     * that were specified in the XML file. This version uses a default style of
     * 0, so the only attribute values applied are those in the Context's Theme
     * and the given AttributeSet.
     *
     * 

* The method onFinishInflate() will be called after all children have been * added. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. * @param attrs The attributes of the XML tag that is inflating the view. * @see #View(Context, AttributeSet, int) */ public View(Context context, @Nullable AttributeSet attrs)

当从XML文件构造视图时该构造方法被调用,提供在XML文件中指定的属性。 此版本使用默认样式为0,因此所应用的属性值是Context's Theme和给定AttributeSet中的属性值。

    /**
     * Perform inflation from XML and apply a class-specific base style from a
     * theme attribute. This constructor of View allows subclasses to use their
     * own base style when they are inflating. For example, a Button class's
     * constructor would call this version of the super class constructor and
     * supply R.attr.buttonStyle for defStyleAttr; this
     * allows the theme's button style to modify all of the base view attributes
     * (in particular its background) as well as the Button class's attributes.
     *
     * @param context The Context the view is running in, through which it can
     *        access the current theme, resources, etc.
     * @param attrs The attributes of the XML tag that is inflating the view.
     * @param defStyleAttr An attribute in the current theme that contains a
     *        reference to a style resource that supplies default values for
     *        the view. Can be 0 to not look for defaults.
     * @see #View(Context, AttributeSet)
     */
    public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)

View(Context context, @Nullable AttributeSet attrs) 使用的是系统自带的主题,也就是当我们在xml中添加View控件,如果不设置View的相关属性值,那么这个View控件会中系统的默认主题中获取对应的属性值.如果你需要为该view自定主题,那么这个构造函数就是你想要的.

    /**
     * Perform inflation from XML and apply a class-specific base style from a
     * theme attribute or style resource. This constructor of View allows
     * subclasses to use their own base style when they are inflating.
     * 

* When determining the final value of a particular attribute, there are * four inputs that come into play: *

    *
  1. Any attribute values in the given AttributeSet. *
  2. The style resource specified in the AttributeSet (named "style"). *
  3. The default style specified by defStyleAttr. *
  4. The default style specified by defStyleRes. *
  5. The base values in this theme. *
*

* Each of these inputs is considered in-order, with the first listed taking * precedence over the following ones. In other words, if in the * AttributeSet you have supplied <Button * textColor="#ff000000"> * * , then the button's text will always be black, regardless of * what is specified in any of the styles. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. * @param attrs The attributes of the XML tag that is inflating the view. * @param defStyleAttr An attribute in the current theme that contains a * reference to a style resource that supplies default values for * the view. Can be 0 to not look for defaults. * @param defStyleRes A resource identifier of a style resource that * supplies default values for the view, used only if * defStyleAttr is 0 or can not be found in the theme. Can be 0 * to not look for defaults. * @see #View(Context, AttributeSet, int) */ public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)

参考链接:
Android View 四个构造函数详解
Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

你可能感兴趣的:(Android自定义View基础知识)