自定义控件1
来源:互联网 发布:淘宝退款率高了怎么办 编辑:程序博客网 时间:2024/06/07 03:23
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个:
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
鸿洋的博客写的确实挺好的,就按这篇来实现吧。
接着来写圆角图片。
第二个:右上角三角标
第三个:右上角消息数字
- 自定义控件1--自定义属性
- SharePoint自定义控件(1)
- 自定义控件1
- Android自定义控件--1
- Xcode6.1自定义控件
- android 自定义控件 1
- Android自定义控件1
- 自定义控件1---TextView
- Android 自定义控件1
- Android自定义控件1
- 自定义控件分析1
- 自定义控件笔记(1)
- android 自定义控件1
- 自定义控件1
- 自定义控件(1)HelloWorld
- 自定义控件(1)
- 控件开发-扩展自定义验证控件1
- WPF控件开发之自定义控件(1)
- 【机器学习】浅谈聚类算法
- SpringMvc国际化
- python tool
- 利用XSS钓鱼英语老师
- 为什么开通博客
- 自定义控件1
- centos分区方案
- Spring 整合 Hibernate
- OCR识别火车票(未实现,先记录)
- java 1.8新特性
- JAVA开发之 2-JRE与JDK及JVM的区别
- js,jsp页面传值的两种方式
- 常用Git命令清单
- Xcode8---ios9.2一下崩溃问题