Commit 39f82beb authored by jyx's avatar jyx

优选剧添加跳转指定剧集

parent 6ee82eef
...@@ -10,4 +10,8 @@ ...@@ -10,4 +10,8 @@
app/build app/build
picture_library/build picture_library/build
ucrop/build ucrop/build
videocache/build videocache/build
\ No newline at end of file
wxpay/build
alipay/build
rxpay/build
\ No newline at end of file
...@@ -188,7 +188,7 @@ ...@@ -188,7 +188,7 @@
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
<activity <activity
android:name=".video.tx.NewTxVideoActivity" android:name=".video.tx.newrecommend.NewTxVideoActivity"
android:exported="false" android:exported="false"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:screenOrientation="portrait" /> android:screenOrientation="portrait" />
......
...@@ -11,11 +11,10 @@ import com.duben.miaoquplaylet.ad.express.ExpressManager ...@@ -11,11 +11,10 @@ import com.duben.miaoquplaylet.ad.express.ExpressManager
import com.duben.library.utils.json.JsonUtil import com.duben.library.utils.json.JsonUtil
import com.duben.miaoquplaylet.common.Constant import com.duben.miaoquplaylet.common.Constant
import com.duben.miaoquplaylet.mvp.model.VedioBean import com.duben.miaoquplaylet.mvp.model.VedioBean
import com.duben.miaoquplaylet.ui.activitys.RecommendActivity
import com.duben.miaoquplaylet.utils.AppPreferencesManager import com.duben.miaoquplaylet.utils.AppPreferencesManager
import com.duben.miaoquplaylet.utils.ToastUtil import com.duben.miaoquplaylet.utils.ToastUtil
import com.duben.miaoquplaylet.video.csj.DramaApiDetailActivity import com.duben.miaoquplaylet.video.csj.DramaApiDetailActivity
import com.duben.miaoquplaylet.video.tx.NewTxVideoActivity import com.duben.miaoquplaylet.video.tx.newrecommend.NewTxVideoActivity
import com.duben.miaoquplaylet.video.tx.TxVideoActivity import com.duben.miaoquplaylet.video.tx.TxVideoActivity
/** /**
......
...@@ -34,13 +34,21 @@ public class IndexList implements Serializable { ...@@ -34,13 +34,21 @@ public class IndexList implements Serializable {
this.list = list; this.list = list;
} }
public class VedioEpisodeBean implements Serializable { public class VedioEpisodeBean implements Serializable {
private String vedioUrl; private String vedioUrl;
private int vedioIndex; private int vedioIndex;
private boolean lock; private boolean lock;
private String title; private String title;
private int vedioId; private int vedioId;
private String dos;
public String getDos() {
return dos;
}
public void setDos(String dos) {
this.dos = dos;
}
public String getVedioUrl() { public String getVedioUrl() {
return vedioUrl; return vedioUrl;
......
package com.duben.miaoquplaylet.mvp.model
const val VEDIO3DOS_AD = "ad"
const val VEDIO3DOS_FREE = "free"
const val VEDIO3DOS_PAY = "pay"
data class Vedio3dos(
val list: List<String>,
val num: Int
)
\ No newline at end of file
...@@ -25,3 +25,10 @@ data class VideoMultiItemEntity3( ...@@ -25,3 +25,10 @@ data class VideoMultiItemEntity3(
var videos: List<VedioBean>?, var videos: List<VedioBean>?,
var adView: FrameLayout? var adView: FrameLayout?
) : MultiItemEntity, java.io.Serializable ) : MultiItemEntity, java.io.Serializable
data class VideoMultiItemEntity4(
override var itemType: Int,
var video: IndexList.VedioEpisodeBean?,
var videoModel: VideoModel?,
var type: String?
) : MultiItemEntity, java.io.Serializable
\ No newline at end of file
...@@ -204,4 +204,44 @@ class VideoPresenter : BasePresenter<VideoView>() { ...@@ -204,4 +204,44 @@ class VideoPresenter : BasePresenter<VideoView>() {
} }
fun getIndexList2(thirdId: String, csj: Boolean = false) {
val vo = HashMap<String, Any>()
vo["vedioId"] = thirdId
AppHttpManager.getInstance(loanApplication)
.call(loanService.getIndexList2(vo),
object : BaseSubscriber<BaseResponse<IndexList>>() {
override fun onCompleted() {
if (isLinkView) return
view.hideLoading()
}
override fun onNext(baseResponse: BaseResponse<IndexList>) {
if (isLinkView) return
view.hideLoading()
val code = baseResponse.status
val message = baseResponse.message
when (code) {
200 -> view.getIndexListSuc(baseResponse.data)
else -> {
view.getIndexListFail()
view.showToast(message)
}
}
}
override fun onError(e: Throwable?) {
if (isLinkView) return
view.hideLoading()
view.showToast(e?.message)
view.getIndexListFail()
}
})
}
} }
\ No newline at end of file
...@@ -302,6 +302,14 @@ public interface LoanService { ...@@ -302,6 +302,14 @@ public interface LoanService {
@POST("api/vedio/showTurn") @POST("api/vedio/showTurn")
Observable<BaseResponse<NineShowBean>> showTurn(); Observable<BaseResponse<NineShowBean>> showTurn();
/**
* 优选剧 剧情列表
*
* @return
*/
@POST("api/vedio/getIndexList/vedio3")
Observable<BaseResponse<IndexList>> getIndexList2(@Body Map<String, Object> vo);
/** /**
* 默认http工厂 * 默认http工厂
*/ */
......
...@@ -13,9 +13,7 @@ import com.duben.miaoquplaylet.R ...@@ -13,9 +13,7 @@ import com.duben.miaoquplaylet.R
import com.duben.miaoquplaylet.common.Constant import com.duben.miaoquplaylet.common.Constant
import com.duben.miaoquplaylet.mvp.model.RecommendBean import com.duben.miaoquplaylet.mvp.model.RecommendBean
import com.duben.miaoquplaylet.ui.activitys.base.BaseActivity import com.duben.miaoquplaylet.ui.activitys.base.BaseActivity
import com.duben.miaoquplaylet.utils.LogUtil import com.duben.miaoquplaylet.video.tx.newrecommend.NewTxVideoActivity
import com.duben.miaoquplaylet.video.tx.NewTxVideoActivity
import com.duben.miaoquplaylet.video.tx.TXVideoBaseView
import com.duben.miaoquplaylet.video.tx.TXVodPlayerWrapper import com.duben.miaoquplaylet.video.tx.TXVodPlayerWrapper
import com.duben.miaoquplaylet.video.tx.VideoModel import com.duben.miaoquplaylet.video.tx.VideoModel
import com.duben.library.utils.json.JsonUtil import com.duben.library.utils.json.JsonUtil
......
package com.duben.miaoquplaylet.ui.widgets
import android.app.Dialog
import android.content.Context
import android.view.*
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.duben.miaoquplaylet.R
import com.duben.miaoquplaylet.mvp.model.EpisodeBean
import com.duben.miaoquplaylet.mvp.model.VEDIO3DOS_FREE
import com.duben.miaoquplaylet.mvp.model.VedioBean
import com.duben.miaoquplaylet.mvp.model.VideoMultiItemEntity4
import com.duben.miaoquplaylet.ui.adapter.VideoEpisodeAdapter
import com.duben.miaoquplaylet.utils.CommonUtils
/**
* @author Assen
* @date 2023/7/5
* @desc
*/
class NewVideoEpisodeDialog(
context: Context,
val vedioBean: VedioBean?,
val data: List<VideoMultiItemEntity4>
) :
Dialog(context, R.style.dialog) {
private var mRealSeeIndex = 0
private val lp: WindowManager.LayoutParams
private val vp2: ViewPager2
private val tab: TabLayout
private val ivClose: ImageView
private val mData = mutableListOf<EpisodeBean>()
private var adapter: VideoEpisodeAdapter? = null
init {
setContentView(R.layout.dialog_video_episode)
// 设置window属性
lp = window!!.attributes
lp.gravity = Gravity.BOTTOM
lp.width = WindowManager.LayoutParams.MATCH_PARENT
lp.height = WindowManager.LayoutParams.WRAP_CONTENT
lp.windowAnimations = R.style.DialogAnimBottom
// lp.dimAmount = 0; // 去背景遮盖
// lp.alpha = 1.0f;//透明效果
window!!.attributes = lp
// 设置外部不可关闭
setCancelable(true)
setCanceledOnTouchOutside(true)
setOnKeyListener { _, i, _ ->
i == KeyEvent.KEYCODE_BACK
}
vp2 = findViewById(R.id.vp2_episode)
tab = findViewById(R.id.tab_episode)
ivClose = findViewById(R.id.close_iv)
ivClose.setOnClickListener { dismiss() }
findViewById<TextView>(R.id.title_tv).text = vedioBean?.title
findViewById<TextView>(R.id.label_tv).text =
if (vedioBean?.completeStatus == 0) "已完结" else "更新中"
initVp()
}
private fun initVp() {
if (vedioBean == null) return
for (i in 0 until vedioBean.vedioTotal) {
if (data[i].type == VEDIO3DOS_FREE) {
var playing = false
if (vedioBean.seeIndex == i) {
playing = true
}
mData.add(EpisodeBean(false, playing, "" + (i + 1)))
} else {
mData.add(EpisodeBean(lock = true, playing = false, title = "" + (i + 1)))
}
}
val subList = CommonUtils.getSubList(30, mData)
adapter = VideoEpisodeAdapter()
adapter?.setNewInstance(subList)
vp2.adapter = adapter
TabLayoutMediator(tab, vp2) { tab, position ->
// 初始化Tab
tab.id = position
tab.customView =
getTabView(
subList[position][0].title + "-"
+ subList[position][subList[position].size - 1].title,
position
)
}.attach()
tab.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
updateTab(tab, true)
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
updateTab(tab, false)
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
if (mRealSeeIndex == 0) {
tab.getTabAt(vedioBean.seeIndex / 30)?.select()
} else {
tab.getTabAt(mRealSeeIndex / 30)?.select()
}
}
private fun getTabView(text: String, position: Int): View {
val view = LayoutInflater.from(context).inflate(R.layout.item_epsiode_tab, null)
val viewText = view.findViewById<TextView>(R.id.item_tv)
viewText.text = text
return view
}
private fun updateTab(tab: TabLayout.Tab?, isSelected: Boolean) {
tab?.customView?.let {
val text = it.findViewById<TextView>(R.id.item_tv)
if (isSelected) {
text.setTextColor(ContextCompat.getColor(context, R.color.red))
} else {
text.setTextColor(ContextCompat.getColor(context, R.color.black))
}
}
}
fun changeLockStatus(unlockIndex: Int) {
for (i in 0 until mData.size) {
mData[i].lock = i > unlockIndex
}
adapter?.notifyDataSetChanged()
}
fun setCurrentIndex(position: Int) {
mRealSeeIndex = position
for (mDatum in mData) {
mDatum.playing = false
}
if (mData.size > position) {
mData[position].playing = true
adapter?.notifyDataSetChanged()
}
}
private var mOnEpisodeClickListener: VideoEpisodeAdapter.OnEpisodeClickListener? = null
fun setOnEpisodeClickListener(onEpisodeClickListener: VideoEpisodeAdapter.OnEpisodeClickListener) {
mOnEpisodeClickListener = onEpisodeClickListener
adapter?.setOnEpisodeClickListener(mOnEpisodeClickListener)
}
}
\ No newline at end of file
package com.duben.miaoquplaylet.video.tx.newrecommend;
import static com.duben.miaoquplaylet.mvp.model.Vedio3dosKt.VEDIO3DOS_FREE;
import static com.duben.miaoquplaylet.mvp.model.VideoMultiItemEntityKt.MULTI_ITEM_1;
import static com.duben.miaoquplaylet.mvp.model.VideoMultiItemEntityKt.MULTI_ITEM_2;
import static com.duben.miaoquplaylet.mvp.model.VideoMultiItemEntityKt.MULTI_ITEM_3;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.duben.miaoquplaylet.R;
import com.duben.miaoquplaylet.mvp.model.VedioBean;
import com.duben.miaoquplaylet.mvp.model.VideoMultiItemEntity4;
import com.duben.miaoquplaylet.video.tx.PlayerManager;
import com.duben.miaoquplaylet.video.tx.TXVideoBaseView;
import com.duben.miaoquplaylet.video.tx.TXVodPlayerWrapper;
import com.duben.miaoquplaylet.video.tx.VideoModel;
import com.duben.miaoquplaylet.video.tx.newrecommend.NewTxVideoAdapter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class NewSuperShortVideoView extends RelativeLayout {
private static final String TAG = "NewSuperShortVideoView";
private static final int MAX_PLAYER_COUNT_ON_PASS = 3;
private RecyclerView mRecyclerView;
private NewTxVideoAdapter mAdapter;
private LinearLayoutManager mLayoutManager;
private PagerSnapHelper mSnapHelper;
private int mLastPositionInIDLE = -1;
private TXVideoBaseView mBaseItemView;
private boolean mIsOnDestroy;
private PlayerManager mPlayerManager;
private int mCurrentPosition = 0;
public NewSuperShortVideoView(Context context) {
this(context, null);
}
public NewSuperShortVideoView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NewSuperShortVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public void loadData(VedioBean vedioBean, List<VideoMultiItemEntity4> list, int currentPosition) {
mLastPositionInIDLE = -1;
this.mCurrentPosition = currentPosition;
mAdapter.setVedioBean(vedioBean);
mAdapter.setNewInstance(list);
onItemClick(mCurrentPosition);
}
public void updateData(int currentPosition) {
this.mCurrentPosition = currentPosition;
VideoMultiItemEntity4 videoMultiItemEntity4 = getData().get(currentPosition);
videoMultiItemEntity4.setItemType(MULTI_ITEM_1);
videoMultiItemEntity4.setType(VEDIO3DOS_FREE);
mAdapter.setData(currentPosition, videoMultiItemEntity4);
onItemClick(mCurrentPosition);
}
public void init(Context context) {
View mRootView = LayoutInflater.from(context).inflate(R.layout.super_short_video_view, null);
addView(mRootView);
mPlayerManager = new PlayerManager(getContext());
mRecyclerView = mRootView.findViewById(R.id.rv_super_short_video);
mSnapHelper = new PagerSnapHelper();
mSnapHelper.attachToRecyclerView(mRecyclerView);
mAdapter = new NewTxVideoAdapter();
mAdapter.setNewInstance(new ArrayList<>());
mAdapter.setOnVideoEndListener(() -> onItemClick(mCurrentPosition + 1, true));
mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false) {
@Override
protected int getExtraLayoutSpace(RecyclerView.State state) {
return 300;
}
};
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setItemViewCacheSize(6);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setDrawingCacheEnabled(true);
mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);
mRecyclerView.setAdapter(mAdapter);
addListener();
}
private void addListener() {
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (!recyclerView.canScrollVertically(1) || !recyclerView.canScrollVertically(-1)) {
onScrollStateChanged(recyclerView, RecyclerView.SCROLL_STATE_IDLE);
}
}
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE://停止滚动
View view = mSnapHelper.findSnapView(mLayoutManager);
int position = recyclerView.getChildAdapterPosition(view);
if (position == mCurrentPosition || position == RecyclerView.NO_POSITION)
return;
Log.i(TAG, "[SCROLL_STATE_IDLE] mLastPositionInIDLE " + mLastPositionInIDLE + " position " + position);
mCurrentPosition = position;
onPageSelectedMethod(position);
if (isLuckPosition(position)) {
mAdapter.notifyItemChanged(position);
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING://拖动
break;
case RecyclerView.SCROLL_STATE_SETTLING://惯性滑动
break;
}
}
});
}
private void onPageSelectedMethod(int position) {
if (mOnPageChangeListener != null) mOnPageChangeListener.onPageChange(position);
if (position >= getData().size() || getData().get(position).getItemType() != MULTI_ITEM_1)
return;
if (position == getData().size()) {
if (mBaseItemView != null) {
mLastPositionInIDLE = -1;
mBaseItemView.stopForPlaying();
}
return;
}
if (mLastPositionInIDLE != position) {
View view = mSnapHelper.findSnapView(mLayoutManager);
if (view == null) {
return;
}
mBaseItemView = view.findViewById(R.id.baseItemView);
Log.i(TAG, "onPageSelected " + position);
List<VideoModel> tempUrlList = initUrlList(position, MAX_PLAYER_COUNT_ON_PASS);
mPlayerManager.updateManager(tempUrlList);
TXVodPlayerWrapper txVodPlayerWrapper = mPlayerManager.getPlayer(getData().get(position).getVideoModel());
if (txVodPlayerWrapper != null && mBaseItemView != null) {
Log.i(TAG, "txVodPlayerWrapper " + txVodPlayerWrapper + "url-- " + getData().get(position).getVideoModel().videoURL);
Log.i(TAG, "txVodPlayerWrapper " + txVodPlayerWrapper);
mBaseItemView.setTXVodPlayer(txVodPlayerWrapper);
}
mLastPositionInIDLE = position;
}
if (mBaseItemView != null && !mIsOnDestroy) {
mBaseItemView.startPlay();
}
}
/**
* 初始化向PlayManager传递的urlList
*
* @param startIndex 开始的索引
* @param maxCount 传递的urlList的数目
* @return
*/
private List<VideoModel> initUrlList(int startIndex, int maxCount) {
List<VideoModel> videoModels = new ArrayList<>();
for (VideoMultiItemEntity4 videoMultiItemEntity : getData()) {
videoModels.add(videoMultiItemEntity.getVideoModel());
}
int i = startIndex - 1;
if (i + maxCount > videoModels.size()) {
i = videoModels.size() - maxCount;
}
if (i < 0) {
i = 0;
}
int addedCount = 0;
List<VideoModel> cacheList = new ArrayList<>();
while (i < videoModels.size() && addedCount < maxCount) {
cacheList.add(videoModels.get(i));
addedCount++;
i++;
}
return cacheList;
}
public void resume() {
if (mBaseItemView != null && !isLuckPosition(mCurrentPosition) && !isAdPosition(mCurrentPosition)) {
mBaseItemView.startPlay();
}
}
public void pause() {
if (mBaseItemView != null) {
mBaseItemView.pausePlayer();
}
}
public void releasePlayer() {
if (mBaseItemView != null) {
mBaseItemView.stopPlayer();
}
mPlayerManager.releasePlayer();
}
public void onItemClick(final int position) {
onItemClick(position, false);
}
public void onItemClick(final int position, boolean isVideoEnd) {
if (getData() == null || position >= getData().size()) return;
if (isVideoEnd) {
changeLayoutPosition(position);
// 执行 onScrollListener
mRecyclerView.smoothScrollToPosition(position);
} else {
mRecyclerView.scrollToPosition(position);
mRecyclerView.post(() -> {
Log.i(TAG, "onItemClick");
mCurrentPosition = position;
onPageSelectedMethod(position);
});
}
}
private void changeLayoutPosition(int position) {
try {
Class<LinearLayoutManager> lm = LinearLayoutManager.class;
Field mPendingScrollPosition = lm.getDeclaredField("mPendingScrollPosition");
mPendingScrollPosition.setAccessible(true);
mPendingScrollPosition.set(mLayoutManager, position);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
public List<VideoMultiItemEntity4> getData() {
return mAdapter.getData();
}
public int getRealSeeIndex() {
if (getData() != null && getData().size() > 0) {
VideoMultiItemEntity4 videoMultiItemEntity = getData().get(mCurrentPosition);
if (videoMultiItemEntity.getItemType() == MULTI_ITEM_1) {
return videoMultiItemEntity.getVideo().getVedioIndex() - 1;
}
}
return mCurrentPosition;
}
public int getCurrentPosition() {
return mCurrentPosition;
}
public void setOnCustomChildClickListener(NewTxVideoAdapter.OnCustomChildClickListener onCustomChildClickListener) {
mAdapter.setOnCustomChildClickListener(onCustomChildClickListener);
}
public void onDestroy() {
mIsOnDestroy = true;
}
public interface OnPageChangeListener {
void onPageChange(int position);
}
private OnPageChangeListener mOnPageChangeListener;
public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) {
this.mOnPageChangeListener = onPageChangeListener;
}
public boolean isAdPosition(int position) {
if (getData() != null && getData().size() > 0 && position < getData().size()) {
return getData().get(position).getItemType() == MULTI_ITEM_3;
}
return false;
}
public boolean isLuckPosition(int position) {
if (getData() != null && getData().size() > 0 && position < getData().size()) {
return getData().get(position).getItemType() == MULTI_ITEM_2;
}
return false;
}
}
package com.duben.miaoquplaylet.video.tx package com.duben.miaoquplaylet.video.tx.newrecommend
import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.content.ContextCompat
import com.google.gson.Gson import com.google.gson.Gson
import com.duben.miaoquplaylet.R import com.duben.miaoquplaylet.R
import com.duben.miaoquplaylet.ad.AdManager
import com.duben.miaoquplaylet.ad.AdStatusListener
import com.duben.miaoquplaylet.ad.NoPreAdManager
import com.duben.miaoquplaylet.ad.express.ExpressManager import com.duben.miaoquplaylet.ad.express.ExpressManager
import com.duben.miaoquplaylet.common.Constant import com.duben.miaoquplaylet.common.Constant
import com.duben.miaoquplaylet.manager.LocalVedioManager import com.duben.miaoquplaylet.manager.LocalVedioManager
...@@ -13,56 +16,51 @@ import com.duben.miaoquplaylet.mvp.model.* ...@@ -13,56 +16,51 @@ import com.duben.miaoquplaylet.mvp.model.*
import com.duben.miaoquplaylet.mvp.model.IndexList.VedioEpisodeBean import com.duben.miaoquplaylet.mvp.model.IndexList.VedioEpisodeBean
import com.duben.miaoquplaylet.mvp.presenters.VideoPresenter import com.duben.miaoquplaylet.mvp.presenters.VideoPresenter
import com.duben.miaoquplaylet.mvp.views.VideoView import com.duben.miaoquplaylet.mvp.views.VideoView
import com.duben.miaoquplaylet.ui.activitys.NineActivity
import com.duben.miaoquplaylet.ui.activitys.VipActivity import com.duben.miaoquplaylet.ui.activitys.VipActivity
import com.duben.miaoquplaylet.ui.activitys.base.BaseActivity import com.duben.miaoquplaylet.ui.activitys.base.BaseActivity
import com.duben.miaoquplaylet.ui.adapter.VideoEpisodeAdapter import com.duben.miaoquplaylet.ui.adapter.VideoEpisodeAdapter
import com.duben.miaoquplaylet.ui.widgets.DialogListener import com.duben.miaoquplaylet.utils.AppPreferencesManager
import com.duben.miaoquplaylet.ui.widgets.VideoEpisodeDialog import com.duben.miaoquplaylet.utils.SpanUtils
import com.duben.miaoquplaylet.video.tx.adapter.TxVideoAdapter import com.duben.miaoquplaylet.video.tx.VideoModel
import com.duben.library.utils.GlideUtils
import com.duben.library.utils.nodoubleclick.AntiShake import com.duben.library.utils.nodoubleclick.AntiShake
import com.duben.miaoquplaylet.ui.widgets.NewVideoEpisodeDialog
import kotlinx.android.synthetic.main.activity_new_tx_video.* import kotlinx.android.synthetic.main.activity_new_tx_video.*
/** /**
* 推荐剧集二级页 * 推荐剧集二级页
*/ */
class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
VideoEpisodeAdapter.OnEpisodeClickListener, TxVideoAdapter.OnCustomChildClickListener { VideoEpisodeAdapter.OnEpisodeClickListener, NewTxVideoAdapter.OnCustomChildClickListener {
private var mVipFlag = UserManager.getInstance().vipFlag private var mVipFlag = UserManager.getInstance().vipFlag
private var videos = ArrayList<VedioEpisodeBean>() private var mAllData = arrayListOf<VedioEpisodeBean>()
private var dialog: VideoEpisodeDialog? = null private var dialog: NewVideoEpisodeDialog? = null
private val videoPresenter by lazy { VideoPresenter() } private val videoPresenter by lazy { VideoPresenter() }
private var mVedioBean: VedioBean? = null private var mVedioBean: VedioBean? = null
private var indexBean: IndexList? = null private var indexBean: IndexList? = null
private var tipList: ArrayList<String>? = null
private var orderTagsList: ArrayList<String>? = null private var orderTagsList: ArrayList<String>? = null
private var isPlayNext = false
private var playIndex = 1 private var playIndex = 1
override fun getContentViewLayoutID() = R.layout.activity_new_tx_video override fun getContentViewLayoutID() = R.layout.activity_new_tx_video
override fun initViewsAndEvents() { override fun initViewsAndEvents() {
videoPresenter.attachView(this) videoPresenter.attachView(this)
mVedioBean?.let { videoPresenter.getIndexList("" + it.vedioId) } mVedioBean?.let { videoPresenter.getIndexList2("" + it.vedioId) }
initView() initView()
} }
override fun getBundleExtras(extras: Bundle?) { override fun getBundleExtras(extras: Bundle?) {
val json = extras?.getString(Constant.VEDIO_BEAN) val json = extras?.getString(Constant.VEDIO_BEAN)
isPlayNext = extras?.getBoolean(Constant.VEDIO_NEXT, false) == true
mVedioBean = Gson().fromJson(json, VedioBean::class.java) mVedioBean = Gson().fromJson(json, VedioBean::class.java)
mVedioBean?.isRecommendVedio = true mVedioBean?.isRecommendVedio = true
orderTagsList = mVedioBean?.orderTags orderTagsList = mVedioBean?.orderTags
if (isPlayNext) {
mVedioBean?.let {
it.recommendIndex = it.recommendIndex + 1
}
}
super.getBundleExtras(extras) super.getBundleExtras(extras)
} }
...@@ -70,25 +68,26 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -70,25 +68,26 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
super_short_video_view.resume() new_super_short_video_view.resume()
videoPresenter.showTurn()
if (mVipFlag != UserManager.getInstance().vipFlag && UserManager.getInstance().vipFlag) { if (mVipFlag != UserManager.getInstance().vipFlag && UserManager.getInstance().vipFlag) {
// 重置状态 // 重置状态
isPlayNext = false playIndex = new_super_short_video_view.currentPosition
playIndex = super_short_video_view.currentPosition mVedioBean?.let { videoPresenter.getIndexList2("" + it.vedioId) }
mVedioBean?.let { videoPresenter.getIndexList("" + it.vedioId) }
} }
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
super_short_video_view.pause() new_super_short_video_view.pause()
} }
override fun onDestroy() { override fun onDestroy() {
super_short_video_view.onDestroy() new_super_short_video_view.onDestroy()
super.onDestroy() super.onDestroy()
super_short_video_view.releasePlayer() new_super_short_video_view.releasePlayer()
ExpressManager.instance.destroy() ExpressManager.instance.destroy()
videoPresenter.detachView() videoPresenter.detachView()
...@@ -105,18 +104,21 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -105,18 +104,21 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
if (mVedioBean?.completeStatus == 0) "已完结" else "更新中" if (mVedioBean?.completeStatus == 0) "已完结" else "更新中"
) )
super_short_video_view.setOnCustomChildClickListener(this) new_super_short_video_view.setOnCustomChildClickListener(this)
super_short_video_view.setOnPageChangeListener { new_super_short_video_view.setOnPageChangeListener {
if (super_short_video_view.isAdPosition(it) || super_short_video_view.isLuckPosition(it)) { if (new_super_short_video_view.isAdPosition(it) || new_super_short_video_view.isLuckPosition(
fm_bottom.visibility = View.GONE it
super_short_video_view.pause() )
) {
// fm_bottom.visibility = View.GONE
new_super_short_video_view.pause()
return@setOnPageChangeListener return@setOnPageChangeListener
} }
fm_bottom.visibility = View.VISIBLE // fm_bottom.visibility = View.VISIBLE
// videoIndex -> seeIndex // videoIndex -> seeIndex
val data = super_short_video_view.data val data = new_super_short_video_view.data
if (data.size > it && data[it].itemType == MULTI_ITEM_1) { if (data.size > it && data[it].itemType == MULTI_ITEM_1) {
mVedioBean!!.seeIndex = data[it].video!!.vedioIndex mVedioBean!!.seeIndex = data[it].video!!.vedioIndex
mVedioBean!!.orderTags = orderTagsList mVedioBean!!.orderTags = orderTagsList
...@@ -127,17 +129,15 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -127,17 +129,15 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
fm_bottom.setOnClickListener(this) fm_bottom.setOnClickListener(this)
close_iv.setOnClickListener(this) close_iv.setOnClickListener(this)
ll_lucky.setOnClickListener(this)
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
if (AntiShake.check(v?.id)) return if (AntiShake.check(v?.id)) return
when (v?.id) { when (v?.id) {
R.id.close_iv -> { R.id.close_iv -> finish()
finish() R.id.fm_bottom -> showEpisodeDialog()
} R.id.ll_lucky -> readyGo(NineActivity::class.java)
R.id.fm_bottom -> {
showEpisodeDialog()
}
else -> {} else -> {}
} }
} }
...@@ -145,37 +145,30 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -145,37 +145,30 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
private fun showEpisodeDialog() { private fun showEpisodeDialog() {
if (dialog != null && dialog!!.isShowing) return if (dialog != null && dialog!!.isShowing) return
dialog = VideoEpisodeDialog(this, mVedioBean, object : DialogListener() { val vedioBean = VedioBean()
override fun onClick(dialog: Dialog?, v: View?) { mVedioBean?.let {
super.onClick(dialog, v) vedioBean.title = it.title
dialog?.dismiss() vedioBean.vedioTotal = it.vedioTotal
} vedioBean.seeIndex = it.seeIndex
}) vedioBean.vedioTotal = it.vedioTotal
dialog?.setCurrentIndex(super_short_video_view.realSeeIndex) }
dialog = NewVideoEpisodeDialog(this, vedioBean, new_super_short_video_view.data)
dialog?.setCurrentIndex(new_super_short_video_view.realSeeIndex)
dialog?.setOnEpisodeClickListener(this) dialog?.setOnEpisodeClickListener(this)
dialog?.show() dialog?.show()
} }
override fun getIndexListSuc(indexList: IndexList) { override fun getIndexListSuc(indexList: IndexList) {
// 处理推荐页跳转自动播放下一集逻辑 // 处理推荐页跳转自动播放下一集逻辑
if (isPlayNext) {
playIndex = mVedioBean!!.recommendIndex - 1
if (playIndex >= mVedioBean!!.unlockIndex - 1) {
playIndex = mVedioBean!!.unlockIndex - 1
}
} else {
playIndex = mVedioBean!!.seeIndex - 1
}
if (playIndex > mVedioBean!!.vedioTotal || playIndex <= 0) playIndex = 0
tipList = indexList.tip
mVedioBean = indexList.vedioMsg mVedioBean = indexList.vedioMsg
playIndex = mVedioBean!!.seeIndex - 1
mVedioBean?.isRecommendVedio = true mVedioBean?.isRecommendVedio = true
indexBean = indexList indexBean = indexList
videos.clear() mAllData.clear()
videos.addAll(indexList.list) mAllData.addAll(indexList.list)
super_short_video_view.loadData(mVedioBean, getAdapterData(), playIndex) new_super_short_video_view.loadData(mVedioBean, getAdapterData(), playIndex)
} }
override fun getIndexListFail() { override fun getIndexListFail() {
...@@ -196,42 +189,90 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -196,42 +189,90 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
} }
override fun unlockSuc(indexList: IndexList) { override fun unlockSuc(indexList: IndexList) {
videos.addAll(indexList.list)
mVedioBean!!.unlockIndex = videos.size
super_short_video_view.loadMoreData(getAdapterData())
} }
override fun unlockFail() { override fun unlockFail() {
} }
override fun showTurnSuc(data: NineShowBean) { override fun showTurnSuc(data: NineShowBean) {
AppPreferencesManager.get()
.put(Constant.LUCKY_FLAG, data.isShow)
if (!data.isShow || UserManager.getInstance().vipFlag) {
ll_lucky.visibility = View.GONE
return
} else {
ll_lucky.visibility = View.VISIBLE
context?.let { GlideUtils.loadRoundImageViewGif(it, R.drawable.ic_nine, iv_lucky_gif) }
}
val complete = data.complete
val need = data.need
if (complete >= need) {
tv_lucky_status.text = SpanUtils()
.append("可领取")
.setForegroundColor(ContextCompat.getColor(this, R.color.apk_uninstalled))
.create()
} else {
tv_lucky_status.text = SpanUtils()
.append(complete.toString())
.setForegroundColor(ContextCompat.getColor(this, R.color.red))
.append("/")
.append(need.toString())
.create()
}
} }
override fun onEpisodeClick(position: Int) { override fun onEpisodeClick(position: Int) {
dialog?.dismiss() dialog?.dismiss()
val data = super_short_video_view.data // val data = new_super_short_video_view.data
if (position >= mVedioBean!!.unlockIndex) { // if (position >= mVedioBean!!.unlockIndex) {
super_short_video_view.onItemClick(data.size - 1) // new_super_short_video_view.onItemClick(data.size - 1)
return // return
} // }
val readPosition = getRealPosition(position + 1) // val readPosition = getRealPosition(position + 1)
val readPosition = position
super_short_video_view.onItemClick(readPosition) new_super_short_video_view.onItemClick(readPosition)
} }
private fun getAdapterData(): MutableList<VideoMultiItemEntity> { private fun getAdapterData(): MutableList<VideoMultiItemEntity4> {
val data = mutableListOf<VideoMultiItemEntity>() val data = mutableListOf<VideoMultiItemEntity4>()
if (videos.size > 0) { for (i in 0 until mAllData.size) {
for (video in videos) { val item = mAllData[i]
val item = VideoMultiItemEntity(MULTI_ITEM_1, video, VideoModel(video.vedioUrl)) when (mAllData[i].dos) {
data.add(item) VEDIO3DOS_FREE -> {
} data.add(
if (mVedioBean!!.unlockIndex < mVedioBean!!.vedioTotal) { i,
val item = VideoMultiItemEntity4(
VideoMultiItemEntity(MULTI_ITEM_2, videos[0], VideoModel(videos[0].vedioUrl)) MULTI_ITEM_1,
data.add(item) item,
VideoModel(item.vedioUrl),
VEDIO3DOS_FREE
)
)
}
VEDIO3DOS_AD -> {
data.add(
i, VideoMultiItemEntity4(
MULTI_ITEM_2,
item,
VideoModel(item.vedioUrl),
VEDIO3DOS_AD
)
)
}
VEDIO3DOS_PAY -> {
data.add(
i, VideoMultiItemEntity4(
MULTI_ITEM_2,
item,
VideoModel(item.vedioUrl),
VEDIO3DOS_PAY
)
)
}
} }
} }
return data return data
...@@ -247,7 +288,38 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -247,7 +288,38 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
finish() finish()
} }
R.id.unlock -> { R.id.unlock -> {
// 无看广告解锁 // 看广告解锁
val carrierType = Constant.CARRIERTYPE_TX_VEDIO
AdManager.instance.showAd(this, carrierType,
object : AdStatusListener {
var canFail = false
override fun adSuccess() {
canFail = true
}
override fun adFail() {
if (canFail) return
NoPreAdManager.loadVideoAd(
this@NewTxVideoActivity,
carrierType, object : AdStatusListener {
override fun adFail() {
showToast("广告太火爆了,请稍候再试")
}
override fun adSuccess() {
}
override fun adClose(vo: HashMap<String, Any>?) {
updateEpisodeData(position, vo)
}
})
}
override fun adClose(vo: HashMap<String, Any>?) {
updateEpisodeData(position, vo)
}
})
} }
R.id.vip -> { R.id.vip -> {
// 开通VIP // 开通VIP
...@@ -262,10 +334,22 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -262,10 +334,22 @@ class NewTxVideoActivity : BaseActivity(), View.OnClickListener, VideoView,
} }
} }
private fun updateEpisodeData(position: Int, vo: HashMap<String, Any>?) {
vo?.let {
// 解锁剧集
vo["vedioId"] = mVedioBean!!.vedioId
vo["num"] = (position + 1)
videoPresenter.unlock(vo)
}
if (position >= mAllData.size) return
new_super_short_video_view.updateData(position)
}
// 用于点击匹配当前剧集对应的具体下标 // 用于点击匹配当前剧集对应的具体下标
private fun getRealPosition(position: Int): Int { private fun getRealPosition(position: Int): Int {
var readPosition = position var readPosition = position
val data = super_short_video_view.data val data = new_super_short_video_view.data
if (data != null && data.size > 0) { if (data != null && data.size > 0) {
for (i in 0 until data.size) { for (i in 0 until data.size) {
if (data[i].itemType == MULTI_ITEM_1) { if (data[i].itemType == MULTI_ITEM_1) {
......
package com.duben.miaoquplaylet.video.tx.newrecommend
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieComposition
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.LottieDrawable
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.duben.miaoquplaylet.R
import com.duben.miaoquplaylet.ad.express.ExpressAdCallback
import com.duben.miaoquplaylet.ad.express.ExpressManager
import com.duben.miaoquplaylet.manager.UserManager
import com.duben.miaoquplaylet.mvp.model.*
import com.duben.miaoquplaylet.utils.UIUtils
import com.duben.miaoquplaylet.video.tx.TXVideoBaseView
class NewTxVideoAdapter : BaseMultiItemQuickAdapter<VideoMultiItemEntity4, BaseViewHolder>() {
private var vedioBean: VedioBean? = null
init {
addItemType(MULTI_ITEM_1, R.layout.player_item_short_video_play)
addItemType(MULTI_ITEM_2, R.layout.item_block_view)
}
override fun convert(holder: BaseViewHolder, item: VideoMultiItemEntity4) {
when (holder.itemViewType) {
MULTI_ITEM_1 -> {
initVideoHolder(holder, item.video)
}
MULTI_ITEM_2 -> {
initLockHolder(holder, item.type)
}
}
}
private fun initLockHolder(holder: BaseViewHolder, type: String?) {
Glide.with(context).load(vedioBean?.coverImage)
.into(holder.getView(R.id.iv_bg))
val vipBtn = holder.getView<View>(R.id.vip)
if (UserManager.getInstance().newFlag) {
// 匹配
vipBtn.visibility = View.VISIBLE
vipBtn.setOnClickListener {
mOnCustomChildClickListener?.onCustomChildClick(it, holder.adapterPosition)
}
} else {
// 未匹配
vipBtn.visibility = View.GONE
}
val adBtn = holder.getView<View>(R.id.unlock)
vedioBean?.let {
when (type) {
VEDIO3DOS_AD -> { // 观看激励视频解锁
vipBtn.visibility = View.GONE
adBtn.visibility = View.VISIBLE
holder.getView<TextView>(R.id.tv_title).text = String.format(
"解锁%s·第%d集",
it.title,
holder.adapterPosition + 1
)
holder.getView<TextView>(R.id.tv_info).text = String.format(
"看激励视频解锁1集剧情\n请按照顺序解锁"
)
}
VEDIO3DOS_PAY -> { // 开通会员解锁
adBtn.visibility = View.GONE
vipBtn.visibility = View.VISIBLE
holder.getView<TextView>(R.id.tv_info).visibility = View.GONE
vipBtn.setBackgroundResource(R.mipmap.bg_detail_bottom_vip)
holder.getView<TextView>(R.id.tv_title).text =
String.format("解锁%s·全集", it.title)
}
else -> {
adBtn.visibility = View.VISIBLE
holder.getView<TextView>(R.id.tv_title).text = String.format(
"解锁%s·第%d-%d集",
it.title,
it.unlockIndex + 1,
it.unlockIndex + it.adGiveVedioNum
)
holder.getView<TextView>(R.id.tv_info).text = String.format(
"看激励视频解锁%d集剧情\n请按照顺序解锁",
it.adGiveVedioNum
)
}
}
holder.getView<TextView>(R.id.unlock).text = String.format("查看激励视频")
holder.getView<View>(R.id.unlock).setOnClickListener { it2 ->
mOnCustomChildClickListener?.onCustomChildClick(it2, holder.adapterPosition)
}
}
ExpressManager.instance.getAdView(
object : ExpressAdCallback {
override fun loadSuccess(adView: FrameLayout?) {
adView?.let {
UIUtils.removeFromParent(it)
val fmAd = holder.getView<FrameLayout>(R.id.fl_ad)
fmAd.removeAllViews()
fmAd.addView(it)
}
ExpressManager.instance.preLoadAd()
}
override fun renderSuccess(adView: FrameLayout?): Boolean {
adView?.let {
UIUtils.removeFromParent(it)
val fmAd = holder.getView<FrameLayout>(R.id.fl_ad)
fmAd.removeAllViews()
fmAd.addView(it)
}
ExpressManager.instance.preLoadAd()
return false
}
override fun loadFail() {
}
})
}
private fun initVideoHolder(holder: BaseViewHolder, item: IndexList.VedioEpisodeBean?) {
//标题
holder.setText(R.id.title_tv, vedioBean?.title)
//集数
holder.setText(R.id.info_tv, "第" + item?.vedioIndex + "集")
//缩略图
Glide.with(context).load(vedioBean?.coverImage)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop()
.into(holder.getView<TXVideoBaseView>(R.id.baseItemView).findViewById(R.id.iv_cover))
vedioBean?.let {
if (it.isRecommendVedio) {
holder.getView<LinearLayout>(R.id.ll_collect).visibility = View.GONE
} else {
holder.getView<LinearLayout>(R.id.ll_collect).visibility = View.VISIBLE
//收藏数量
holder.setText(R.id.zan_num_tv, "" + it.hot)
if (vedioBean?.collect == 0) {
// 未收藏
setCollectImage(holder.getView(R.id.zan_iv))
} else {
// 已收藏
setCancelCollectImage(holder.getView(R.id.zan_iv))
}
holder.getView<LinearLayout>(R.id.ll_collect).setOnClickListener { it2 ->
mOnCustomChildClickListener?.onCustomChildClick(it2, holder.adapterPosition)
if (it.collect == 0) {
playCollectAnim(holder.getView(R.id.zan_iv))
} else {
playCancelCollectAnim(holder.getView(R.id.zan_iv))
}
}
}
}
holder.getView<TXVideoBaseView>(R.id.baseItemView)
.setOnVideoEndListener(mOnVideoEndListener)
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
super.onViewDetachedFromWindow(holder)
if (holder.itemViewType == MULTI_ITEM_1) {
vedioBean?.let {
if (it.seeIndex == data[holder.layoutPosition].video!!.vedioIndex) {
holder.getView<TXVideoBaseView>(R.id.baseItemView).pausePlayer()
holder.getView<TXVideoBaseView>(R.id.baseItemView).stopForPlaying()
}
}
}
}
override fun onViewRecycled(holder: BaseViewHolder) {
super.onViewRecycled(holder)
if (holder.itemViewType == MULTI_ITEM_1) {
Glide.with(context).clear(holder.getView<View>(R.id.iv_cover))
}
}
private fun setCollectImage(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
}
view.setImageDrawable(lottieDrawable)
}
private fun setCancelCollectImage(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_cancel_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
}
view.setImageDrawable(lottieDrawable)
}
private fun playCollectAnim(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
lottieDrawable.loop(false)
lottieDrawable.playAnimation()
}
view.setImageDrawable(lottieDrawable)
}
private fun playCancelCollectAnim(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_cancel_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
lottieDrawable.loop(false)
lottieDrawable.playAnimation()
}
view.setImageDrawable(lottieDrawable)
}
private var mOnVideoEndListener: TXVideoBaseView.OnVideoEndListener? = null
fun setOnVideoEndListener(onVideoEndListener: TXVideoBaseView.OnVideoEndListener) {
this.mOnVideoEndListener = onVideoEndListener
}
private var mOnCustomChildClickListener: OnCustomChildClickListener? = null
fun setOnCustomChildClickListener(onCustomChildClickListener: OnCustomChildClickListener) {
this.mOnCustomChildClickListener = onCustomChildClickListener
}
interface OnCustomChildClickListener {
fun onCustomChildClick(view: View, position: Int)
}
fun setVedioBean(vedioBean: VedioBean) {
this.vedioBean = vedioBean
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black" android:background="@color/black"
android:orientation="vertical"> android:orientation="vertical">
<com.duben.miaoquplaylet.video.tx.SuperShortVideoView <com.duben.miaoquplaylet.video.tx.newrecommend.NewSuperShortVideoView
android:id="@+id/super_short_video_view" android:id="@+id/new_super_short_video_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
...@@ -60,4 +59,33 @@ ...@@ -60,4 +59,33 @@
</FrameLayout> </FrameLayout>
<LinearLayout
android:id="@+id/ll_lucky"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginEnd="1dp"
android:layout_marginBottom="220dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:id="@+id/iv_lucky_gif"
android:layout_width="80dp"
android:layout_height="70dp" />
<TextView
android:id="@+id/tv_lucky_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:background="@drawable/shape_bg_black2"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="0/5"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment