将图像的顶部alignment到TextView的顶部

我想要创build一个布局,将图像的顶部与TextView的顶部alignment,如下所示:

--------- 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. 

我试图通过设置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. 

这可能只是一个TextView,或者我需要创build一个包含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" /> 

android:gravity="top"属性似乎只影响文本,而不是可绘制的。

Solutions Collecting From Web of "将图像的顶部alignment到TextView的顶部"

你可以通过创build一个自定义Drawable来包装Drawable,然后通过覆盖onDraw(Canvas)方法来操作自定义Drawable的绘制,从而将一个Compound-Drawablealignment到顶部(或底部onDraw(Canvas)

下面的示例是最简单的示例。 这将图像alignment到顶部,但也可以通过在onDraw(Canvas)方法中实现所需的逻辑,使其与TextView的底部,左侧或右侧alignment。 您可能还想在onDraw(Canvas)中创build边距,使您的devise实现像素完美。

示例用法:

 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(); } } 

尝试使用RelativeLayout ……

 <?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" > <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="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView1" android:text="@string/text" /> </RelativeLayout> 

我认为,有一个更容易,更快的方式比3观点。 您需要为图标准备适当的9patch,然后使用FrameLayout。 甚至可能只有一个 EditText / TextView使用与它们的背景相同的drawable。 在这个答案中描述更多细节。

 <?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" > <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="@string/text" /> </RelativeLayout> 

这将做到这一点。

使用layout_alignTop 。 有了它,你可以将视图的顶部alignment到另一个视图的顶部

 <?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" > <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/text" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/textView1" android:layout_toLeftOf="@id/textView1" android:src="@drawable/ic_launcher" /> </RelativeLayout>