Android干货Android安卓自定义控件或其他效果

Android 倾斜、描边、自定义字体的TextView

2017-02-20  本文已影响3190人  BRYANB

版权声明:本文为博主原创文章,未经博主允许不得转载。

在项目开发过程中,有许多需求让我们头大,各种不懂的开发的产品经理乱设计。需求是需要倾斜的,用特定的字体,还要带描边。上网了解了下相关资料后,能够灵活使用,满足需求。在这里分享一个关于这样的textview的开发。

第一步:下载好对应的文字库

我这里使用的是华文字体,所以网上下载个华文字体就好了。一般是这样的


Paste_Image.png

也有些后缀名是TTF,这个是一样的,不区分大小写的。。
接下来,在assets文件夹下新建一个文件夹:fonts。注意名字不要建错了。然后就把.ttf文件放进去就搞定了。

第二步:自定义个TextView

由于我们要用到倾斜,所以还是自定义一个TextView比较好,而且这样也方便使用,不然每个地方都要调用重复的方法多麻烦。
在写自定义TextView前,先了解下如何倾斜TextView,描边以及如何使用字体。
1、倾斜TextView:
这个是很简单的,在自定义TextView中,onDraw方法中利用canvas.rotate()就可以了,然后用你的TextView对象把canvas,draw进去就好。如下:
@Override
protected void onDraw(Canvas canvas)
{
//倾斜度45,上下左右居中
canvas.rotate(-7, getMeasuredWidth(), getMeasuredHeight());
outlineTextView.draw(canvas);
super.onDraw(canvas);
}
2、描边字体:
这个主要是用了TextPaint的几个属性而已,没有什么难度。
TextPaint paint = outlineTextView.getPaint();
paint.setStrokeWidth(15);// 描边宽度
paint.setStyle(Paint.Style.STROKE);
outlineTextView.setTextColor(Color.parseColor("#6ec520"));// 描边颜色
outlineTextView:自定义TextView对象
3、使用字体库。
AssetManager mgr = mContext.getAssets();
Typeface tf = Typeface.createFromAsset(mgr, "fonts/huawen.ttf");
DialogRateTextView title = (DialogRateTextView) layout.findViewById(R.id.dialog_title);
title.setTypeface(tf);
这样就搞定了。
4、做点设置就搞定了。也就几个重载方法。
a. @Override
public void setLayoutParams (ViewGroup.LayoutParams params)
{
super.setLayoutParams(params);
outlineTextView.setLayoutParams(params);
}
b. @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 设置轮廓文字
CharSequence outlineText = outlineTextView.getText();
if (outlineText == null || !outlineText.equals(this.getText()))
{
outlineTextView.setText(getText());
postInvalidate();
}
outlineTextView.measure(widthMeasureSpec, heightMeasureSpec);
}
c.@Override
protected void onLayout (boolean changed, int left, int top, int right, int bottom)
{
super.onLayout(changed, left, top, right, bottom);
outlineTextView.layout(left, top, right, bottom);
}
这样就全部搞定了。感觉是不是很简单。希望对大家有帮助。
给个类吧还是,之前是用在自定义dialog上的,之前po上来,懒得改名字了。
DialogRateTextView.java:

    public class DialogRateTextView extends TextView
   {
    private TextView outlineTextView = null;

    private Context mContext;

    public DialogRateTextView(Context context)
    {
    super(context);
    mContext = context;
    outlineTextView = new TextView(context);
    init();
    }

    public DialogRateTextView(Context context, AttributeSet attrs)
    {
    super(context, attrs);
    mContext = context;
    outlineTextView = new TextView(context, attrs);
    init();
    }

    public DialogRateTextView(Context context, AttributeSet attrs, int defStyle)
   {
    super(context, attrs, defStyle);
    mContext = context;
    outlineTextView = new TextView(context, attrs, defStyle);
    init();
    }

    public void init()
    {
    TextPaint paint = outlineTextView.getPaint();
    paint.setStrokeWidth(15);// 描边宽度
    paint.setStyle(Paint.Style.STROKE);
    Typeface customFont = Typeface.createFromAsset(mContext.getAssets(), "fonts/huawen.ttf");
    outlineTextView.setTypeface(customFont);
    outlineTextView.setTextColor(Color.parseColor("#6ec520"));// 描边颜色
    outlineTextView.setGravity(getGravity());
    }

    @Override
    public void setLayoutParams (ViewGroup.LayoutParams params)
    {
    super.setLayoutParams(params);
    outlineTextView.setLayoutParams(params);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    // 设置轮廓文字
    CharSequence outlineText = outlineTextView.getText();
    if (outlineText == null || !outlineText.equals(this.getText()))
    {
        outlineTextView.setText(getText());
        postInvalidate();
        }
        outlineTextView.measure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout (boolean changed, int left, int top, int right, int bottom)
    {
        super.onLayout(changed, left, top, right, bottom);
        outlineTextView.layout(left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    //倾斜度45,上下左右居中
    canvas.rotate(-7, getMeasuredWidth(), getMeasuredHeight());
    outlineTextView.draw(canvas);
    super.onDraw(canvas);
    }
   }
上一篇下一篇

猜你喜欢

热点阅读