弧形显示的texview

在大家开发中可能会用到texview显示 要弧形的显示效果,一般google再带的textview不能满足,所以要自己自定义view去绘制。下面是我自己重写的一个自定义的view ,在onDraw中自己的实现操作。

1.setText(String text, int textSize, int radius, int color)该方法是 要传的参数,text:要显示的字符 textSize:字体大小 radius 该控件的半径 因为要弧形显示,所以需要drawTextOnPath方法实现沿着Path绘制文本,原理就是 绘制一个圆,根据圆的弧度来显示 color:颜色值

package com.lingan.seeyou.ui.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

/**
* 弧形 显示的textview
* Created by wmj on 2015/11/5.
*/
public class ArcTextView extends View {

private Context mContext;
//内容画笔
private Paint mPaintText;

public ArcTextView(Context context) {
    super(context);
    mContext = context;
    init();
}

public ArcTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    init();
}

public ArcTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mContext = context;
    init();
}


public void init() {
    //内容
    mPaintText = new Paint();
    mPaintText.setAntiAlias(true);
    mPaintText.setFlags(Paint.ANTI_ALIAS_FLAG);
}

private String mText = "";
private int mRadius = 20;
private int mColor;
private int mTextSize;

public void setText(String text, int textSize, int radius, int color) {
    int mDensity = (int) getResources().getDisplayMetrics().density;
    mText = text;
    mColor = getResources().getColor(color);
    mTextSize = textSize * mDensity;
    mRadius = radius;
    mPaintText.setColor(mColor);
    mPaintText.setTextSize(mTextSize);
    mPaintText.setStyle(Paint.Style.FILL);
    invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    drawTextView(canvas);
}

private Path mPath;

private void drawTextView(Canvas canvas) {
    if (mPath == null) {
        mPath = new Path();
        RectF rectF = new RectF(0, 0, mRadius * 2, mRadius * 2);
        mPath.addOval(rectF, Path.Direction.CCW);
    }
    Rect rectText = new Rect();
    mPaintText.getTextBounds(mText, 0, mText.length(), rectText);
    int textWidth = rectText.width();
    int textWidthHalf = textWidth / 2;
    double hudu = Math.asin(textWidthHalf / (mRadius * 1.0f));
    double angle = hudu * 180 / Math.PI;
    Log.d("ArcTextView", "-->angle:" + angle + "--hudu:" + hudu);
    canvas.rotate((float) (90 + angle), getWidth() / 2, getHeight() / 2);
    canvas.drawTextOnPath(mText, mPath, 0, -10, mPaintText);
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值