在
TextView
中,我设置了drawableLeft
,其中drawable
显示在中心位置。我需要将TextView
内的drawableLeft
与顶部对齐,就像这张图片一样。
使用SpannableString和ImageSpan来实现这一点。
String msg=" "+"haii";
ImageSpan mImageSpan== new ImageSpan(mContext, R.drawable.icon);
SpannableString text = new SpannableString(msg);
text.setSpan(mImageSpan, 0, 1, 0);
mTextView.setText(text);
字符串变量中多余的空格被图标替代。
setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null)
一样,该怎么办? - Choletski我认为这比上面所有的答案都更简单:你只需要做这个:
public class TopGravityDrawable extends BitmapDrawable {
public TopGravityDrawable(Resources res, Bitmap bitmap) {
super(res, bitmap);
}
@Override
public void draw(Canvas canvas) {
int halfCanvas = canvas.getHeight() / 2;
int halfDrawable = getIntrinsicHeight() / 2;
canvas.save();
canvas.translate(0, -halfCanvas + halfDrawable);
super.draw(canvas);
canvas.restore();
}
}
然后
final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon);
icon = new TopGravityDrawable(mTitle.getResources(), bitmap);
title.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
请记住,这仅在使用左侧和右侧复合可绘制对象时才能正常工作
title.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
代替。 - Abdelalim HassounaonDraw(Canvas)
来操作自定义Drawable的绘制。onDraw(Canvas)
方法中实现所需逻辑,将其对齐到TextView的底部、左侧或右侧。您可能还想在onDraw(Canvas)
中建立一个间距,以使您的设计实现完美无缺。GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable);
// NOTE: next 2 lines are important!
innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
mTextView.setCompoundDrawables(gravityDrawable, null, null, null);
示例代码:
public class GravityCompoundDrawable extends Drawable {
// inner Drawable
private final Drawable mDrawable;
public GravityCompoundDrawable(Drawable drawable) {
mDrawable = drawable;
}
@Override
public int getIntrinsicWidth() {
return mDrawable.getIntrinsicWidth();
}
@Override
public int getIntrinsicHeight() {
return mDrawable.getIntrinsicHeight();
}
@Override
public void draw(Canvas canvas) {
int halfCanvas= canvas.getHeight() / 2;
int halfDrawable = mDrawable.getIntrinsicHeight() / 2;
// align to top
canvas.save();
canvas.translate(0, -halfCanvas + halfDrawable);
mDrawable.draw(canvas);
canvas.restore();
}
}
public class DrawableTopLeftTextView extends TextView {
public DrawableTopLeftTextView(Context context) {
super(context);
}
public DrawableTopLeftTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawableTopLeftTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
if (!TextUtils.isEmpty(getText())) {
Drawable[] drawables = getCompoundDrawables();
if (drawables != null) {
Drawable drawableLeft = drawables[0];
if (drawableLeft != null) {
Paint.FontMetricsInt fontMetricsInt = getPaint().getFontMetricsInt();
Rect bounds = new Rect();
getPaint().getTextBounds((String) getText(), 0, length(), bounds);
int textVerticalSpace = Math.round(bounds.top - fontMetricsInt.top);
int offset = (getHeight() - drawableLeft.getIntrinsicHeight()) / 2 - textVerticalSpace - getPaddingTop() / 2;
drawableLeft.setBounds(0, -offset, drawableLeft.getIntrinsicWidth(), drawableLeft.getIntrinsicHeight() - offset);
}
}
}
super.onDraw(canvas);
}
}
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/actual_image_to_be_shown"
android:insetTop="-32dp" />
根据您的情况,您可能需要调整插入值。然后,在您的TextView drawableLeft/Start定义中使用此XML可绘制图形。
你可以用这种方式。也许它能对你有所帮助。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/imageView1"
android:text=" Text Text Text Text Text Text Text Text Text Text Text Text
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text" />
</RelativeLayout>
fill_parent
已被弃用。请使用match_parent
代替。 - Phantômaxx可以试试这样:
class MyTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null
) : AppCompatTextView(context, style) {
private val leftDrawable = ContextCompat.getDrawable(context, R.drawable.checkmark)
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
setBulletPoint(compoundDrawables[0], canvas)
}
private fun setBulletPoint(drawableLeft: Drawable?, canvas: Canvas?) {
if (!TextUtils.isEmpty(text)) {
leftDrawable?.let { drlft ->
if (lineCount == 1) {
setCompoundDrawablesWithIntrinsicBounds(drlft, null, null, null)
} else {
val buttonWidth = drlft.intrinsicWidth
val buttonHeight = drlft.intrinsicHeight
val topSpace = abs(buttonHeight - lineHeight) / 2
drlft.setBounds(0, topSpace, buttonWidth, topSpace + buttonHeight)
canvas?.apply {
save()
drlft.draw(canvas)
restore()
}
}
}
}
}
}
drawableTopLeft
。所以,要实现你想要的效果,可以使用一个单独的 ImageView 或者创建一个继承 TextView 的新控件。 - Phantômaxx