Подтвердить что ты не робот

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);
4b9b3361

Ответ 1

Нет никакой разницы между двумя внутренними 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));
}

Ответ 2

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

imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null

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

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

Ответ 3

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

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

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

  • setImageDrawable (Drawable drawable)
  • setImageBitmap (битмап bm)
  • setImageResource (int resId)
  • setImageURI (URI uri)

ImageView, по имени, используется для отображения изображения. Но что такое образ? A Bitmap - это изображение, которое не сложно понять, и для этой цели мы используем setImageBitmap. Однако внутри <<20 > имеет-a Drawable, но не a 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 действительно имеет-a Drawable, который необязательно должен быть BitmapDrawable! Вы можете установить любой Drawable в вид изображения.

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

Ответ 4

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

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

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

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

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

Ответ 5

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 отличается