[Modify]修复动态特权卡不能显示的问题

This commit is contained in:
wushaocheng
2023-09-08 14:36:23 +08:00
parent f2b755cf77
commit 24606d7b44
7 changed files with 288 additions and 41 deletions

View File

@@ -2,11 +2,6 @@ package com.nnbc123.app.avroom.activity
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.text.SpannableString
import android.text.Spanned
import android.text.method.LinkMovementMethod
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
@@ -15,18 +10,12 @@ import com.netease.nim.uikit.StatusBarUtil
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.R
import com.nnbc123.app.adapter.CommonVPAdapter
import com.nnbc123.app.avroom.dialog.CreatePrivilegeCardDialog
import com.nnbc123.app.avroom.fragment.PrivilegeCardFragment
import com.nnbc123.app.avroom.fragment.RoomBgFragment
import com.nnbc123.app.base.BaseViewBindingActivity
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan
import com.nnbc123.app.databinding.ActivityPrivilegeBinding
import com.nnbc123.app.databinding.ActivityRoomBgBinding
import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.UriProvider
import com.nnbc123.library.annatation.ActLayoutRes
/**

View File

@@ -1,19 +1,26 @@
package com.nnbc123.app.avroom.dialog
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.Gravity
import androidx.core.content.ContextCompat
import androidx.fragment.app.viewModels
import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.ErbanTakePhotoActivity
import com.nnbc123.app.ErbanTakePhotoActivity.TakePhotoCallBack
import com.nnbc123.app.R
import com.nnbc123.app.application.XChatApplication
import com.nnbc123.app.avroom.PrivilegeViewModel
import com.nnbc123.app.avroom.event.PrivilegeCardEvent
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.base.BaseDialog
import com.nnbc123.app.common.util.BitmapUtil
import com.nnbc123.app.databinding.DialogCreatePrivilegeCardBinding
import com.nnbc123.app.takephoto.model.TResult
import com.nnbc123.app.ui.utils.ImageLoadUtils
@@ -21,9 +28,20 @@ import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.core.file.FileModel
import com.nnbc123.core.privilege.bean.PrivilegeCardInfo
import com.nnbc123.core.utils.Logger
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.library.common.file.FileHelper
import com.nnbc123.library.common.glide.GlideUtils
import com.nnbc123.library.common.photo.PhotoProviderNew
import com.nnbc123.library.common.util.PhotoCompressCallback
import com.nnbc123.library.common.util.PhotoCompressUtil
import com.nnbc123.library.easyphoto.constant.Type
import com.nnbc123.library.utils.SingleToastUtil
import com.yalantis.ucrop.UCrop
import kotlinx.coroutines.Job
import org.greenrobot.eventbus.EventBus
import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Pattern
/**
@@ -35,6 +53,15 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
TakePhotoCallBack {
companion object {
private const val TAG = "CreatePrivilegeCardDial"
private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111 // 从相册中选择
private const val MAX_BITMAP_SIZE = 100 * 1024 * 1024 // 剪切的图片最大为100 MB
private const val MIN_HEAD_PHOTO_SIZE = 20 * 1024 // 剪切的图片最小为20kb
//压缩后的大小不能超过大小 800KB
private const val IMAGE_MOST_COMPRESS_SIZE = 800
@JvmStatic
fun newInstance(): CreatePrivilegeCardDialog {
return CreatePrivilegeCardDialog()
@@ -54,7 +81,10 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
private var saveTipDialog: CommonTipDialog? = null
private var url = ""
private var mUrl = ""
private var mUri: Uri? = null
private var mJob: Job? = null
private val privilegeViewModel: PrivilegeViewModel by viewModels()
@@ -74,7 +104,7 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
binding.edValid.setText(it.effectDay.toString())
binding.edId.setText(it.erbanNoStr)
ImageLoadUtilsV2.loadImage(binding.ivPic, it.cardUrl)
this.url = it.cardUrl
this.mUrl = it.cardUrl
}
binding.edName.addTextChangedListener(object : TextWatcher {
@@ -153,7 +183,12 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
})
binding.ivPic.setOnClickListener {
ErbanTakePhotoActivity.startToSelectPhoto(context, this)
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProviderNew.photoProvider(
this,
canChooseGif = true,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
}
binding.tvCancel.setOnClickListener {
dismissAllowingStateLoss()
@@ -175,6 +210,12 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
}
}
private fun getNowTime(): String {
val date = Date(System.currentTimeMillis())
val dateFormat = SimpleDateFormat("MMddHHmmssSS")
return dateFormat.format(date)
}
private fun showTip() {
if (saveTipDialog == null) {
saveTipDialog = CommonTipDialog(context)
@@ -187,7 +228,7 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
binding.edExplain.text.toString(),
binding.edValid.text.toString().toInt(),
binding.edId.text.toString(),
url
mUrl
)
saveTipDialog?.dismiss()
}
@@ -207,7 +248,7 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
return (TextUtils.isEmptyText(binding.edName.text.toString()) || TextUtils.isEmptyText(
binding.edUseNumber.text.toString()
) || TextUtils.isEmptyText(binding.edValid.text.toString()) || TextUtils.isEmptyText(binding.edId.text.toString()) || TextUtils.isEmptyText(
url
mUrl
))
}
@@ -219,6 +260,130 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
return matcher.matches() || matcher1.matches()
}
@SuppressLint("CheckResult")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == BaseActivity.RESULT_OK) {
when (requestCode) {
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> data?.let {
val photos = PhotoProviderNew.getResultPhotoList(it) ?: return
if (photos.isNotEmpty()) {
val photo = photos[0]
if(photo.path.endsWith(Type.GIF) || photo.type.endsWith(Type.GIF)){
FileModel.get()
.uploadFile(photo.path)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
SingleToastUtil.showToast("上传失败")
} else {
url?.let { it1 ->
GlideUtils.instance().loadUriGiftAndCrossFadeRound(
it1, binding.ivPic, 10f)
}
if (url != null) {
mUrl = url
}
}
}
} else {
crop(photo.uri, photo.size, mUri)
}
}
}
UCrop.REQUEST_CROP ->{
mUri?.path?.let {
mJob = PhotoCompressUtil.compress(
context as Activity,
it,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
@SuppressLint("CheckResult")
override fun onSuccess(compressedImg: String) {
FileModel.get()
.uploadFile(compressedImg)
.compose(bindToLifecycle())
.subscribe { url: String?, throwable: Throwable? ->
if (throwable != null) {
SingleToastUtil.showToast("上传失败")
} else {
ImageLoadUtils.loadRectImage(
context,
url,
binding.ivPic,
R.drawable.default_cover,
ScreenUtil.dip2px(10f)
)
if (url != null) {
mUrl = url
}
}
}
}
override fun onFail(e: Throwable) {
ToastUtils.show(e.message)
}
},
mostCompressSize = IMAGE_MOST_COMPRESS_SIZE
)
}
}
}
}
}
/**
* 第三方图片裁剪框架Ucrop
*/
private fun crop(sourceUri: Uri?, sourceSize: Long, destinationUri: Uri?) {
if (sourceUri == null || destinationUri == null) {
return
} //防止too large导致oom大于100m不处理内存大小
if (BitmapUtil.getSdBitmapSize(sourceUri) >= MAX_BITMAP_SIZE) {
ToastUtils.show(R.string.text_bitmap_too_large)
return
}
if (sourceSize > 0) {
//不能上传图片的最小文件大小
Logger.debug(TAG, "sourceSize: $sourceSize")
if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
ToastUtils.show(R.string.text_bitmap_too_small)
return
}
}
val options = UCrop.Options().apply {
setCompressionQuality(100)
setShowCropGrid(false)
setToolbarColor(
ContextCompat.getColor(
XChatApplication.gContext,
android.R.color.black
)
)
setStatusBarColor(
ContextCompat.getColor(
XChatApplication.gContext,
android.R.color.black
)
)
setHideBottomControls(true)
setCompressionFormat(Bitmap.CompressFormat.JPEG)
setToolbarCancelDrawable(R.drawable.user_ucrop_ic_closs)
setToolbarCropDrawable(R.drawable.user_ucrop_ic_sure)
setToolbarWidgetColor(
ContextCompat.getColor(
XChatApplication.gContext,
R.color.color_white
)
)
}
context?.let {
UCrop.of(sourceUri, destinationUri).withOptions(options).withAspectRatio(16f, 9f)
.withMaxResultSize(1422, 800).start(it, this)
}
}
@SuppressLint("CheckResult")
override fun takeSuccess(result: TResult?) {
FileModel.get()
@@ -236,7 +401,7 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
ScreenUtil.dip2px(10f)
)
if (url != null) {
this.url = url
mUrl = url
}
}
}
@@ -250,4 +415,9 @@ class CreatePrivilegeCardDialog : BaseDialog<DialogCreatePrivilegeCardBinding>()
}
override fun onDestroyView() {
super.onDestroyView()
mJob?.cancel()
}
}

View File

@@ -26,15 +26,7 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2;
import com.nnbc123.core.im.custom.bean.RoomPrivilegeAttachment;
import com.opensource.svgaplayer.SVGACallback;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAVideoEntity;
import com.nnbc123.app.R;
import com.nnbc123.app.common.svga.SimpleSvgaParseCompletion;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
@@ -50,6 +42,7 @@ import com.nnbc123.core.gift.bean.GiftReceiver;
import com.nnbc123.core.gift.bean.LuckyBagGifts;
import com.nnbc123.core.gift.bean.MultiGiftReceiveInfo;
import com.nnbc123.core.im.custom.bean.FansTeamMsgAttachment;
import com.nnbc123.core.im.custom.bean.RoomPrivilegeAttachment;
import com.nnbc123.core.magic.MagicModel;
import com.nnbc123.core.magic.ObjectPool;
import com.nnbc123.core.magic.bean.MagicInfo;
@@ -60,7 +53,13 @@ import com.nnbc123.core.manager.IMNetEaseManager;
import com.nnbc123.core.manager.RoomEvent;
import com.nnbc123.core.monsterhunting.bean.MonsterAttackInfo;
import com.nnbc123.core.room.bean.RoomInfo;
import com.nnbc123.library.common.glide.GlideUtils;
import com.nnbc123.library.utils.ResolutionUtils;
import com.opensource.svgaplayer.SVGACallback;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAVideoEntity;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
@@ -806,13 +805,8 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
senderPoint = new Point(mScreenWidth / 2 - privilegeWidth / 2, UIUtil.dip2px(context, 25));
}
SVGAImageView imageView = mMagicViewPool.borrowPrivilegeObject(senderPoint);
ImageLoadUtils.loadRectImage(
context,
giftUrl,
imageView,
R.drawable.default_cover,
ScreenUtil.dip2px(8f)
);
GlideUtils.instance().loadGiftAndCrossFadeRound(
giftUrl, imageView, 8f);
Keyframe keyTransX3 = (Keyframe.ofFloat(0.5f, center.x - senderPoint.x - privilegeWidth / 2));
Keyframe keyTransX4 = (Keyframe.ofFloat(0.8f, center.x - senderPoint.x - privilegeWidth / 2));

View File

@@ -96,6 +96,7 @@ import com.nnbc123.core.user.bean.UserInfo;
import com.nnbc123.core.utils.net.RxHelper;
import com.nnbc123.library.bindinglist.IItem;
import com.nnbc123.library.bindinglist.MultiTypeAdapter;
import com.nnbc123.library.common.glide.GlideUtils;
import com.nnbc123.library.utils.FormatUtils;
import com.nnbc123.library.utils.ListUtils;
import com.nnbc123.library.utils.SingleToastUtil;
@@ -841,8 +842,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene
if (item == null) {
return;
}
RoundedImageView imageView = helper.getView(R.id.iv_pic);
ImageLoadUtilsV2.loadImage(imageView, item.getCardUrl());
GlideUtils.instance().loadGiftAndImage(
item.getCardUrl(), imageView);
if (item.isSelected()) {
imageView.setBorderColor(ContextCompat.getColor(mContext, R.color.color_FFDA24));
imageView.setBorderWidth((float) 2);

View File

@@ -282,13 +282,11 @@
app:layout_constraintEnd_toEndOf="@+id/ivPicAdd"
app:layout_constraintTop_toBottomOf="@+id/ivPicAdd"/>
<com.nnbc123.app.common.widget.RectRoundImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivPic"
android:layout_width="0dp"
android:layout_height="0dp"
tools:src="@drawable/default_cover"
app:borderRadius="10dp"
app:type="round"
app:layout_constraintStart_toStartOf="@+id/viewPic"
app:layout_constraintEnd_toEndOf="@+id/viewPic"
app:layout_constraintTop_toTopOf="@+id/viewPic"

View File

@@ -29,5 +29,5 @@ COMPILE_SDK_VERSION=32
MIN_SDK_VERSION=21
TARGET_SDK_VERSION=32
version_name=1.3.0
version_code=130
version_name=1.3.2
version_code=132

View File

@@ -25,6 +25,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.DrawableImageViewTarget
import com.bumptech.glide.request.target.Target
import com.nnbc123.library.common.transform.AssignScaleTransformation
@@ -35,6 +36,7 @@ import com.nnbc123.library.common.util.Utils
import jp.wasabeef.glide.transformations.RoundedCornersTransformation
import java.io.File
/**
* author: create by wushaocheng on 2022/12/29
* 图片加载工具类
@@ -357,6 +359,89 @@ class GlideUtils {
}
}
/**
* 加载Uri Gift图片并添加图片过度动画无默认图无动画
* @param uri gift路径
*/
fun loadUriGiftAndCrossFadeRound(uri: Uri, imageView: ImageView?, radius: Float) {
if (imageView == null) {
Logger.error(TAG, "loadUriGift imageView is null")
return
}
getGlideConfig(imageView.context)?.apply {
this.asGif().load(uri)
.transform(
CenterCrop(), RoundedCornersTransformation(
Utils.dip2px(imageView.context, radius),
0, RoundedCornersTransformation.CornerType.ALL
)
)
.transition(DrawableTransitionOptions.withCrossFade()).into(imageView)
}
}
/**
* 加载Uri Gift图片并添加图片过度动画无默认图无动画
* @param uri gift路径
*/
fun loadUriGiftAndCrossFadeRound(uri: String, imageView: ImageView?, radius: Float) {
if (imageView == null) {
Logger.error(TAG, "loadUriGift imageView is null")
return
}
getGlideConfig(imageView.context)?.apply {
this.asGif().load(uri)
.transform(
CenterCrop(), RoundedCornersTransformation(
Utils.dip2px(imageView.context, radius),
0, RoundedCornersTransformation.CornerType.ALL
)
)
.transition(DrawableTransitionOptions.withCrossFade()).into(imageView)
}
}
/**
* 加载Uri Gift图片并添加图片过度动画无默认图无动画
* @param uri gift路径
*/
fun loadGiftAndCrossFadeRound(uri: String, imageView: ImageView?, radius: Float) {
if (imageView == null) {
Logger.error(TAG, "loadUriGift imageView is null")
return
}
val options = RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)
getGlideConfig(imageView.context)?.apply {
this.load(uri)
.apply(options)
.transform(
CenterCrop(), RoundedCornersTransformation(
Utils.dip2px(imageView.context, radius),
0, RoundedCornersTransformation.CornerType.ALL
)
)
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView)
}
}
/**
* 加载Uri Gift图片并添加图片过度动画无默认图无动画
* @param uri gift路径
*/
fun loadGiftAndImage(uri: String, imageView: ImageView?) {
if (imageView == null) {
Logger.error(TAG, "loadUriGift imageView is null")
return
}
val options = RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)
getGlideConfig(imageView.context)?.apply {
this.asBitmap()
.load(uri)
.apply(options)
.into(imageView)
}
}
/**
* 加载图片时显示过度动画并设置图形变换,缓存模式,无占位图
@@ -1452,7 +1537,13 @@ class GlideUtils {
.into(imageView)
}
}
fun load(url: String?, @DrawableRes defaultRes: Int, @DrawableRes errorRes: Int,imageView: ImageView?) {
fun load(
url: String?,
@DrawableRes defaultRes: Int,
@DrawableRes errorRes: Int,
imageView: ImageView?
) {
if (imageView == null) {
Logger.error(TAG, "load url is invalid or imageViw is null")
return
@@ -1464,6 +1555,7 @@ class GlideUtils {
.into(imageView)
}
}
private fun getGlideConfig(context: Context): RequestManager? {
if (checkActivityIsDestroy(context)) return null