В моем приложении около двадцати действий, и при каждом запуске я хотел бы произвольно назначить фоновое изображение родительскому виду (представление с прокруткой), но я постоянно получаю исключение за пределами памяти и пытаюсь нарисоватьслишком большое исключение.
Я переместил фоновые изображения из drawable в drawable-nodpi, реализовал Glide, сжал изображения, установил largeHeap = true, но ошибки не исчезли. Изображения в формате jpg, 270x480 и 36 точек на дюйм. Приведенный ниже метод setBgImage будет вызываться в onStart в базовом действии, и все мои действия расширяют это базовое действие.
Я получаю эти проблемы в предварительном отчете о бета-тестировании на консоли Google Play. Я сам не сталкивался с этой проблемой, используя свой телефон.
SV_parent_layout - это представление прокрутки, к которому я хочу добавить фон. Я не знаю, что еще я могу сделать, чтобы решить эту проблему. Пожалуйста, помогите.
fun AppCompatActivity.setBgImage(drawable: Int, view: View = SV_parent_layout) {
val bg = decodeSampledBitmapFromResource(resources, drawable, 200, 200)
Glide.with(this)
.asBitmap()
.load(bg)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.thumbnail(0.8f)
.fitCenter()
.into(object: CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
view.background = BitmapDrawable(resources, bg)
}
})
}
fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
// Raw height and width of image
val (height: Int, width: Int) = options.run { outHeight to outWidth }
var inSampleSize = 1
if (height > reqHeight || width > reqWidth) {
val halfHeight: Int = height / 2
val halfWidth: Int = width / 2
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
inSampleSize *= 2
}
}
return inSampleSize
}
fun decodeSampledBitmapFromResource(
res: Resources,
resId: Int,
reqWidth: Int,
reqHeight: Int
): Bitmap {
// First decode with inJustDecodeBounds=true to check dimensions
return BitmapFactory.Options().run {
inJustDecodeBounds = true
BitmapFactory.decodeResource(res, resId, this)
// Calculate inSampleSize
inSampleSize = calculateInSampleSize(this, reqWidth, reqHeight)
// Decode bitmap with inSampleSize set
inJustDecodeBounds = false
BitmapFactory.decodeResource(res, resId, this)
}
}