思路:
很简单,就是利用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
) {
Drawable
[] drawables
= getCompoundDrawables();
Drawable drawable
;
if ((drawable
= drawables
[0]) != null
) {
setGravity(Gravity
.START
| Gravity
.CENTER_VERTICAL
);
float textWidth
= getPaint().measureText(getText().toString());
int drawablePadding
= getCompoundDrawablePadding();
int drawableWidth
= drawable
.getIntrinsicWidth();
float bodyWidth
= textWidth
+ drawablePadding
+ drawableWidth
;
if (getWidth() - bodyWidth
> 0) {
canvas
.translate((getWidth() - bodyWidth
- getPaddingRight() - getPaddingLeft()) / 2, 0);
}
} else if ((drawable
= drawables
[1]) != null
) {
setGravity(Gravity
.TOP
| Gravity
.CENTER_HORIZONTAL
);
Rect rect
= new Rect();
getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect
);
float textHeight
= rect
.height();
int drawablePadding
= getCompoundDrawablePadding();
int drawableHeight
= drawable
.getIntrinsicHeight();
float bodyHeight
= textHeight
+ drawablePadding
+ drawableHeight
;
if (getHeight() - bodyHeight
> 0) {
canvas
.translate(0, (getHeight() - bodyHeight
- getPaddingTop() - getPaddingBottom()) / 2);
}
} else if ((drawable
= drawables
[3]) != null
) {
setGravity(Gravity
.BOTTOM
| Gravity
.CENTER_HORIZONTAL
);
Rect rect
= new Rect();
getPaint().getTextBounds(getText().toString(), 0, getText().toString().length(), rect
);
float textHeight
= rect
.height();
int drawablePadding
= getCompoundDrawablePadding();
int drawableHeight
= drawable
.getIntrinsicHeight();
float bodyHeight
= textHeight
+ drawablePadding
+ drawableHeight
;
if (getHeight() - bodyHeight
> 0) {
canvas
.translate(0, -(getHeight() - bodyHeight
- getPaddingTop() - getPaddingBottom()) / 2);
}
} else if ((drawable
= drawables
[2]) != null
) {
setGravity(Gravity
.START
| Gravity
.CENTER_VERTICAL
);
float textWidth
= getPaint().measureText(getText().toString());
int drawablePadding
= getCompoundDrawablePadding();
int drawableWidth
= drawable
.getIntrinsicWidth();
float bodyWidth
= textWidth
+ drawablePadding
+ drawableWidth
;
if (getWidth() - bodyWidth
> 0) {
canvas
.translate(-(getWidth() - bodyWidth
- getPaddingRight() - getPaddingLeft()) / 2, 0);
}
} else {
setGravity(Gravity
.CENTER
);
}
super.onDraw(canvas
);
}
}
写在最后:原创不易,觉得对自己有帮助的小老弟,欢迎点赞评论~~~