android 镂空字体下载,Android开发TextvView实现镂空字体效果

该博客介绍了如何创建一个自定义的HollowTextView,通过继承AppCompatTextView并利用PorterDuff模式实现文字镂空效果。关键步骤包括初始化属性、设置画笔、在onDraw方法中绘制背景和文字,并在布局文件中配置相关属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1557014fd930d1c83e8293a2d3333235.png

记录一下...

自定义TextView

public class HollowTextView extends AppCompatTextView {

private Paint mTextPaint, mBackgroundPaint;

private Bitmap mBackgroundBitmap,mTextBitmap;

private Canvas mBackgroundCanvas,mTextCanvas;

private RectF mBackgroundRect;

private int mBackgroundColor;

private float mCornerRadius;

public HollowTextView(Context context) {

this(context,null);

}

public HollowTextView(Context context, AttributeSet attrs) {

super(context, attrs);

initAttrs(attrs,0);

initPaint();

}

public HollowTextView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

initAttrs(attrs,defStyleAttr);

initPaint();

}

private void initAttrs(AttributeSet attrs,int defStyleAttr){

if(attrs == null){

return;

}

TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.HollowTextView, defStyleAttr, 0);

mBackgroundColor = typedArray.getColor(R.styleable.HollowTextView_hollowTextView_background_color, Color.TRANSPARENT);

mCornerRadius = typedArray.getDimension(R.styleable.HollowTextView_hollowTextView_corner_radius,0);

typedArray.recycle();

}

/***

* 初始化画笔属性

*/

private void initPaint() {

//画文字的paint

mTextPaint = new Paint();

//这是镂空的关键

mTextPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

mTextPaint.setAntiAlias(true);

mBackgroundPaint = new Paint();

mBackgroundPaint.setColor(mBackgroundColor);

mBackgroundPaint.setAntiAlias(true);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

mBackgroundBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);

mBackgroundCanvas = new Canvas(mBackgroundBitmap);

mTextBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_4444);

mTextCanvas = new Canvas(mTextBitmap);

mBackgroundRect = new RectF(0,0,getWidth(),getHeight());

}

@Override

protected void onDraw(Canvas canvas) {

//这里给super传入的是mTextCanvas,把一些基本属性都支持进去

super.onDraw(mTextCanvas);

drawBackground(mBackgroundCanvas);

int sc;

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ){

sc = canvas.saveLayer(0,0,getMeasuredWidth(),getMeasuredHeight(),null);

}else {

sc = canvas.saveLayer(0,0,getMeasuredWidth(),getMeasuredHeight(),null,Canvas.ALL_SAVE_FLAG);

}

canvas.drawBitmap(mBackgroundBitmap,0,0,null);

canvas.drawBitmap(mTextBitmap, 0, 0, mTextPaint);

canvas.restoreToCount(sc);

}

private void drawBackground(Canvas canvas){

if(mCornerRadius > 0){

canvas.drawRoundRect(mBackgroundRect,mCornerRadius,mCornerRadius, mBackgroundPaint);

}else {

canvas.drawColor(mBackgroundColor);

}

}

attr.xml文件

xml中使用

android:id="@+id/hollowtext"

android:layout_width="60dp"

android:layout_height="50dp"

android:gravity="center"

android:text="99+"

android:textSize="30sp"

android:textStyle="bold"

app:hollowTextView_background_color="@color/white"

app:hollowTextView_corner_radius="5dp"

android:layout_centerInParent="true"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值