上一篇文章简单讲述了View控件的四个构造方法,这篇文章在此基础上要实现一个产生随机数的文字控件。
一、在attrs.xml中添加自定义属性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomTitleView">
<attr name="titleText" />
<attr name="titleTextColor" />
<attr name="titleTextSize" />
</declare-styleable>
<attr name="titleText" format="string" />
<attr name="titleTextColor" format="color" />
<attr name="titleTextSize" format="dimension" />
</resources>
二、重写SimpleView_01的三个构造方法:
public SimpleView_01(Context context) {
//调用自身的构造方法二
this(context, null);
Log.e("SimpleView构造方法一", "被执行");
}
public SimpleView_01(Context context, AttributeSet attrs) {
//调用自身的构造方法三
this(context, attrs, 0);
Log.e("SimpleView构造方法二", "被执行");
}
public SimpleView_01(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.e("SimpleView构造方法三", "被执行");
/**
* 获得我们所定义的自定义样式属性
*/
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyleAttr, 0);
int length = a.getIndexCount();
for (int i = 0; i < length; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.CustomTitleView_titleText:
mTitleText = a.getString(attr);
Log.e("mTitleText", mTitleText);
break;
case R.styleable.CustomTitleView_titleTextColor:
mTitleTextColor = a.getInt(attr, Color.BLACK);
Log.e("mTitleTextColor", ""+mTitleTextColor);
break;
case R.styleable.CustomTitleView_titleTextSize:
// 默认设置为16sp,TypeValue也可以把sp转化为px
mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
Log.e("mTitleTextSize", ""+mTitleTextSize);
break;
}
}
a.recycle();
/**
* 获得绘制文本的宽和高
*/
mPaint = new Paint();
mPaint.setTextSize(mTitleTextSize);
// mPaint.setColor(mTitleTextColor);
mBound = new Rect();
mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);
this.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mTitleText = randomText();
//重新绘制页面
postInvalidate();
}
});
}
private String randomText()
{
Random random = new Random();
Set<Integer> set = new HashSet<Integer>();
while (set.size() < 4)
{
int randomInt = random.nextInt(10);
set.add(randomInt);
}
StringBuffer sb = new StringBuffer();
for (Integer i : set)
{
sb.append("" + i);
}
return sb.toString();
}
三、重写SimpleView_02控件的onMeasure
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = 0;
int height = 0;
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:
width = getPaddingLeft() + getPaddingRight() + specSize;
break;
case MeasureSpec.AT_MOST:
width = getPaddingLeft() + getPaddingRight() + mBound.width();
break;
}
specMode = MeasureSpec.getMode(widthMeasureSpec);
specSize = MeasureSpec.getSize(widthMeasureSpec);
switch (specMode) {
case MeasureSpec.EXACTLY:
height = getPaddingTop() + getPaddingBottom() + specSize;
break;
case MeasureSpec.AT_MOST:
height = getPaddingTop() + getPaddingBottom() + mBound.height();
break;
}
setMeasuredDimension(width,height);
}
四、重写SimpleView_02控件的onDraw
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.GREEN);
canvas.drawRect(0, 0, getMeasuredWidth(),getMeasuredHeight(), mPaint);
mPaint.setColor(mTitleTextColor);
// canvas.drawText(mTitleText, getWidth()/2-mBound.width(), getHeight()/2+mBound.height()/2,mPaint);
canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
}
五、效果图
点击文字,文字会产生变化,如图