首页tab item 新增声音卡
This commit is contained in:
BIN
app/src/main/assets/svga/home_voice_playing.svga
Normal file
BIN
app/src/main/assets/svga/home_voice_playing.svga
Normal file
Binary file not shown.
@@ -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) {
|
||||
|
@@ -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 {
|
||||
|
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
@@ -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>
|
@@ -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>
|
@@ -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"
|
||||
|
@@ -695,5 +695,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>
|
||||
|
@@ -89,6 +89,14 @@ public class UserInfo implements Serializable {
|
||||
private String userVoice;
|
||||
//声音时间
|
||||
private int voiceDura;
|
||||
|
||||
/**
|
||||
* 声音是否正在播放, RecycleView 记录状态
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private boolean voicePlaying;
|
||||
|
||||
//关注数
|
||||
private long followNum;
|
||||
//粉丝数
|
||||
|
Reference in New Issue
Block a user