mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
Make exported avatar not blurry
This commit is contained in:
parent
0be77ca124
commit
bc3b58f5b7
3 changed files with 28 additions and 7 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue