自定义TextView实现艺术体

来源:互联网 发布:激光笔软件 编辑:程序博客网 时间:2024/06/05 23:39

         今天自定义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"        />
好啦,我们费了这么大的功夫终于可以看我们实现的效果啦。











0 0
原创粉丝点击