|
@@ -0,0 +1,86 @@
|
|
|
+package com.sikey.veryfit.utils
|
|
|
+
|
|
|
+import android.content.Context
|
|
|
+import android.graphics.*
|
|
|
+import androidx.core.content.ContextCompat
|
|
|
+import com.sikey.veryfit.component.log.Logger
|
|
|
+
|
|
|
+object GroupAvatarUtils {
|
|
|
+ // 成员头像URL列表转宫格头像
|
|
|
+ fun createGroupAvatar(memberAvatars: List<Bitmap?>, targetSize: Int): Bitmap {
|
|
|
+ // 创建目标Bitmap,尺寸为targetSize x targetSize
|
|
|
+ val resultBitmap = Bitmap.createBitmap(targetSize, targetSize, Bitmap.Config.ARGB_8888)
|
|
|
+ val canvas = Canvas(resultBitmap)
|
|
|
+
|
|
|
+ // 如果没有头像,返回空白Bitmap
|
|
|
+ if (memberAvatars.isEmpty()) {
|
|
|
+ return resultBitmap
|
|
|
+ }
|
|
|
+
|
|
|
+ // 取前四个非空头像
|
|
|
+ val validAvatars = memberAvatars.filterNotNull().take(4)
|
|
|
+ val avatarCount = validAvatars.size
|
|
|
+
|
|
|
+ when (avatarCount) {
|
|
|
+ 1 -> {
|
|
|
+ // 单个头像,缩放到目标大小
|
|
|
+ val avatar = validAvatars[0]
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, targetSize, targetSize, true)
|
|
|
+ canvas.drawBitmap(scaledAvatar, 0f, 0f, null)
|
|
|
+ }
|
|
|
+ 2 -> {
|
|
|
+ // 两个头像,左右排列
|
|
|
+ val avatarSize = targetSize / 2
|
|
|
+ validAvatars.forEachIndexed { index, avatar ->
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, targetSize, targetSize, true)
|
|
|
+ val left = if (index == 0) 0-avatarSize else avatarSize + 2
|
|
|
+ canvas.drawBitmap(scaledAvatar, left.toFloat(), 0f, null)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 3 -> {
|
|
|
+ // 三个头像,左右排列
|
|
|
+ val avatarSize = targetSize / 2
|
|
|
+ validAvatars.forEachIndexed { index, avatar ->
|
|
|
+ if (index == 0) {
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, targetSize, targetSize, true)
|
|
|
+ val left = -avatarSize-2
|
|
|
+ canvas.drawBitmap(scaledAvatar, left.toFloat(), 0f, null)
|
|
|
+ } else if (index == 1) {
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, avatarSize, avatarSize, true)
|
|
|
+ canvas.drawBitmap(scaledAvatar, avatarSize.toFloat(), 0f, null)
|
|
|
+ } else {
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, avatarSize, avatarSize, true)
|
|
|
+ val top = avatarSize + 2
|
|
|
+ canvas.drawBitmap(scaledAvatar, avatarSize.toFloat(), top.toFloat(), null)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 4 -> {
|
|
|
+ // 四个头像,2x2宫格
|
|
|
+ val avatarSize = targetSize / 2 + 2
|
|
|
+ validAvatars.forEachIndexed { index, avatar ->
|
|
|
+ val scaledAvatar = Bitmap.createScaledBitmap(avatar, avatarSize - 1, avatarSize - 1, true)
|
|
|
+ val left = if (index % 2 == 0) 0 else avatarSize
|
|
|
+ val top = if (index < 2) 0 else avatarSize
|
|
|
+ canvas.drawBitmap(scaledAvatar, left.toFloat(), top.toFloat(), null)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return BitmapTools.toCircleBitmap(resultBitmap)
|
|
|
+ }
|
|
|
+
|
|
|
+ fun loadVectorDrawableAsBitmap(context: Context, drawableId: Int, targetSize: Int): Bitmap? {
|
|
|
+ try {
|
|
|
+ val drawable = ContextCompat.getDrawable(context, drawableId) ?: return null
|
|
|
+ val bitmap = Bitmap.createBitmap(targetSize, targetSize, Bitmap.Config.ARGB_8888)
|
|
|
+ val canvas = Canvas(bitmap)
|
|
|
+ drawable.setBounds(0, 0, targetSize, targetSize)
|
|
|
+ drawable.draw(canvas)
|
|
|
+ return bitmap
|
|
|
+ } catch (e: Exception) {
|
|
|
+ Logger.e("GroupAvatarUtils", "Failed to load vector drawable: $e")
|
|
|
+ return null
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|