今天自定义TextView实现艺术字体,开始将attrs文件创建起,将所有的数据类型写好,再Xml文件引用即可,但在添加字体文件时遇到些问题,它和Eclipse中创建assets文件位置不样,要在src/main/创建。
而且创建好了还是不能用,哎,真烦,太麻烦了,到处找资源,终于皇天不负有心人啊,最中找到了,要在XXX.Iml文件中去配置
好,需要配置的我们已经差不多完了,下面我们进行实战演练。
首先要在values文件夹创建attrs文件,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--定义控件名称所对应的数据类型-->
<attr name="titleText" format="string" />
<attr name="titleTextColor" format="color" />
<attr name="titleTextSize" format="dimension" />
<!--定义控件名称,和所包含的具体类型名称-->
<declare-styleable name="MyTextView">
<attr name="titleText" />
<attr name="titleTextColor" />
<attr name="titleTextSize" />
</declare-styleable>
</resources>
在次我们开始写代码,
public class MyTextView extends View {
/**
* 文本
*/
private String titleText;
/**
* 文本的颜色
*/
private int titleTextColor;
/**
* 文本大小
*/
private int titleTextSize;
/**
* 绘制时控制文本绘制的范围
*/
private Rect bound;
/**
* 设置画笔
*/
private Paint paint;
Typeface typeFace;
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
/**
* 获取我们所自定义样式的属性
* */
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
//在assets文件夹中获取到fonts/CC.ttf字体文件
typeFace = Typeface.createFromAsset(context.getAssets(), "fonts/CC.ttf");
int count = typedArray.getIndexCount();
for (int i = 0; i < count; i++) {
int attr = typedArray.getIndex(i);
switch (attr) {
case R.styleable.MyTextView_titleText:
titleText = typedArray.getString(attr);
break;
case R.styleable.MyTextView_titleTextColor:
//设置默认颜色为黑色
titleTextColor = typedArray.getColor(attr, Color.GREEN);
break;
case R.styleable.MyTextView_titleTextSize:
//默认设置为16sp,TypeValue也可以把sp转化为Px
titleTextSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
break;
}
}
//回收内存
typedArray.recycle();
/**
* 获得绘制文本的宽和高
*/
paint = new Paint();
paint.setTextSize(titleTextSize);
bound = new Rect();
paint.getTextBounds(titleText, 0, titleText.length(), bound);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//MeasureSpec的specMode,一共三类型。
//EXACTLY:一般是设置了明确的值或者是MATCH_PARENT。
//AT_MOST:表示子布局限制在一个最大值内,一般为WARP_CONTENT。
//UNSPECIFIED:表示子布局想要多大就多大,这个很少用.
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heigthMode = MeasureSpec.getMode(heightMeasureSpec);
int heigthSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else {
paint.setTextSize(titleTextSize);
//将字体设置在矩形中
paint.getTextBounds(titleText, 0, titleText.length(), bound);
//得到矩形高度
float textwidth = bound.width();
int desired = (int) (getPaddingLeft() + textwidth + getPaddingRight());
width = desired;
}
if (heigthMode == MeasureSpec.EXACTLY) {
height = heigthSize;
} else {
paint.setTextSize(titleTextSize);
paint.getTextBounds(titleText, 0, titleText.length(), bound);
float textHeigth = bound.height();
int desird = (int) (getPaddingTop() + textHeigth + getPaddingBottom());
height = desird;
}
//将计算出来的大小来保存到设置,系统会获取到值在进行画控件。
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
paint.setColor(Color.GREEN);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint);
paint.setColor(titleTextColor);
//设置字体
paint.setTypeface(typeFace);
canvas.drawText(titleText, getWidth() / 2 - bound.width() / 2, getHeight() / 2 + bound.height() / 2, paint);
}
}
好了,我们应该在布局文件中将attrs文件引入
在布局文件中使用此控件,
<com.tesedome.view.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:titleText="我是一朵花。"
app:titleTextColor="#ffffa272"
app:titleTextSize="50sp"
/>
好啦,我们费了这么大的功夫终于可以看我们实现的效果啦。