如何在设置新Bitmap前重置ImageView的平移缩放状态
解决ImageView替换Bitmap后保留旧缩放平移状态的问题
核心修复步骤
你之前的问题出在混用了ImageView的View级变换(scaleX/scaleY、scroll)和Matrix变换,且替换Bitmap时没有彻底重置所有相关状态。按以下步骤修改即可:
替换Bitmap前,彻底重置ImageView的所有变换属性:
- 把
scaleX、scaleY重置为初始值1.0f - 调用
scrollTo(0, 0)清空滚动偏移 - 创建全新的
Matrix并设置给ImageView,覆盖旧的变换矩阵
- 把
替换Bitmap后,重新初始化你的变换相关变量(比如
centerX、centerY)
修改后的openPdfFromStorage函数
@Throws(IOException::class) private fun openPdfFromStorage(uri: Uri) { var FILE_NAME = getFileName(uri) ?: "temp${Date()}.pdf" val fileCopy = File(cacheDir, FILE_NAME) copyToCache(fileCopy, uri) val fileDescriptor = ParcelFileDescriptor.open( fileCopy, ParcelFileDescriptor.MODE_READ_ONLY ) mPdfRenderer = PdfRenderer(fileDescriptor) pdfpages = mPdfRenderer.pageCount pdfnum = 0 val mPdfPage = mPdfRenderer.openPage(pdfnum) val bitmap = Bitmap.createBitmap( pdfview.width, pdfview.height, Bitmap.Config.ARGB_8888 ) mPdfPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY) // --- 新增:替换Bitmap前先重置所有状态 --- pdfview.scaleX = 1.0f pdfview.scaleY = 1.0f pdfview.scrollTo(0, 0) pdfview.imageMatrix = Matrix() // 重置为空白矩阵 // --- 重置结束 --- pdfview.setImageBitmap(bitmap) // 不需要反复切换ScaleType,保持MATRIX即可 pdfview.scaleType = ImageView.ScaleType.MATRIX m = pdfview.imageMatrix // 此时拿到的是全新的初始矩阵 pbounds = getImageBounds(pdfview) centerX = pbounds.centerX() centerY = pbounds.centerY() mPdfPage.close() }
为什么之前的方法无效?
- 你之前先设置Bitmap再切换ScaleType,顺序错误:ImageView在设置Bitmap时会继承当前已有的变换属性,后续切换ScaleType无法覆盖View自身的
scaleX/scaleY和滚动状态 scrollTo(0,0)、setImageMatrix(Matrix())这些操作需要在设置新Bitmap之前执行,才能确保新Bitmap使用初始状态渲染- 你同时维护了
ImageView的scaleX/scaleY和imageMatrix的缩放,两者会叠加生效,重置时必须同时处理
内容的提问来源于stack exchange,提问作者jetberrocal
相关产品推荐
相关产品推荐

