自定义View(四)自定义图片和文字居中的TextView

it2023-05-24  69

思路:

很简单,就是利用getCompoundDrawables()方法拿到一个数组Drawable[] drawables 这里的drawables数组是有四个值,分别是drawables[0]、drawables[1]、drawables[2]、drawables[3] 这四个值分别对应文字左、上、右、下的图片Drawable值 最后再计算宽度,来绘制移动画布进行自适应实现图片和文字居中的效果。

具体请看下面的onDraw()方法实现

实现:

package com.yan.myview.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.view.Gravity; public class DrawableCenterTextView extends androidx.appcompat.widget.AppCompatTextView { public DrawableCenterTextView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { // 获取TextView的Drawable对象,返回的数组对应左上右下 Drawable[] drawables = getCompoundDrawables(); Drawable drawable; if ((drawable = drawables[0]) != null) { setGravity(Gravity.START | Gravity.CENTER_VERTICAL); // 当左边Drawable的不为空时,测量要绘制文本的宽度 float textWidth = getPaint().measureText(getText().toString()); int drawablePadding = getCompoundDrawablePadding(); int drawableWidth = drawable.getIntrinsicWidth(); // 计算总宽度(文本宽度 + drawablePadding + drawableWidth) float bodyWidth = textWidth + drawablePadding + drawableWidth; if (getWidth() - bodyWidth > 0) { // 移动画布开始绘制的X轴 canvas.translate((getWidth() - bodyWidth - getPaddingRight() - getPaddingLeft()) / 2, 0); } } else if ((drawable = drawables[1]) != null) { setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); // 否则如果上边的Drawable不为空时,获取文本的高度 Rect rect = new Rect(); getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect); float textHeight = rect.height(); int drawablePadding = getCompoundDrawablePadding(); int drawableHeight = drawable.getIntrinsicHeight(); // 计算总高度(文本高度 + drawablePadding + drawableHeight) float bodyHeight = textHeight + drawablePadding + drawableHeight; if (getHeight() - bodyHeight > 0) { // 移动画布开始绘制的Y轴 canvas.translate(0, (getHeight() - bodyHeight - getPaddingTop() - getPaddingBottom()) / 2); } } else if ((drawable = drawables[3]) != null) { setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); // 否则如果上边的Drawable不为空时,获取文本的高度 Rect rect = new Rect(); getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect); float textHeight = rect.height(); int drawablePadding = getCompoundDrawablePadding(); int drawableHeight = drawable.getIntrinsicHeight(); // 计算总高度(文本高度 + drawablePadding + drawableHeight) float bodyHeight = textHeight + drawablePadding + drawableHeight; if (getHeight() - bodyHeight > 0) { // 移动画布开始绘制的Y轴 canvas.translate(0, -(getHeight() - bodyHeight - getPaddingTop() - getPaddingBottom()) / 2); } } else if ((drawable = drawables[2]) != null) { setGravity(Gravity.START | Gravity.CENTER_VERTICAL); // 当左边Drawable的不为空时,测量要绘制文本的宽度 float textWidth = getPaint().measureText(getText().toString()); int drawablePadding = getCompoundDrawablePadding(); int drawableWidth = drawable.getIntrinsicWidth(); // 计算总宽度(文本宽度 + drawablePadding + drawableWidth) float bodyWidth = textWidth + drawablePadding + drawableWidth; if (getWidth() - bodyWidth > 0) { // 移动画布开始绘制的X轴 canvas.translate(-(getWidth() - bodyWidth - getPaddingRight() - getPaddingLeft()) / 2, 0); } } else { setGravity(Gravity.CENTER); } super.onDraw(canvas); } }

写在最后:原创不易,觉得对自己有帮助的小老弟,欢迎点赞评论~~~

最新回复(0)