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

Android Glide批量加载Bitmap,拼接组装大Bitmap,更新单个AppCompatImageView,Kotlin(3)

Android Glide批量加载Bitmap,拼接组装大Bitmap,更新单个AppCompatImageView,Kotlin(3)

这篇 Android Glide批量加载Bitmap,拼接组装大Bitmap,更新单个AppCompatImageView,Kotlin(2)-CSDN博客

遗留两个问题:

(1)当最后一行不满ROW_SIZE时候,根本就不会显示。

(2)即便显示出来,因为绘制是按照ROW_SIZE绘满一行,导致实际不满一行的位置显示为灰色占位颜色块。

以上问题均是在 BatchBitmapView,改造:

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Color
import android.util.AttributeSet
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Targetclass BatchBitmapView @JvmOverloads constructor(val mCtx: Context,attributeSet: AttributeSet? = null,defStyleAttr: Int = 0
) : AppCompatImageView(mCtx, attributeSet, defStyleAttr) {private val mData = mutableListOf<DataBean>()private val mTargets = mutableListOf<Target<Bitmap>>()private var mRealSize: Int = 0companion object {const val TAG = "fly/BatchBitmapView"const val ROW_SIZE = 16 //一行多少个bitmapconst val IMAGE_SIZE = 200 //每个小格子图片的尺寸var mScreenWidth: Int = 0var mScreenHeight: Int = 0//整数相除,精度损失的平衡因子const val BALANCE_FACTOR = 1}init {//scaleType = ScaleType.FIT_CENTERif (mScreenWidth == 0) {mScreenWidth = resources.displayMetrics.widthPixels}if (mScreenHeight == 0) {mScreenHeight = resources.displayMetrics.widthPixels / ROW_SIZE + BALANCE_FACTOR}}fun setRowBitmapData(rows: ArrayList<MainActivity.MyData>?, position: Int) {mData.clear()mTargets.forEach {//如果不清除,会发生有些图错放位置。Glide.with(mCtx).clear(it)}mTargets.clear()var loadCount = 0mRealSize = rows?.size!!rows?.forEachIndexed { _, myData ->val target = Glide.with(mCtx).asBitmap().centerCrop().override(IMAGE_SIZE).load(myData.path).addListener(object : RequestListener<Bitmap> {override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>, isFirstResource: Boolean): Boolean {loadCount++val errorBmp = BitmapFactory.decodeResource(mCtx.resources, android.R.drawable.stat_notify_error)refresh(loadCount, errorBmp)return false}override fun onResourceReady(resource: Bitmap,model: Any,target: Target<Bitmap>?,dataSource: DataSource,isFirstResource: Boolean): Boolean {loadCount++refresh(loadCount, resource)return false}}).preload(IMAGE_SIZE, IMAGE_SIZE)mTargets.add(target)}}fun refresh(loadCount: Int, bmp: Bitmap) {val bean = DataBean(bmp)mData.add(bean)if (loadCount == mRealSize) {val jBmp = joinBitmap()(mCtx as AppCompatActivity).runOnUiThread {this@BatchBitmapView.setImageBitmap(jBmp)}}}private fun joinBitmap(): Bitmap {val bmp = Bitmap.createBitmap(IMAGE_SIZE * mRealSize, IMAGE_SIZE, Bitmap.Config.ARGB_8888)val canvas = Canvas(bmp)canvas.drawColor(Color.LTGRAY)mData.forEachIndexed { idx, dataBean ->canvas.drawBitmap(dataBean.bitmap, IMAGE_SIZE * idx.toFloat(), 0f, null)}return bmp}data class DataBean(val bitmap: Bitmap)override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)if (mRealSize == ROW_SIZE) {setMeasuredDimension(mScreenWidth, mScreenHeight)} else {val w = (mScreenWidth / ROW_SIZE) * mRealSizesetMeasuredDimension(w, mScreenHeight)}}
}

http://www.mrgr.cn/news/78440.html

相关文章:

  • Python语法基础(三)
  • 尚硅谷学习笔记——Java设计模式(一)设计模式七大原则
  • Java开发工程师最新面试题库系列——Java基础部分(附答案)
  • DFS 创建分级菜单
  • flink学习(7)——window
  • Android按键点击事件三种实现方法
  • SQL Server 中的游标:介绍、效率、使用场景及替代方法对比
  • 嵌入式C语言技巧15:深入浅出:多线程编程中锁的选择与优化策略
  • Linux(ubuntu)系统的一些基本操作和命令(持续更新)
  • java全栈day10--后端Web基础(基础知识)之续集
  • 全面了解 Cookies、Session 和 Token
  • 华为OD机试真题---开心消消乐
  • 《大气科学学报》
  • C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr
  • 算法交易 - 理解什么是空头交易
  • Android 自定义应用选择器对话框
  • 浅谈网络 | 应用层之HTTPS协议
  • android 安全sdk相关
  • 韩顺平 一周学会Linux | Linux 实操篇-组管理和权限管理
  • 音视频入门基础:MPEG2-TS专题(8)——TS Header中的适配域
  • 算法设计作业
  • 面试手撕题积累
  • 在 Spring Boot 中构造 API 响应的最佳实践
  • 彻底理解微服务配置中心的作用
  • PyQt学习笔记
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)