/ * 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 )
}
} ,
)
}