前面只是简单说了自定义View,接下来我们再来个增强版——自定义View的属性
1、自定义View的属性,首先在res/value服务器托管网s/ 下建立一个attrs.xml , 在里面定义我们的属性。
这里简单介绍一下控件的常用属性
format的取值及使用
1.Reference:引用类型,参考某一资源ID
(1)属性定义:
(2)属性使用:
2. color:颜色值。
(1)属性定义:
(2)属性使用:
3. boolean:布尔值。
(1)属性定义:
(2)属性使用:
4. dimension:尺寸值。
(1)属性定义:
(2)属性使用:
5. float:浮点值。
(1)属性定义:
(2)属性使用:
6. integer:整型值。
(1)属性定义:
(2)属性使用:
7. string:字符串。
(1)属性定义:
(2)属性使用:
8. fraction:百分数类型。
(1)属性定义:
(2)属性使用:
9. enum:枚举值。
(1)属性定义:
(2)属性使用:
10. flag:位或运算。
(1)属性定义:
(2)属性使用:
注意:
属性定义时可以指定多种类型值。
(1)属性定义:
(2)属性使用:
11. 多类型
2、在布局文件中声明我们的View
这里要强调的一点就是,一定要引入我们自己的名称空间(我绿色标注的部分),后面的包路径指的是项目的包名。
3、在View的构造方法中,获得我们的自定义的属性
public class CustomAttrView extends View {
private String mStrText;
private int mTextColor;
private int mTextSize;
/**
* 绘制时控制文本绘制的范围
*/
private Rect mBound;
private Paint mPaint;
public CustomAttrView(Context context) {
this(context, null);
}
public CustomAttrView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
// 获得自定义的样式属性
public CustomAttrView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
/**
* 获得自定义样式属性
*/
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.CustomAttrView, defStyle, 0);
// int n = typedArray.getIndexCount();
// for (int i = 0; i
4、重写onDraw,调用系统提供的onMesure方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setColor(Color.BLUE);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);
mPaint.setColor(mTextColor);
canvas.drawText(mStrText, getWidth() / 2 - mBound.width() / 2,
getHeight() / 2 + mBound.height() / 2, mPaint);
}
此时效果如下:
但是此时如果我们把布局文件的宽和高写成wrap_content,会发现效果和我们想的并不一样:
这是因为系统帮我们测量的高度和宽度都是MATCH_PARNET,当我们设置明确的宽度和高度时,系统帮我们测量的结果就是我们设置的结果,当我们设置为WRAP_CONTENT或者MATCH_PARENT系统帮我们测量的结果就是MATCH_PARENT的长度。
所以,当设置了WRAP_CONTENT时,我们需要自己进行测量,即重写onMesure方法,重写之前先了解下MeasureSpec的specMode的类型:
EXACTLY:一般是设置了明确的值或者是MATCH_PARENT
AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT
UNSPECIFIED:表示子布局想要多大就多大,很少使用
下面是我们重写onMeasure代码:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = 0;
int height = 0;
/**
* 设置宽度
*/
int specMode = MeasureSpec.getMod服务器托管网e(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:// 明确指定了
width = getPaddingLeft() + getPaddingRight() + specSize;
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
width = getPaddingLeft() + getPaddingRight() + mBound.width();
break;
}
/**
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:// 明确指定了
height = getPaddingTop() + getPaddingBottom() + specSize;
break;
case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT
height = getPaddingTop() + getPaddingBottom() + mBound.height();
break;
}
setMeasuredDimension(width, height);
}
现在我们可以对高度、宽度进行随便的设置了,基本可以满足我们的需求。
当然了我们这个自定义View与TextView相比还没什么区别,但是前面的例子已经提到,我们可以给View添加一些监听事件,代码就不写了,想看的话可以下载源码。
源代码
参考:
http://www.jb51.net/article/32172.htm
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 短说通用版 V3.9.3正式版发布|频道支持、APP游客购买等功能
Hi大家好,我是给你们带来惊喜的运营小番茄。 本期更新为短说通用版 3.9.3正式版。本次3.9.3版本主要修复了V3.9.2正式版中的问题。涉及平台有H5、App、微信小程序。本期V3.9版本功能更新介绍可查看往期文章详细了解:想天软件短说通用版 3.9.0…