You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.2 KiB
Kotlin
55 lines
2.2 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
package org.mozilla.fenix.ext
|
|
|
|
import android.graphics.Bitmap
|
|
import android.graphics.Matrix
|
|
import android.view.View
|
|
import android.widget.ImageView
|
|
|
|
/**
|
|
* This will scale the received [Bitmap] to the size of the [view]. It retains the bitmap's
|
|
* original aspect ratio, but will shrink or enlarge it to fit the viewport. If bitmap does not
|
|
* correctly fit the aspect ratio of the view, it will be shifted to prioritize the bottom-left
|
|
* of the bitmap.
|
|
*/
|
|
fun Bitmap.scaleToBottomOfView(view: ImageView) {
|
|
val bitmap = this
|
|
view.setImageBitmap(bitmap)
|
|
view.scaleType = ImageView.ScaleType.MATRIX
|
|
val matrix = Matrix()
|
|
view.addOnLayoutChangeListener(
|
|
object : View.OnLayoutChangeListener {
|
|
override fun onLayoutChange(
|
|
v: View?,
|
|
left: Int,
|
|
top: Int,
|
|
right: Int,
|
|
bottom: Int,
|
|
oldLeft: Int,
|
|
oldTop: Int,
|
|
oldRight: Int,
|
|
oldBottom: Int,
|
|
) {
|
|
val viewWidth: Float = view.width.toFloat()
|
|
val viewHeight: Float = view.height.toFloat()
|
|
val bitmapWidth = bitmap.width
|
|
val bitmapHeight = bitmap.height
|
|
val widthScale = viewWidth / bitmapWidth
|
|
val heightScale = viewHeight / bitmapHeight
|
|
val scale = widthScale.coerceAtLeast(heightScale)
|
|
matrix.postScale(scale, scale)
|
|
// The image is translated to its bottom such that any pertinent information is
|
|
// guaranteed to be shown.
|
|
// Majority of this math borrowed from // https://medium.com/@tokudu/how-to-whitelist-strictmode-violations-on-android-based-on-stacktrace-eb0018e909aa
|
|
// except that there is no need to translate horizontally in our case.
|
|
matrix.postTranslate(0f, (viewHeight - bitmapHeight * scale))
|
|
view.imageMatrix = matrix
|
|
view.removeOnLayoutChangeListener(this)
|
|
}
|
|
},
|
|
)
|
|
}
|