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);
710   5  

5 ответов:

Нет никакой разницы между двумя внутренними 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 (Bitmap bm)
  3. setImageResource (int resId)
  4. setImageURI (URI uri)

ImageView, по имени, используется для отображения изображение. Но что такое образ? A Bitmap-это образ, не трудный для понимания, и мы используем setImageBitmap для этой цели. Однако внутренне ImageView имеет-a Drawable, но не A Bitmap, и это то, для чего setImageDrawable. Когда вы вызываете setImageBitmap, внутренне, сначала растровое изображение будет обернуто в BitmapDrawable, который является-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 через Java API, вы также можете использовать XML attribution, чтобы установить источник 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() можно получить плотность divice, поэтому отображение на sceen отличается

Comments

    Ничего не найдено.