如何将drawableLeft与top对齐而不是在android TextView中居?

and*_*ter 34 android textview

TextView我设置drawableLeftdrawable从中心示出.我需要像这个图像一样对齐drawableLeft顶部TextView.

在此输入图像描述

是否有可能实现这一目标?

Rei*_*ier 6

在这里看到我的答案.

您可以通过创建包装Drawable的自定义Drawable将Compound-Drawable对齐到顶部(或底部),然后通过覆盖方法来操纵自定义Drawable的绘图onDraw(Canvas).

下面的示例是最简单的示例.这会将图像与顶部对齐,但您也可以通过在onDraw(Canvas)-method中实现所需的逻辑使其与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);
Run Code Online (Sandbox Code Playgroud)

示例代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


ces*_*rds 6

我认为这比上面的所有答案还要容易:您只需要这样做:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

 final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon);
 icon = new TopGravityDrawable(mTitle.getResources(), bitmap);
 title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, icon);
Run Code Online (Sandbox Code Playgroud)

请记住,这仅适用于LEFTRIGHT复合可绘制对象


小智 5

使用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);
Run Code Online (Sandbox Code Playgroud)

字符串变量中的多余空格由图标代替。

  • 可爱的解决方案。但是图标和文本的重力不同。你有什么建议吗? (2认同)

May*_*ama 0

你可以通过这种方式使用。愿它能对您有所帮助。

<?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>
Run Code Online (Sandbox Code Playgroud)