You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.6 KiB
112 lines
3.6 KiB
package com.gyf.csams
|
|
|
|
import android.app.Application
|
|
import android.content.res.Resources
|
|
import android.graphics.Bitmap
|
|
import android.graphics.BitmapFactory
|
|
import android.util.LruCache
|
|
import androidx.compose.ui.graphics.ImageBitmap
|
|
import androidx.compose.ui.graphics.asImageBitmap
|
|
import com.gyf.csams.uikit.BackgroundImage
|
|
import com.orhanobut.logger.AndroidLogAdapter
|
|
import com.orhanobut.logger.DiskLogAdapter
|
|
import com.orhanobut.logger.Logger
|
|
|
|
class APP : Application() {
|
|
|
|
|
|
private lateinit var memoryCache: LruCache<BackgroundImage, Bitmap>
|
|
|
|
// Get max available VM memory, exceeding this amount will throw an
|
|
// OutOfMemory exception. Stored in kilobytes as LruCache takes an
|
|
// int in its constructor.
|
|
private val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()
|
|
|
|
// Use 1/8th of the available memory for this memory cache.
|
|
val cacheSize = maxMemory / 8
|
|
|
|
fun getImage(image: BackgroundImage, reqWidth: Int, reqHeight: Int): ImageBitmap {
|
|
val bitmap = memoryCache.get(image)
|
|
return if (bitmap == null) {
|
|
Logger.i("reqWidth=$reqWidth,reqHeight=$reqHeight")
|
|
val cacheValue = decodeSampledBitmapFromResource(
|
|
res = resources,
|
|
image.id,
|
|
reqWidth = reqWidth,
|
|
reqHeight = reqHeight
|
|
)
|
|
memoryCache.put(image, cacheValue)
|
|
Logger.i("添加缓存:${image}")
|
|
cacheValue.asImageBitmap()
|
|
} else {
|
|
Logger.i("从缓存读取:${image}")
|
|
bitmap.asImageBitmap()
|
|
}
|
|
}
|
|
|
|
private 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)
|
|
}
|
|
}
|
|
|
|
private 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
|
|
}
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
|
|
memoryCache = object : LruCache<BackgroundImage, Bitmap>(cacheSize) {
|
|
|
|
override fun sizeOf(key: BackgroundImage, bitmap: Bitmap): Int {
|
|
// The cache size will be measured in kilobytes rather than
|
|
// number of items.
|
|
return bitmap.byteCount / 1024
|
|
}
|
|
}
|
|
|
|
//初始化日志
|
|
Logger.addLogAdapter(AndroidLogAdapter())
|
|
Logger.addLogAdapter(DiskLogAdapter())
|
|
|
|
Logger.i("${BuildConfig.foreground_app_name}启动")
|
|
|
|
|
|
}
|
|
} |