直播商城源码,商品展示分为视频和图片展示两种方式
直播商城源码,商品展示分为视频和图片展示两种方式实现的相关代码
1 | implementation 'com.github.bumptech.glide:glide:4.11.0' <br>implementation 'androidx.recyclerview:recyclerview:1.0.0' <br> //轮播视频及播放器<br>implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'<br>implementation 'cn.jzvd:jiaozivideoplayer:7.4.1' |
清单文件中加入网络权限
1 | <uses-permission android:name= "android.permission.INTERNET" /> |
主要代码
1 | <br>package com.demo.cn;<br>import android.os.Bundle;<br>import android.view.View;<br>import android.widget.RelativeLayout;<br>import android.widget.TextView;<br>import androidx.annotation.NonNull;<br>import androidx.appcompat.app.AppCompatActivity;<br>import androidx.recyclerview.widget.LinearLayoutManager;<br>import androidx.recyclerview.widget.PagerSnapHelper;<br>import androidx.recyclerview.widget.RecyclerView;<br>import com.chad.library.adapter.base.BaseViewHolder;<br>import java.util.ArrayList;<br>import java.util.List;<br>import butterknife.BindView;<br>import butterknife.ButterKnife;<br>import cn.jzvd.Jzvd;<br>import cn.jzvd.JzvdStd;<br> public class MainActivity extends AppCompatActivity {<br> @BindView(R.id.shop_banner)<br> RecyclerView shopBanner;<br> @BindView(R.id.banner_num)<br> TextView bannerNum;<br> private LinearLayoutManager mLayoutManager;<br> private ShopBannerAdapter mShopBannerAdapter;<br> private PagerSnapHelper mSnapHelper;<br> protected void onCreate(Bundle savedInstanceState) {<br> super.onCreate(savedInstanceState);<br> setContentView(R.layout.activity_main);<br> ButterKnife.bind(this);<br> initBanner();<br> }<br> private void initBanner() {<br> List<VideoMultyItem> mList = new ArrayList<>();<br> //添加一个视频VideoMultyItem中三个参数,第一个参数是视频的地址,第二个参数1 是视频 2 是商品,第三个参数为图片地址(视频类型时用作视频封面)<br> mList.add(new VideoMultyItem("https://f.video.weibocdn.com/001v6186gx07Ofj1jCJx01041200b8xc0E010.mp4?label=mp4_1080p&template=1920x1080.25.0&trans_finger=0bde055d9aa01b9f6bc04ccac8f0b471&media_id=4659228904980611&tp=8x8A3El:YTkl0eM8&us=0&ori=1&bf=4&ot=h&ps=3lckmu&uid=3ZoTIp&ab=3915-g1,5178-g0,966-g1,1493-g0,1192-g0,1191-g0,1258-g0&Expires=1627902317&ssig=RsS7BVBWq1&KID=unistore,video", 1, "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimages.669pic.com%2Felement_pic%2F55%2F44%2F38%2F7%2F07097c64a940a7c1b669345f1c6360ca.jpg&refer=http%3A%2F%2Fimages.669pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1630490770&t=c8a62639eafd4fe4f26a545f28ab853d"));<br> for (int i = 0; i < 5; i++) {<br> mList.add(new VideoMultyItem(null, 2, "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimages.669pic.com%2Felement_pic%2F55%2F44%2F38%2F7%2F07097c64a940a7c1b669345f1c6360ca.jpg&refer=http%3A%2F%2Fimages.669pic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1630490770&t=c8a62639eafd4fe4f26a545f28ab853d"));<br> }<br> mLayoutManager = new LinearLayoutManager(this);<br> mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);<br> shopBanner.setLayoutManager(mLayoutManager);<br> mShopBannerAdapter = new ShopBannerAdapter(mList);<br> mSnapHelper = new PagerSnapHelper();<br> shopBanner.setOnFlingListener(null);<br> mSnapHelper.attachToRecyclerView(shopBanner);<br> shopBanner.setAdapter(mShopBannerAdapter);<br> bannerNum.setText("1/" + mList.size());<br> shopBanner.addOnScrollListener(new RecyclerView.OnScrollListener() {<br> @Override<br> public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {<br> super.onScrollStateChanged(recyclerView, newState);<br> }<br> @Override<br> public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {<br> super.onScrolled(recyclerView, dx, dy);<br> LinearLayoutManager layoutManager = (LinearLayoutManager) shopBanner.getLayoutManager();<br> int position = layoutManager.findFirstVisibleItemPosition();<br> bannerNum.setText((position + 1) + "/" + mList.size());<br> }<br> });<br> shopBanner.addOnScrollListener(new RecyclerView.OnScrollListener() {<br> @Override<br> public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {<br> switch (newState) {<br> case RecyclerView.SCROLL_STATE_IDLE:<br> //停止滚动<br> autoPlay(recyclerView);<br> break;<br> case RecyclerView.SCROLL_STATE_DRAGGING:<br> //拖动<br> break;<br> case RecyclerView.SCROLL_STATE_SETTLING:<br> //惯性滑动<br> Jzvd.releaseAllVideos();<br> break;<br> default:<br> break;<br> }<br> }<br> @Override<br> public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {<br> super.onScrolled(recyclerView, dx, dy);<br> }<br> });<br> }<br> private void autoPlay(RecyclerView recyclerView) {<br> View view = mSnapHelper.findSnapView(mLayoutManager);<br> if (view != null) {<br> if (view instanceof RelativeLayout) {<br> Jzvd.releaseAllVideos();<br> } else {<br> BaseViewHolder viewHolder = (BaseViewHolder) recyclerView.getChildViewHolder(view);<br> if (viewHolder != null) {<br> JzvdStd myVideoPlayer = viewHolder.getView(R.id.player);<br> myVideoPlayer.startVideo();<br> }<br> }<br> }<br> }<br> @Override<br> protected void onPause() {<br> super.onPause();<br> JzvdStd.releaseAllVideos();<br> }<br>}<br>public class ShopBannerAdapter extends BaseMultiItemQuickAdapter<VideoMultyItem, BaseViewHolder> {<br> /**<br> * Same as QuickAdapter#QuickAdapter(Context,int) but with<br> * some initialization data.<br> *<br> * @param data A new list is created out of this one to avoid mutable list<br> */<br> public ShopBannerAdapter(List<VideoMultyItem> data) {<br> super(data);<br> addItemType(1, R.layout.banner_video);<br> addItemType(2, R.layout.banner_image);<br> }<br> @Override<br> protected void convert(BaseViewHolder helper, VideoMultyItem item) {<br> switch (item.getItemType()) {<br> case 1:<br> //视频<br> JzvdStd jzvdStd = helper.getView(R.id.player);<br> //去掉<br> jzvdStd.setUp(item.getUrl() + "", "", JzvdStd.SCREEN_NORMAL);<br> Glide.with(mContext).load(item.getCoverUrl()).diskCacheStrategy(DiskCacheStrategy.ALL).centerCrop().into(jzvdStd.posterImageView);//设置封面<br> jzvdStd.setVideoImageDisplayType(jzvdStd.VIDEO_IMAGE_DISPLAY_TYPE_FILL_PARENT);//去掉黑框<br> jzvdStd.startVideo();//自动播放<br> break;<br> case 2:<br> ImageView imageView = helper.getView(R.id.image);<br> Glide.with(mContext)<br> .load(item.getCoverUrl())<br> .centerCrop()<br> .skipMemoryCache(true)<br> .diskCacheStrategy(DiskCacheStrategy.RESOURCE)<br> .into(imageView);<br> imageView.setOnClickListener(new View.OnClickListener() {<br> @Override<br> public void onClick(View view) {<br> }<br> });<br> break;<br> default:<br> break;<br> }<br> }<br>} |
banner_video.xml
1 | <br><?xml version= "1.0" encoding= "utf-8" ?><br><FrameLayout xmlns:android= "http://schemas.android.com/apk/res/android" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" ><br> <RelativeLayout<br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" ><br> <cn.jzvd.JzvdStd<br> android:id= "@+id/player" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" <br> android:scaleType= "fitXY" /><br> </RelativeLayout><br></FrameLayout> |
banner_image.xml
1 | <br><?xml version= "1.0" encoding= "utf-8" ?><br><RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" <br> android:orientation= "vertical" ><br> <ImageView<br> android:id= "@+id/image" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" <br> android:scaleType= "fitXY" /><br></RelativeLayout><br>VideoMultyItem 文件<br> /**<br> * date:2021/8/2<br> * author:wsm(admin)<br> * funcation:<br> */ <br> public class VideoMultyItem implements MultiItemEntity {<br> private String url;<br> //1 是视频 2 是商品<br> private int flag;<br> private String coverUrl;<br> public String getUrl() {<br> return url;<br> }<br> public void setUrl(String url) {<br> this.url = url;<br> }<br> public int getFlag() {<br> return flag;<br> }<br> public void setFlag(int flag) {<br> this.flag = flag;<br> }<br> public String getCoverUrl() {<br> return coverUrl;<br> }<br> public void setCoverUrl(String coverUrl) {<br> this.coverUrl = coverUrl;<br> }<br> public VideoMultyItem(String url, int flag, String coverUrl) {<br> this.url = url;<br> this.flag = flag;<br> this.coverUrl = coverUrl;<br> }<br> @Override<br> public int getItemType() {<br> return flag;<br> }<br>} |
以上就是 直播商城源码,商品展示分为视频和图片展示两种方式实现的相关代码,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现