2013-03-13 7 views
32

Я создал действие с изображением заголовка. Это изображение заголовка изначально создается внутри макета xml Activity, используя ImageView, где scaleType установлен на centerCrop. Это делает то, что я хочу, оно центрирует изображение, обрезая его влево и вправо в портретном режиме, показывая все в ландшафтном режиме.Эквивалент ImageView scaleType 'centerCrop' для растровой растягивающей силы тяжести

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="30dp" 
    android:paddingBottom="6dp" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:background="#919EAC" 
    android:orientation="vertical" > 

<ImageView 
    android:id="@+id/header_image" 
    android:layout_width="match_parent" 
    android:layout_height="120dp" 
    android:contentDescription="@string/header_description" 
    android:scaleType="centerCrop" 
    android:src="@drawable/header" /> 

    .... <other views> ... 

Я хотел бы заменить это с фоновым Drawable, так что я могу использовать пространство заголовка изображения для отображения данных, и это экономит мне повторять один и тот же макет в различных видах деятельности.

По этой причине я создал вытяжку, что я могу сослаться на андроиде: фон атрибут:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
     <item> 
      <shape android:shape="rectangle" > 
       <solid android:color="#919EAC" /> 
      </shape> 
     </item> 
     <item> 
      <bitmap 
       android:antialias="true" 
       android:gravity="top|center_horizontal" 
       android:src="@drawable/header" /> 
     </item> 
    </layer-list> 

Это вытяжка определяет цветной фон, который в противном случае макет будет определять и определяет заголовок изображение, иначе он будет включен в макет как ImageView.

Однако теперь мое изображение масштабируется, в то время как я хотел бы, чтобы оно было обрезано.

Проверка Android документации Я пробовал другие режимы, такие как гравитационные

android:gravity="top|clip_horizontal" 

Но она по-прежнему кажется, дисплей/масштаба иначе, чем вид изображения.

Каким будет правильное определение фона?

+4

Возможно, вы сможете найти решение вашей проблемы? Я борюсь с тем же. – Marty

+0

related http://stackoverflow.com/questions/5119366/set-size-of-layered-drawable – mathheadinclouds

+1

Как насчет "fill_vertical \ clip_horizontal" –

ответ

-3

Используя scaleType = "centerCrop", вы достигли желаемого результата, обрезать края изображения и показать часть центра, которая подходит под размер.

Для ImageView:

ImageView имеют scaleType атрибут, который работает только для изображения, который установлен на нем в качестве источника для отображения. то есть, как если бы он был TextView, то Text является его источником.

Возможно, вы заметили, что scaleType не работает для изображения, которое установлено как фон, который работает только с изображением, которое поставляется в качестве источника либо в XML во время выполнения. не

Для макета

Layout может показать фоновые изображения, но нет какого-либо атрибута дано для макета, который может обрабатывать фоновые изображения и масштабировать его согласно значению атрибута.

Поэтому вы должны прекратить запрашивать у объекта ImageView от Layout, потому что у него его нет.

2 различных решения вашей проблемы

1) сохраняйте изображения для фона заголовка в различной вытяжке папки и использовать ее, таким образом, не требуется, чтобы масштабировать его во время выполнения, как вы уже разработали изображение для размер по-разному.

2) Вам нужно просто перепроектировать XML, как показано ниже образца

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:background="@drawable/subway" 
     android:scaleType="centerCrop" /> 

    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_alignParentLeft="true" 
     /> 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     /> 
</RelativeLayout> 
0

Я не знаю, как это сделать с фоном. Вы можете попробовать другие решения:

1) Самое простое решение отображать что-то поверх изображения - это разместить их как в макете, так и на их перекрытии. Например, вы можете использовать RelativeLayout с размерами ImageView, ImageView - match_parent в обоих измерениях и TextView в центре.

2) Вы можете сохранить изображение в другом макете, например, header.xml, и использовать его по адресу , включая header.xml везде, где это необходимо.

3) Если макет, который будет отображаться поверх ImageView, будет таким же везде, вы можете создать собственный макет с помощью ImageView и сказать, TextView в центре, и использовать этот макет везде. Затем вы можете установить строку TextView на этом настраиваемом макете. Вы можете больше узнать о пользовательских макетах, они просты.

2

Для центрирования урожай растровым в коде сделать это:

public static Bitmap cropCenter(Bitmap bmp) { 
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight()); 
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension); 
} 

Я не знаю, какой-либо другой способ centerCrop растрового XML мудр.

Надеюсь, что это поможет кому угодно.

Я нашел это решение из этого поста: Android Crop Center of Bitmap

1

Я решил эту проблему с декоратором, который поддерживает соотношение сторон основной вытяжки: https://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e

К сожалению, не существует никакого способа, чтобы применить его из XML, так что я сделать это в самом начале моей всплеск активности:

public class SplashActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final Drawable bg = getResources().getDrawable(R.drawable.screen); 
     getWindow().setBackgroundDrawable(new CenterCropDrawable(bg)); 

     ... 
    } 
} 

Это примерно эквивалентно заданию вытяжке, как android:windowBackground в Тема активности