Что такое «Ресурсы» в конструкторе BitmapDrawable?

Поскольку BitmapDrawable конструктор BitmapDrawable устарел, мы должны предоставить идентификатор ресурса конструктору.

 BitmapDrawable bitmapDrawable = new BitmapDrawable(res, bmap); 

Где res обычно getResources() .

Зачем нужен конструктор и как мы можем определить это значение, если мы используем общий кэш изображений?

    Зачем нужен конструктор?

    Из документов BitmapDrawable(Resources res, Bitmap bitmap) :

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

    Таким образом, это необходимо для того, чтобы установить начальную целевую плотность с использованием показателей отображения, а DisplayMetrics будет извлекаться из Resources которые вы предоставляете в качестве параметра для BitmapDrawable .

    Как мы можем определить это значение, если мы используем общий кэш изображений?

    Извините, не могу понять вопрос. Вы можете перефразировать?

    Если я уже сам масштабировал Bitmap , зачем нужны ресурсы BitmapDrawable ?

    Как может BitmapDrawable знать, что вы уже масштабировали Bitmap ? Как правило, если вы создаете BitmapDrawable вы не должны заботиться о его масштабировании самостоятельно, поэтому API разработан таким образом.

    Кажется, что единственный способ избежать масштабирования при преобразовании Bitmap в Drawable – использовать устаревший конструктор?

    Хотя это звучит плохо, но вы можете видеть, как классы из переходной среды используют этот конструктор, например ChangeBounds , Crossfade .

    Я немного искал источники и узнал этот фрагмент кода в классе Bitmap :

     static public int scaleFromDensity(int size, int sdensity, int tdensity) { if (sdensity == DENSITY_NONE || tdensity == DENSITY_NONE || sdensity == tdensity) { return size; } // Scale by tdensity / sdensity, rounding up. return ((size * tdensity) + (sdensity >> 1)) / sdensity; } 

    Это называется в следующей цепочке:

     * BitmapDrawable#constructor * BitmapDrawable#updateLocalState() * BitmapDrawable#computeBitmapSize() * Bitmap#getScaledWidth() * scaleFromDensity(getWidth(), mDensity, targetDensity) 

    Что делать, если вы явно задали плотность вашего Bitmap DENSITY_NONE ? Затем проверка if проверит значение true и масштабирование не будет выполнено.

     Bitmap bitmap = ... bitmap.setDensity(Bitmap.DENSITY_NONE); 

    Не тестировали, просто делали предположения на основе источников.

    В этом конструкторе требуется getResources () для установки начальной целевой плотности на основе показателей отображения ресурса. Я так понимаю – вы принимаете показатели отображения, содержащие информацию о размере, плотности, масштабировании шрифтов и передавая эту информацию конструктору. Возможно, если у вас будет изображение res/ folder разных размеров – в соответствующих подпапках, например drawable-ldpi , drawable-hdpi – вы получите другую информацию.

    Чтобы использовать его в кеше изображения, вам нужно передать ему контекст, а затем вызвать вот так: Context ctx; ctx.getResources(); Context ctx; ctx.getResources(); Надеюсь, это поможет.

    Относительно конструктора устаревший и новый конструктор

     BitmapDrawable(Resources res) /* deprecated constructor */ BitmapDrawable(android.content.res.Resources, android.graphics.Bitmap) /* new constructor they introduced to replace above deprecated constructor */ 

    Устаревший конструктор создает пустой доступный, не имеющий дело с плотностью. Но новый конструктор создает возможность рисования из растрового изображения, устанавливая начальную целевую плотность на основе показателей отображения ресурсов . Использование нового конструктора дает вам всю мощь, которую вы можете иметь с Bitmap (окончательный класс). https://developer.android.com/reference/android/graphics/Bitmap.html#pubmethods

    Что произойдет, если вы не передадите переменную Bitmap через конструктор? Когда вы передаете переменную из параметра, вам не нужно создавать новую битмап-переменную там, где вы проходили. Вы создали другую переменную, которая просто ссылается (статическая ссылка) вашего растрового изображения. Так как растровые изображения представляют собой файлы большого размера, при передаче ссылки вы сохраняете много места и вычислительную мощность, которые вам приходилось использовать для загрузки растровых изображений внутри вашего ImageView. Так что это поможет вам не получить OutOfMemory Exception .

    Например,

     public void passA(String); /* method signature*/ String s = "dfsfsdf"; passA(s); /* method calling */ 

    Другая сторона:

     public void passA(String newVar) { /* newVar simply points (references) to the memory of "dfsfsdf". */ /* passing references */ /* for Bitmap creating new copy is expensive operations */ /*Note: Java does manipulate objects by reference, and all object variables are references */ } 

    Другая идея, которую они передали с переменной Bitmap (android.graphics.Bitmap), связана с тем, что Bitmap является Parcelable (если реализуется Parcelable). Исходные объекты могут содержаться в Bundle. И Bundles – это основное для IPCS (Interprocess communication) и связь через различные компоненты Android).

    Что касается общего кэша изображений Вы установили всю необходимую плотность и другие вещи из Bitmap, передали переменную через новый конструктор. Затем вы можете создать кеш HashMap в Least Recently Used (Lru) кеш, в котором вы определяете свой строковый key чтобы указать настроенную Bitmap variable . Например, LruCache . Теперь, в самом последнем кэше вашего процессора, вы настроили Bitmap. Это экономит вашу вычислительную мощность.

    https://developer.android.com/reference/android/util/LruCache.html

    Надеюсь, мой ответ тебе поможет!