Make exported avatar not blurry

This commit is contained in:
Phillip Thelen 2023-08-11 13:42:23 +02:00
parent 0be77ca124
commit bc3b58f5b7
3 changed files with 28 additions and 7 deletions

View file

@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.interactors
import android.graphics.Bitmap
import android.view.ViewGroup
import androidx.core.graphics.scale
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.DialogLevelup10Binding
import com.habitrpg.android.habitica.helpers.SoundManager
@ -68,7 +69,7 @@ constructor(
avatarView.setAvatar(requestValues.user)
var sharedImage: Bitmap? = null
avatarView.onAvatarImageReady { image ->
sharedImage = image
sharedImage = image?.scale(image.width * 3, image.height * 3, false)
}
val alert = HabiticaAlertDialog(requestValues.activity)

View file

@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.customization
import android.graphics.Bitmap
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@ -18,9 +19,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.graphics.scale
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.map
import com.habitrpg.android.habitica.R
@ -28,13 +31,16 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentComposeScrollingBinding
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.HabiticaButton
import com.habitrpg.android.habitica.ui.views.SegmentedControl
import com.habitrpg.android.habitica.ui.views.equipment.AvatarCustomizationOverviewView
import com.habitrpg.android.habitica.ui.views.equipment.EquipmentOverviewView
import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.views.AvatarView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject
@ -88,6 +94,14 @@ open class AvatarOverviewFragment :
},
{ type, equipped, isCostume ->
displayEquipmentFragment(type, equipped, isCostume)
}, {
val avatarView = AvatarView(requireActivity(), showBackground = true, showMount = true, showPet = true)
avatarView.layoutParams = ViewGroup.LayoutParams(140, 147)
userViewModel.user.value?.let { avatarView.setAvatar(it) }
avatarView.onAvatarImageReady { image ->
if (image == null) return@onAvatarImageReady
(requireActivity() as BaseActivity).shareContent("customization", "Look at my Avatar!", image.scale(image.width * 3, image.height * 3, false))
}
}
)
}
@ -150,7 +164,8 @@ fun AvatarOverviewView(
costumeTwoHanded: Boolean = false,
onCustomizationTap: (String, String?) -> Unit,
onAvatarEquipmentTap: (String, String?) -> Unit,
onEquipmentTap: (String, String?, Boolean) -> Unit
onEquipmentTap: (String, String?, Boolean) -> Unit,
onShareTap: () -> Unit
) {
val user by userViewModel.user.observeAsState()
Column(

View file

@ -8,6 +8,7 @@ import android.graphics.PointF
import android.graphics.Rect
import android.graphics.RectF
import android.graphics.drawable.Animatable
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.util.AttributeSet
@ -72,7 +73,9 @@ class AvatarView : FrameLayout {
if (BuildConfig.DEBUG && (avatar == null || avatarRectF == null)) {
error("Assertion failed")
}
val canvasRect = Rect(0, 0, 140.dpToPx(context), 147.dpToPx(context))
val viewWidth = if (width > 0) width else layoutParams.width
val viewHeight = if (height > 0) height else layoutParams.height
val canvasRect = Rect(0, 0, if (viewWidth > 0) viewWidth else 140.dpToPx(context), if (viewHeight > 0) viewHeight else 147.dpToPx(context))
if (canvasRect.isEmpty) return null
avatarBitmap = Bitmap.createBitmap(
canvasRect.width(),
@ -82,11 +85,11 @@ class AvatarView : FrameLayout {
avatarBitmap?.let { avatarCanvas = Canvas(it) }
imageViewHolder.forEach {
val lp = it.layoutParams
val bitmap = it.drawable?.toBitmap(lp.width, lp.height) ?: return@forEach
val bitmap = (it.drawable as? BitmapDrawable)?.bitmap ?: return@forEach
avatarCanvas?.drawBitmap(
bitmap,
Rect(0, 0, bitmap.width, bitmap.height),
Rect(it.marginStart, it.marginTop, bitmap.width, bitmap.height),
Rect(it.marginStart, it.marginTop, bitmap.width + it.marginStart, bitmap.height + it.marginTop),
null
)
}
@ -470,8 +473,10 @@ class AvatarView : FrameLayout {
// full hero box when showMount and showPet is enabled (140w * 147h)
// compact hero box when only showBackground is enabled (114w * 114h)
// hero only box when all show settings disabled (90w * 90h)
val width = if (this.width > 0) this.width.toFloat() else 140.dpToPx(context).toFloat()
val height = if (this.height > 0) this.height.toFloat() else 147.dpToPx(context).toFloat()
val viewWidth = if (width > 0) width else layoutParams.width
val viewHeight = if (height > 0) height else layoutParams.height
val width = if (viewWidth > 0) viewWidth.toFloat() else 140.dpToPx(context).toFloat()
val height = if (viewHeight > 0) viewHeight.toFloat() else 147.dpToPx(context).toFloat()
avatarRectF = RectF(0f, 0f, width, height)
avatarMatrix.setRectToRect(RectF(srcRect), avatarRectF, Matrix.ScaleToFit.START)
avatarRectF = RectF(srcRect)