将图像顶部对齐到TextView顶部

Cla*_*aes 38 android vertical-alignment textview drawable android-layout

我想创建一个布局,将图像的顶部与TextView的顶部对齐,如下所示:

---------  Text text text text text text text
| Image |  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.
Run Code Online (Sandbox Code Playgroud)

我尝试通过设置android:drawableLeft我的图像来做到这一点,但是它将图像垂直居中:

           Text text text text text text text
---------  text text text text text text text
| Image |  text text text text text text text
---------  text text text text text text text
           text text text text text.
Run Code Online (Sandbox Code Playgroud)

仅使用TextView是否可行,还是需要创建包含TextView和ImageView的RelativeLayout?

这是我的TextView的XML布局,它给出了错误的布局:

<TextView
    android:gravity="top"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/image"
    android:drawablePadding="8dp"
    android:text="@string/text" />
Run Code Online (Sandbox Code Playgroud)

android:gravity="top"属性似乎只影响文本,而不是drawable.

Rei*_*ier 29

您可以通过创建包装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)

  • @Tharkius 答案中省略了这些方法,因为它们与对齐问题无关,但是您在创建自定义 Drawable 时需要实现它们是对的,正如我们在这里所做的那样。在这种特定情况下,您可能会为每个方法 getOpacity()、setAlpha() 和 setColorFilter() 调用 mDrawable 字段上的相应方法。因此,在 getOpacity() 中,您将返回 mDrawable.getOpacity(),在 setAlpha() 中,您将调用 mDrawable.setAlpha(..) 等。这些方法的含义可以在 Drawable 的文档中找到。 (2认同)