Android – ImageView: setImageBitmap VS setImageDrawable

В чем разница между setImageBitmap и setImageDrawable ?

У меня есть изображение, которое я бы хотел установить динамически из файла. Учебник, который я последовал, говорит, чтобы преобразовать мой Bitmap в BitmapDrawable затем установить его с помощью setImageDrawable . Я заметил, что установка Bitmap напрямую с помощью setImageBitmap также работает, но я не замечаю никакой разницы.

 Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); BitmapDrawable bitmapDrawable = new BitmapDrawable(image); imageView.setImageDrawable(bitmapDrawable); 

ИЛИ

 Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); imageView.setImageBitmap(image); 

Нет никакой разницы между двумя внутренними setImageBitmap вызывает setImageDrawable .

Ниже код выбирается из ImageView.java AOSP

 public void setImageBitmap(Bitmap bm) { // if this is used frequently, may handle bitmaps explicitly // to reduce the intermediate drawable object setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); } 

На самом деле, вы можете увидеть разницу, если вы иногда используете null в качестве аргумента:

 imageView.setImageDrawable(null); Drawable d = imageView.getDrawable(); // d == null imageView.setImageBitmap(null); Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null 

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

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

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

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

  1. SetImageDrawable (Drawable drawable)
  2. SetImageBitmap (битмап bm)
  3. SetImageResource (int resId)
  4. SetImageURI (URI uri)

ImageView , по имени, используется для отображения изображения. Но что такое образ? 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 to the Image.

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

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

Особенность Drawables заключается в том, что они позволяют выполнять все виды операций над графическим объектом, который они обертывают (масштабирование, перевод, непрозрачность и т. Д.).

Растровое изображение является одним из видов вытягивания, вы можете узнать подробнее о чертежах здесь: http://developer.android.com/guide/topics/resources/drawable-resource.html

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

Надеюсь, это поможет, ура, Макс.

 public void setImageBitmap(Bitmap bm) { // if this is used frequently, may handle bitmaps explicitly // to reduce the intermediate drawable object setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); } 

Может быть, разница в том, что mContext.getResources (), из mContext.getResources () может получить плотность деления, поэтому отображение на sceen отличается