package com.motorola.musicbox.view
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.RectF
import android.graphics.Shader
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.graphics.drawable.toBitmap
class TopRoundedImageView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {
private var cornerRadius = 24f // 圆角大小,单位为像素
init {
// 将圆角大小转换为像素
cornerRadius = context.resources.displayMetrics.density * cornerRadius
}
private fun roundTopBitmapByShader(bitmap: Bitmap, outWidth: Int, outHeight: Int, radius: Float): Bitmap {
val widthScale = outWidth.toFloat() / bitmap.width
val heightScale = outHeight.toFloat() / bitmap.height
val matrix = Matrix().apply {
postScale(widthScale, heightScale)
}
val bitmapShader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP).apply {
setLocalMatrix(matrix)
}
val targetBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888)
val targetCanvas = Canvas(targetBitmap).apply {
val paint = Paint().apply {
isAntiAlias = true
shader = bitmapShader
}
// 绘制顶部圆角
drawRoundRect(RectF(0f, 0f, outWidth.toFloat(), (radius * 2).toFloat()), radius, radius, paint)
// 绘制底部直角部分
drawRect(RectF(0f, radius, outWidth.toFloat(), outHeight.toFloat()), paint)
}
return targetBitmap
}
override fun onDraw(canvas: Canvas) {
val drawable = drawable ?: return
val bitmap = drawable.toBitmap()
val scaledBitmap = roundTopBitmapByShader(bitmap, width, height, cornerRadius)
setImageBitmap(scaledBitmap)
super.onDraw(canvas)
}
}
实现顶部圆角的自定义ImageView
于 2024-07-19 17:24:29 首次发布