首页tab item 新增声音卡

This commit is contained in:
wzq
2023-09-26 18:20:00 +08:00
parent 08230c55a3
commit 5cce2cb68c
10 changed files with 139 additions and 29 deletions

Binary file not shown.

View File

@@ -109,6 +109,9 @@ public class AudioPlayerHelper {
}
public void endPlay() {
if (listener != null) {
listener.onCompletion();
}
handler.removeMessages(WHAT_STATUS.COUNT_PLAY);
if (player != null) {
if (preparing) {

View File

@@ -9,7 +9,7 @@ import com.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
import com.yizhuan.erban.ui.utils.loadFromAssets
import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo
import com.yizhuan.xchat_android_library.utils.StringCutUtils
import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
/**
* create by lvzebiao @2019/11/13
@@ -20,8 +20,7 @@ class HomeChatAdapter :
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
val svgaLiving = helper.getView<SVGAImageView>(R.id.svga_living)
ImageLoadUtilsV2.loadAvatar(helper.getView(R.id.iv_avatar), item.avatar)
val name = StringCutUtils.subStrByLen(item.title.substring(0, item.title.length - 3), 8)
helper.setText(R.id.tv_name, name)
helper.setText(R.id.tv_name, item.title.subAndReplaceDot(8))
if (item.mgId == 0L) {
helper.getView<Group>(R.id.group_game).visibility = View.INVISIBLE
} else {

View File

@@ -7,32 +7,47 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.Group
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.google.android.flexbox.AlignItems
import com.google.android.flexbox.FlexDirection
import com.opensource.svgaplayer.SVGAImageView
import com.yizhuan.erban.R
import com.yizhuan.erban.audio.helper.AudioPlayerHelper
import com.yizhuan.erban.audio.helper.OnPlayListener
import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.ui.im.avtivity.NimP2PMessageActivity
import com.yizhuan.erban.ui.user.activity.UserInfoActivity
import com.yizhuan.erban.ui.user.adapter.UserInfoLabelAdapter
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.erban.ui.utils.loadAvatar
import com.yizhuan.erban.ui.utils.loadFromAssets
import com.yizhuan.erban.view.GenderAgeTextView
import com.yizhuan.xchat_android_core.Constants
import com.yizhuan.xchat_android_core.manager.AudioEngineManager
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_core.user.bean.UserInfo.SoundBean
import com.yizhuan.xchat_android_core.utils.StarUtils
import com.yizhuan.xchat_android_core.utils.ifNullOrEmpty
import com.yizhuan.xchat_android_library.common.widget.LinesFlexBoxLayoutManager
import com.yizhuan.xchat_android_library.utils.ListUtils
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.Date
import java.util.concurrent.TimeUnit
class RoomNewFriendsAdapter :
BaseQuickAdapter<UserInfo, BaseViewHolder>(R.layout.item_room_new_friends) {
private var disposable: Disposable? = null
private var isMute = false
private var isRemoteMute = false
override fun convert(helper: BaseViewHolder, item: UserInfo) {
helper.getView<ImageView>(R.id.iv_avatar).loadAvatar(item.avatar)
helper.setText(R.id.tv_desc, item.userDesc.ifNullOrEmpty { "我是个默认签名" })
@@ -46,15 +61,13 @@ class RoomNewFriendsAdapter :
helper.setText(R.id.tv_constellation, star)
val tvTalk = helper.getView<TextView>(R.id.tv_talk)
val viewOnline = helper.getView<View>(R.id.view_online)
val groupParty = helper.getView<Group>(R.id.group_party)
viewOnline.isVisible = item.inOnline
if (item.inMic) {
groupParty.visibility = View.VISIBLE
} else {
groupParty.visibility = View.INVISIBLE
}
helper.setVisible(
R.id.view_online, if (item.inMic) {
false
} else item.inOnline
)
helper.setVisible(R.id.group_party, item.inMic)
if (item.inRoomUid != 0L) {
tvTalk.text = "去找TA"
@@ -93,16 +106,17 @@ class RoomNewFriendsAdapter :
)
}
if (item.audioCard != null && !TextUtils.isEmpty(item.audioCard.audioUrl)) {
if (item.userVoice.isNullOrBlank()) {
helper.getView<AppCompatTextView>(R.id.tv_desc).visibility = View.VISIBLE
helper.getView<LinearLayout>(R.id.llAudio).visibility = View.GONE
} else {
helper.getView<AppCompatTextView>(R.id.tv_desc).visibility = View.GONE
helper.getView<LinearLayout>(R.id.llAudio).visibility = View.VISIBLE
helper.getView<AppCompatTextView>(R.id.tvAudio).text = item.audioCard.second.toString()
helper.getView<AppCompatTextView>(R.id.tvAudio).text = item.voiceDura.toString()
helper.getView<LinearLayout>(R.id.llAudio)
.setOnClickListener { v -> toggleAudio(item.audioCard) }
} else {
helper.getView<AppCompatTextView>(R.id.tv_desc).visibility = View.VISIBLE
helper.getView<LinearLayout>(R.id.llAudio).visibility = View.GONE
.setOnClickListener { toggleAudio(helper, item) }
helper.setImageResource(R.id.liv_user, R.drawable.ic_sound_wave)
}
val mLabelRecyclerView = helper.getView<RecyclerView>(R.id.mLabelRecyclerView)
@@ -124,8 +138,91 @@ class RoomNewFriendsAdapter :
}
private fun toggleAudio(audioCard: SoundBean) {
private fun toggleAudio(holder: BaseViewHolder, item: UserInfo) {
if (item.isVoicePlaying) {
stopAudio()
} else {
playAudio(holder, item)
}
}
private fun stopAudio() {
AudioPlayerHelper.get().endPlay()
}
private fun resetAudioUI(holder: BaseViewHolder, item: UserInfo) {
item.isVoicePlaying = false
disposable?.dispose()
holder.setImageResource(R.id.iv_audio_control, R.drawable.ic_sound_pause)
holder.setText(R.id.tvAudio, item.voiceDura.toString())
val svgaImageView = holder.getView<SVGAImageView>(R.id.liv_user)
svgaImageView.stopAnimation()
svgaImageView.setImageResource(R.drawable.ic_sound_wave)
AvRoomDataManager.get().mCurrentRoomInfo?.run {
AudioEngineManager.get().isRemoteMute = isRemoteMute //非靜音
AudioEngineManager.get().isMute = isMute //能説話
AudioEngineManager.get().setRole(
if (isRemoteMute) Constants.CLIENT_ROLE_AUDIENCE else Constants.CLIENT_ROLE_BROADCASTER
)
}
}
private fun playAudio(holder: BaseViewHolder, item: UserInfo) {
AudioPlayerHelper.get().endPlay()
item.isVoicePlaying = true
holder.setImageResource(R.id.iv_audio_control, R.drawable.ic_sound_start)
val svgaImageView = holder.getView<SVGAImageView>(R.id.liv_user)
svgaImageView.loadFromAssets("svga/home_voice_playing.svga")
disposable = Observable.interval(1L, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.map { it + 1 }
.takeUntil { it == item.voiceDura.toLong() }
.subscribe {
holder.setText(R.id.tvAudio, (item.voiceDura - it).toString())
}
AvRoomDataManager.get().mCurrentRoomInfo?.run {
isRemoteMute = AudioEngineManager.get().isRemoteMute
isMute = AudioEngineManager.get().isMute
AudioEngineManager.get().isRemoteMute = true //設置靜音
AudioEngineManager.get().isMute = true //不能説話
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE)
}
AudioPlayerHelper.get().playInThread(item.userVoice, object : OnPlayListener {
override fun onError(error: String) {
SingleToastUtil.showToast(mContext.getString(R.string.me_error_playing))
resetAudioUI(holder, item)
}
override fun onPrepared() {}
override fun onPlaying(currDuration: Long) {}
override fun onCompletion() {
resetAudioUI(holder, item)
}
})
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
super.onViewDetachedFromWindow(holder)
val position = holder.absoluteAdapterPosition
if (position < 0 || position >= data.size) {
return
}
val item = data[position]
if (item.isVoicePlaying) {
stopAudio()
}
}
}

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:width="2dp" android:color="#ff759fff" />
<stroke android:width="2dp" android:color="@color/color_a974ff" />
<corners android:radius="360dp" />
</shape>

View File

@@ -84,6 +84,6 @@
app:layout_constraintEnd_toEndOf="@+id/view_bg"
app:layout_constraintStart_toEndOf="@+id/svga_living"
app:layout_constraintTop_toBottomOf="@+id/view_aperture"
tools:text="音樂與" />
tools:text="音音音樂與音樂與" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -20,8 +20,8 @@
<View
android:id="@+id/view_aperture"
android:layout_width="68dp"
android:layout_height="68dp"
android:layout_width="@dimen/dp_68"
android:layout_height="@dimen/dp_68"
android:layout_marginStart="@dimen/dp_10"
android:background="@drawable/bg_759fff_2"
app:layout_constraintBottom_toBottomOf="@+id/view_bg"
@@ -62,7 +62,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:constraint_referenced_ids="iv_mask_party,iv_party,view_aperture" />
app:constraint_referenced_ids="iv_mask_party,iv_party,view_aperture"
tools:visibility="visible" />
<View
android:id="@+id/view_online"
@@ -92,7 +93,7 @@
<com.yizhuan.erban.view.GenderAgeTextView
android:id="@+id/tv_gender_age"
android:layout_width="@dimen/dp_28"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_14"
android:layout_marginStart="@dimen/dp_4"
android:textSize="@dimen/sp_10"
@@ -201,7 +202,8 @@
android:layout_height="@dimen/dp_10"
android:layout_marginStart="@dimen/dp_4"
android:src="@drawable/ic_sound_wave"
app:autoPlay="true" />
app:autoPlay="false"
app:clearsAfterDetached="true" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvAudio"

View File

@@ -696,5 +696,6 @@
<color name="color_6bb3ff">#6BB3FF</color>
<color name="color_5CF1FF">#5CF1FF</color>
<color name="color_CF70FF">#CF70FF</color>
<color name="color_a974ff">#A974FF</color>
</resources>

View File

@@ -89,6 +89,14 @@ public class UserInfo implements Serializable {
private String userVoice;
//声音时间
private int voiceDura;
/**
* 声音是否正在播放, RecycleView 记录状态
*/
@Getter
@Setter
private boolean voicePlaying;
//关注数
private long followNum;
//粉丝数