33

Я хочу создать макет, который выравнивает верх изображения на вершине TextView, как это:Align верхней части изображения в верхней части 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. 

Я попытался сделать это, установив 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 или мне нужно сделать, чтобы создать RelativeLayout, содержащий TextView и ImageView?

Вот макет XML для моего TextView, что дает неправильную раскладку:

<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" только кажется, влияет на текст, а не рисует.

+2

Я думаю, вам нужно использовать RelativeLayout ... – amp

+0

нужно ли вам в верхней или левой –

+0

, как @amp говорит использовать относительный layout Его лучший .. – MAC

ответ

1

Попробуйте использовать 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> 
+0

Точка CompoundDrawable должна минимизировать количество просмотров в иерархии View. Это решение не отвечает на вопрос, хотя оно будет выглядеть по-разному. – rds

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

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

Это будет делать это.

1

Я думаю, что есть более простой и быстрый способ, чем 3 вида. Вам нужно подготовить правильный 9patch для значка, а затем использовать FrameLayout. Также возможно иметь только EditText/TextView используя тот же рисунок, что и их фон. Более подробная информация приведена в this answer.

0

Использование layout_alignTop. С его помощью можно выровнять верх зрения на вершину другого вида

<?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> 
22

Вы можете выравнивать составную-растяжимый к верхним (или нижнему) пути создания пользовательской вытяжки, что окружит Drawable, а затем манипулировать чертеж вашего пользовательского Drawable путем переопределения метода onDraw(Canvas).

Пример, приведенный ниже, является самым простым примером. Это выравнивает изображение вверху, но вы также можете сделать его выровненным в нижней, левой или правой части TextView, реализовав требуемую логику в методе onDraw(Canvas). Вы также можете создать резервную копию в 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(); 
    } 
} 
+0

отличное решение. Это должен быть принятый ответ. – TharakaNirmana

+0

работал ..спасибо –

+1

как использовать его для выравнивания текста и левого поворота слева от текстового поля – TheReprator

Смежные вопросы