2012-06-10 2 views
4

В моем приложении это выгодно, если я предварительно загружаю определенные изображения. Я делаю это правильно, в AsyncTask, как это написано в официальной документации. Но у меня есть проблема/вопрос о том, когда они должны быть установлены.XML vs. setImageDrawable/setImageBitmap

Я покажу фрагменты кода. Обратите внимание, что это упрощено (их интероперабельность лучше в моем реальном коде, он проверяет нули и т. Д.).

Давайте посмотрим, оригинальную (не поджато) версия первый:

<ImageView 
    android:id="@+id/imageViewMyGraphicalImageElement" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="centerCrop" 
    android:src="@drawable/my_graphical_element" > 
</ImageView> 

предварительно загруженная версия имеет следующий XML (обратите внимание, что атрибут SRC отсутствует):

<ImageView 
    android:id="@+id/imageViewMyGraphicalImageElement" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="centerCrop"> 
</ImageView> 

И сниппает из кода натягом:

sBitmap = bitmapBitmapFactory.decodeResource(context.getResources(), R.drawable.my_graphical_element, options); 
// 'sBitmap' is a Bitmap reference, while 'options' is BitmapFactory.Options 

Наконец, место, где я поставил его:

setContentView(R.layout.main); 
... 
ImageView imageViewMyGraphicalImageElement= (ImageView) findViewById(R.id.imageViewMyGraphicalImageElement); 
imageViewMyGraphicalImageElement.setImageBitmap(sBitmap); 

Вопрос: Очевидно, что XML-решение знает об образе до setContentView (...) называется. Версия предварительной загрузки устанавливает изображение после, вызывающего вызов. Есть ли разница? Из-за этого можно пропустить некоторую автомасштабирование или другие вещи, выполняемые системой?

ответ

3

Нет никакой разницы. Вы можете считать, что все конструктор ImageView с атрибутом android:src - это вызов setImageResource.

Update: На самом деле он использует setImageDrawable, это фактический код для ImageView конструктора с атрибутами:

Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src); 
    if (d != null) { 
     setImageDrawable(d); 
    } 

Ссылка: ImageView.java

+0

Я понимаю, но разница в моем коде является то, что конструктор ImageView (т.е. ** XML-решение **) вызывается до (или во время?) setContentView. В программном решении я вызываю setImageDrawable (или setImageBitmap - оба работали для меня) ** после ** setContentView(). Я знаю, что Android делает автомасштабирование и другие вещи с растровыми изображениями и макетом, поэтому мне просто интересно, какие из них пропущены из-за позднего вызова setImageDrawable/setImageBitmap. –

+0

@Thomas Calc: Если вы проверите код, вы увидите, что все варианты 'setImage' сами делают _auto-scaling и другие вещи. Никакая функциональность не будет пропущена. –

3

Я просто написал статью для этого. Желаю иметь возможность ответить на ваш вопрос.

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView имеет 4 API, чтобы выбрать изображение. Какой из них использовать? В чем разница?

  1. setImageDrawable (Drawable вытяжка)
  2. setImageBitmap (Растровое шм)
  3. setImageResource (интермедиат Resid)
  4. setImageURI (Uri Uri)

ImageView, по имени, используются для отобразить изображение. Но что такое образ? A Bitmap - это изображение, которое не сложно понять, и для этой цели мы используем setImageBitmap. Однако, внутренне, ImageView имеет-Drawable, но не Bitmap, и это то, что setImageDrawable для.Когда вы вызываете setImageBitmap, внутренне, сначала растровое изображение будет обернуто до BitmapDrawable, которое IS-A Drawable, а затем вызовет setImageDrawable.

Вот код.

public void setImageBitmap(Bitmap bm) { 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

Итак, что относительно API 3 и 4?

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

BitmapFactory.decodeFile(String pathName) 
BitmapFactory.decodeStream(Inputstream) 
BitmapFactory.decodeResource(Resource res, int id) 
BitmapFactory.decodeByteArray(byte[] data) 

Зная это, легко понять setImageResource/setImageUri просто так же, как setImageBitmap.

Подводя итог, setImageDrawable - это примитивная функция, на которую полагаются другие API. Остальные 3 - это просто вспомогательные методы, заставляющие писать меньше кода.

Кроме того, очень важно иметь в виду, что ImageView действительно имеет-Drawable, что необязательно должно быть BitmapDrawable! Вы можете установить любой вид Drawable в изображение.

Помимо установки Drawable через API Java, вы также можете использовать атрибуцию XML для установки источника Drawable для ImageView. См. Пример ниже. Обратите внимание, что форма может быть либо файлом изображения (.png, .jpg, .bmp), либо xml-файлом.

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="50dip" 
    android:src="@drawable/shape"/> 

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/> 
    <padding android:left="7dp" android:top="7dp android:right="7dp" android:bottom="7dp" /> 
    <corners android:radius="8dp" /> 
</shape> 
+0

@nhahtdh, Спасибо, что вы очистили формат и сделали его более читабельным! – pierrotlefou