当前位置: 首页 > wzjs >正文

货运公司网站源码seo网站排名优化服务

货运公司网站源码,seo网站排名优化服务,公众号开发者平台,用手机什么软件做网站Android BitmapRegionDecoder 详解 BitmapRegionDecoder 是 Android 提供的一个用于局部解码大图的类,适用于加载超大型图片(如高清地图、长图、全景照片等),避免一次性加载整个图片导致内存溢出(OOM)。 1…

Android BitmapRegionDecoder 详解

BitmapRegionDecoder 是 Android 提供的一个用于局部解码大图的类,适用于加载超大型图片(如高清地图、长图、全景照片等),避免一次性加载整个图片导致内存溢出(OOM)。


1. 基本使用

(1) 初始化 BitmapRegionDecoder

可以从 InputStreamFileDescriptorByteArray 创建:

val inputStream = context.assets.open("huge_image.jpg")
val decoder = BitmapRegionDecoder.newInstance(inputStream, false)

⚠️ 注意false 表示不共享输入流,解码完成后需手动关闭 inputStream

(2) 解码指定区域

val rect = Rect(left, top, right, bottom) // 要解码的区域坐标
val options = BitmapFactory.Options().apply {inPreferredConfig = Bitmap.Config.RGB_565 // 减少内存占用inSampleSize = 2 // 可选:进一步缩放
}
val regionBitmap = decoder.decodeRegion(rect, options)
imageView.setImageBitmap(regionBitmap)
  • Rect:指定要解码的矩形区域(单位:像素)。
  • inSampleSize:缩放系数(2 表示宽高各缩小一半)。
  • inPreferredConfig
    • Bitmap.Config.ARGB_8888(默认,每个像素占 4 字节)
    • Bitmap.Config.RGB_565(推荐,每个像素占 2 字节,适合不透明图片)

(3) 释放资源

decoder.recycle() // 不再使用时释放内存
regionBitmap?.recycle() // 手动回收 Bitmap

2. 典型应用场景

(1) 超大图片分块加载(如地图)

// 根据 ImageView 当前显示区域动态加载
fun loadVisibleRegion(imageView: ImageView, decoder: BitmapRegionDecoder) {val visibleRect = getVisibleRect(imageView) // 计算可见区域val options = BitmapFactory.Options().apply {inPreferredConfig = Bitmap.Config.RGB_565}val regionBitmap = decoder.decodeRegion(visibleRect, options)imageView.setImageBitmap(regionBitmap)
}

(2) 高清长图浏览(类似微博长图)

结合 ImageViewOnTouchListenerRecyclerView,动态解码当前屏幕区域:

imageView.setOnTouchListener { _, event ->when (event.action) {MotionEvent.ACTION_MOVE -> {val visibleRect = calculateVisibleRect(event) // 根据手势计算新区域val newRegion = decoder.decodeRegion(visibleRect, options)imageView.setImageBitmap(newRegion)}}true
}

3. 优化技巧

(1) 复用 Bitmap 对象

避免频繁创建/回收 Bitmap,使用 BitmapPool(如 Glide 的实现):

val options = BitmapFactory.Options().apply {inBitmap = reusableBitmap // 复用已有 Bitmap 内存
}

(2) 内存缓存

使用 LruCache 缓存已解码的局部区域:

private val regionCache = LruCache<String, Bitmap>(maxSize)fun getCachedRegion(key: String): Bitmap? {return regionCache.get(key)
}fun cacheRegion(key: String, bitmap: Bitmap) {regionCache.put(key, bitmap)
}

(3) 异步加载

配合 CoroutineRxJava 防止 UI 卡顿:

viewModelScope.launch(Dispatchers.IO) {val regionBitmap = decoder.decodeRegion(rect, options)withContext(Dispatchers.Main) {imageView.setImageBitmap(regionBitmap)}
}

4. 对比其他方案

方案适用场景优点缺点
BitmapRegionDecoder超大图局部加载精准控制内存占用需手动计算区域坐标
Glide/Picasso常规图片加载自动缓存、生命周期管理不支持局部解码
SubsamplingScaleImageView开源库(支持手势缩放)功能完善增加 APK 体积

5. 完整示例代码

class BigImageActivity : AppCompatActivity() {private lateinit var decoder: BitmapRegionDecoderprivate var currentBitmap: Bitmap? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_big_image)// 初始化解码器val inputStream = assets.open("huge_image.jpg")decoder = BitmapRegionDecoder.newInstance(inputStream, false)inputStream.close()// 首次加载中心区域loadInitialRegion()imageView.setOnTouchListener(gestureListener)}private fun loadInitialRegion() {val centerX = decoder.width / 2val centerY = decoder.height / 2val rect = Rect(centerX - 500, centerY - 500,centerX + 500, centerY + 500)currentBitmap?.recycle()currentBitmap = decoder.decodeRegion(rect, BitmapFactory.Options().apply {inPreferredConfig = Bitmap.Config.RGB_565})imageView.setImageBitmap(currentBitmap)}private val gestureListener = object : View.OnTouchListener {override fun onTouch(v: View, event: MotionEvent): Boolean {// 实现手势滑动逻辑(略)return true}}override fun onDestroy() {decoder.recycle()currentBitmap?.recycle()super.onDestroy()}
}

总结

  • 使用场景BitmapRegionDecoder 适合加载无法缩放的全尺寸大图(如高清地图、医学影像)。
  • 关键优化:通过 Rect 控制解码范围 + inSampleSize 缩放 + RGB_565 配置。
  • 进阶方案:结合手势库(如 PhotoView)实现交互式浏览。

文章转载自:

http://FwKoTLX6.hLxxL.cn
http://30qvtQLk.hLxxL.cn
http://Cmaz3QQa.hLxxL.cn
http://rqMfsi1z.hLxxL.cn
http://CaEIb46n.hLxxL.cn
http://rJ98I9Ed.hLxxL.cn
http://pxAXel1w.hLxxL.cn
http://wNKiqTGD.hLxxL.cn
http://ipFaIa5G.hLxxL.cn
http://9whYOJgW.hLxxL.cn
http://is4B9LUV.hLxxL.cn
http://xq03Em7Y.hLxxL.cn
http://FGAVqvqy.hLxxL.cn
http://8QGhKND6.hLxxL.cn
http://KBY9gnEC.hLxxL.cn
http://dkLI5VF2.hLxxL.cn
http://OyB0nQmU.hLxxL.cn
http://8vw07xWy.hLxxL.cn
http://pIorvrcM.hLxxL.cn
http://nlMHnhVa.hLxxL.cn
http://46cofsNR.hLxxL.cn
http://aD0cqC6H.hLxxL.cn
http://jn62ebX4.hLxxL.cn
http://N5qPSym2.hLxxL.cn
http://qBgNiHd9.hLxxL.cn
http://nRV2pngu.hLxxL.cn
http://a1WorWZG.hLxxL.cn
http://2SoMSmSC.hLxxL.cn
http://fUWWhx0Q.hLxxL.cn
http://YvQQbNax.hLxxL.cn
http://www.dtcms.com/wzjs/736018.html

相关文章:

  • 广州网站维护公司网站制作方案
  • 维持一个素材网站要多少钱广州网站开发企业
  • 成都网络推广网站seo工具有哪些
  • 网站建设哪家好建议兴田德润怎样做自己的 优惠卷网站
  • 做网站的小图标自己做的网站百度搜不到
  • 兰州网站建设公司做标记网站
  • 佛山做外贸网站的公司吗网站设计策划书案例
  • 怎样用ps做网站网络程序员
  • 石家庄网站建设选汉狮权威发布意思
  • 惠州做网站优化米定制网的网站是那个公司做
  • 网站的主要功能网站建设怎么管理业务员
  • 网站里的专题页面每天试用三小时vp加速器
  • 个人网站做项目高级网站开发培训价格
  • 商丘购物网站开发设计六安网吧什么时候解封
  • 北京时间网站建设别人用我公司权限做网站
  • 深圳网站建设中为广告设计需要什么软件
  • 做网站的销售能干什么做号网站
  • 做百度网站费用多少网页设计基础填空题及答案
  • 网站app制作费用单成都网站设计平台
  • 常州网站建设公司排名discuz wordpress主题
  • 网站自己做服务器划算吗腾讯云 网站备案
  • 莱芜网站建设哪里有做网站需要购买服务器吗
  • 平面设计案例网站推荐网站维护是什么专业
  • 南通网站流量优化相关网站怎么做
  • 企业电子商务网站开发实验报告建设厅资质管理网站
  • 深圳网站建设推广方法网站关键词密这么稀释
  • 青海省建设工程信息网站秦皇岛市 网站建设
  • 泉州网站设计师招聘长沙seo网络营销推广
  • 怎么制作网站游戏在线图片编辑网站源码
  • 品牌网站建设小8a蝌蚪备案网站公共查询系统