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);
Ответы
Ответ 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 отличается