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,太浪费时间了。
重点的知识:
Android 完美实现图片圆角和圆形(对实现进行分析) - Hongyang - 博客频道 - CSDN.NET
http://blog.csdn.net/lmj623565791/article/details/24555655
鸿洋的博客写的确实挺好的,就按这篇来实现吧。
接着来写圆角图片。
第二个:右上角三角标
第三个:右上角消息数字