2013-05-13 6 views
0

Мне нужно установить фоновый рисунок макета динамически, вызвав myView.setBackgroundDrawable (BitmapDrawable bdb), но я хочу обрезать изображение, а не растягивать его в макете, есть ли способ Делать это?Android: как предотвратить динамический фон, извлекаемый из растяжения

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

<bitmap android:src="@drawable/background" android:gravity="center" /> 

Любое предложение было бы действительно оценено!

+0

Вы должны выбрать ответ, это поможет другим, которые приходят сюда искать ответ –

ответ

0

Вы хотите использовать ImageView.ScaleType.CENTER_CROP

+0

привет, спасибо за ответ. myView не является imageView, хотя это относительныйLayout –

+0

А, в этом случае вы можете просто обрезать растровое изображение, прежде чем превращать его в BitmapDrawable: 'Bitmap.createBitmap (originalBm, 0, 0, originalBm.getWidth() - cropWidth, originalBm.getHeight() -cropHeight); ' – hwrdprkns

+0

нет, что не работает –

0

Я считаю, что android:gravity атрибуты, которые вы ищете являются clip_vertical и clip_horizontal, но слово советы. Эти атрибуты могут вести себя не так, как вам кажется. Вы не можете использовать их для клипа изображения в обоих направлениях, только один. Следующий код:

<bitmap 
    android:src="@drawable/background" 
    android:gravity="clip_vertical|clip_horizontal" /> 

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

<!-- Force fit top/bottom, crop left/right with image centered --> 
<bitmap 
    android:src="@drawable/background" 
    android:gravity="clip_vertical" /> 

<!-- Force fit top/bottom, align image left and crop right edge --> 
<bitmap 
    android:src="@drawable/background" 
    android:gravity="left|clip_vertical" /> 

<!-- Force fit left/right, crop top/bottom with image centered --> 
<bitmap 
    android:src="@drawable/background" 
    android:gravity="clip_horizontal" /> 

<!-- Force fit left/right, align top and crop bottom egde --> 
<bitmap 
    android:src="@drawable/background" 
    android:gravity="top|clip_horizontal" /> 

Обратите внимание, что эти настройки позволяют изображения больше, чем вид, чтобы быть обрезаны, но если изображение меньше, чем вид, его содержание по-прежнему будет растягиваться, чтобы соответствовать. Чтобы управлять тем, как изображение будет вести себя в теге <bitmap>, когда оно меньше, чем вид, посмотрите на tileMode. Обратите внимание, что tileMode и gravity не могут использоваться вместе; gravity будет проигнорирован, если оба включены.

Если вам нужен больше динамического контроль как изображение весов в дополнении к этому, и вы не хотите использовать ImageView, вы можете также обернуть получившуюся вытяжку в ScaleDrawable и настроить х/у шкалы процентов в Java код, основанный на измеренных размерах просмотра.

0
if (srcBmp.getWidth() >= srcBmp.getHeight()){ 

    dstBmp = Bitmap.createBitmap(
    srcBmp, 
    srcBmp.getWidth()/2 - srcBmp.getHeight()/2, 
    0, 
    srcBmp.getHeight(), 
    srcBmp.getHeight() 
    ); 

}else{ 

    dstBmp = Bitmap.createBitmap(
    srcBmp, 
    0, 
    srcBmp.getHeight()/2 - srcBmp.getWidth()/2, 
    srcBmp.getWidth(), 
    srcBmp.getWidth() 
    ); 
}