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);
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, != nullImageView, остерегайтесь его.
Я только что написал для этого статью. Желаю иметь возможность ответить на ваш вопрос.
Https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageViewимеет 4 API для указания образа. Какой из них использовать? В чем же разница?
- setImageDrawable (Drawable drawable)
- setImageBitmap (Bitmap bm)
- setImageResource (int resId)
- setImageURI (URI uri)
ImageView, по имени, используется для отображения изображение. Но что такое образ? ABitmap-это образ, не трудный для понимания, и мы используемsetImageBitmapдля этой цели. Однако внутреннеImageViewимеет-aDrawable, но не ABitmap, и это то, для чегоsetImageDrawable. Когда вы вызываетеsetImageBitmap, внутренне, сначала растровое изображение будет обернуто вBitmapDrawable, который является-aDrawable, а затем вызовите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