自定义控件1

0508
算作是学习记录吧!
自定义控件有两部分:1 自定义View 2自定义ViewGroup
先从自定义View来吧。
第一个:圆角图片
继承View之后,有四个构造方法:

    public CircleImg(Context context) {
        super(context);
    }

    public CircleImg(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CircleImg(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //第四个,要求API21以上
    public CircleImg(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)  {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

说明
如果在Code中实例化一个View会调用第一个构造函数,
如果在xml中定义会调用第二个构造函数,
而第三个函数系统是不调用的,要由View(我们自定义的或系统预定义的View,如此处的CustomTextView和Button)显式调用,比如在这里我们在第二个构造函数中调用了第三个构造函数,并将R.attr.CustomizeStyle传给了第三个参数。

查找使用属性值的优先级顺序是:

attr > style > defStyleAttr > defStyleRes > Theme

defStyleAttr和defStyleRes功能一样,指定的资源形式不同。

Android中自定义样式与View的构造函数中的第三个参数defStyle的意义 - AndyLizh的专栏 - 博客频道 - CSDN.NET

很多夜间模式就是这只theme来做的,设置之后的刷新操作呢?啥时候整一下夜间模式?

这个弄清楚了,整一下自定义属性。
View 的三个核心方法:onMeasure、onLayout、onDraw.
自定义属性有9个:

1 reference 参考指定Theme中资源ID,这个类型意思就是你传的值可以说引用资源
2 string 字符串,如果你想别人既能直接写值也可以用类似"@string/test"引用资源的方式,可以写成format="string/reference"
3 color 颜色
4 dimension 尺寸值
5 boolean 布尔值
6 integer 整型
7 float 浮点型
8 fraction 百分数
9 enum 枚举,如果你提供的属性只能让别人选择,不能随便传入
10 flag 位或运算

二:自定义属性的声明

通常在values目录下的attrs.xml,如下:

    <declare-styleable name="customVisitingCard">
        <attr name= "background" format ="reference|color" />
        <attr name= "name" fomat ="string" />
        <attr name= "nameColor" format ="color" />
        <attr name= "nameSize" format ="dimension" />
        <attr name= "isShowShadow" format ="boolean" />
        <attr name="age" format="integer" />
        <attr name="percentage" format="fraction" />
        <attr name="shadowX" format="float" />
        <attr name="style">  
            <enum name="STROKE" value="0">enum>  
            <enum name="FILL" value="1">enum>  
        attr>
        <attr name="position">
            <flag name="boss" value="0" />
            <flag name="manager" value="1" />
            <flag name="employee" value="2" />
        attr>
    declare-styleable >

问题有两个:1 flag是怎么回事? 2 color|reference,如何在获取时区分?

关于flag,参考Android中自定义属性的格式详解 - 为梦想而努力(马英才) - 博客频道 - CSDN.NET

关于2:
View的原码

final TypedArray a = context.obtainStyledAttributes(
                attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
 case com.android.internal.R.styleable.View_background:
                    background = a.getDrawable(attr);
                    break;

这里用 getDrawable(attr)就搞定了,如何搞定的呢?要不是走一遍原码?纠结中。。。。
先不过吧,有空再说,原码比较复杂,耗时太多。

0512
接着来写吧。
圆角图片应该有哪几个属性呢?
1、圆角的半径是要的吧,如果是正方形的图片,50%的半径不就是圆形图片了吗?

好像这一个属性就够了吧。不过可以试着拓展一下,比如:
1、如果是50%的话,圆形图片,可以添加一个道边框,边框有宽度和颜色
2、如果原图不是正方形的图片呢?也要制作圆形图片,怎么处理?
这两个图片,先不处理,把圆角图片弄好再说。

0515
写着写着,发现还是不会写,知道要用PorterDuffXfermode来实现,可到底咋写呢?
首先卡在绘制圆形图片上,想想第一种方式:xml定义一个shape文件,读取,第二种方式,canvas绘制。
方式是有了,到底咋写呢?
一头雾水,确实是API不熟悉,到底咋用不晓得,参数传啥,drawable和bitmap,bitmapfactory,等等都不清楚。
Canvas也忘得差不多了。还有TypedArray 也忘了。
好吧,从整理API开始。理个顺序:TypeArray,Canvas,Drawable,Bitmap,BitmapFactory,Paint,等等等等。

API-TypedArray - qq_20198405的博客 - 博客频道 - CSDN.NET
Canvas - qq_20198405的博客 - 博客频道 - CSDN.NET

TypedArray ,come on!

8.2.1 Bitmap(位图)全解析 Part 1 | 菜鸟教程
看完了Bitmap的相关知识,觉得没必要挨个看API,太浪费时间了。
重点的知识:

  • Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框!
  • Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以 进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作!
  • Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔), 来画各种形状或者写字,又可以用Path(路径)来绘制多个点,然后连接成各种图形!
  • Matrix(矩阵):用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的 平移,缩放,旋转,倾斜等!

Android 完美实现图片圆角和圆形(对实现进行分析) - Hongyang - 博客频道 - CSDN.NET
http://blog.csdn.net/lmj623565791/article/details/24555655

鸿洋的博客写的确实挺好的,就按这篇来实现吧。

接着来写圆角图片。

第二个:右上角三角标

第三个:右上角消息数字

你可能感兴趣的:(【Android,自定义控件】)