Android 购物选择颜色、尺码实现(二)
Android 购物选择颜色(尺码)实现(一)这篇文章只是简单的介绍以及实现了点击效果还没有实现颜色、尺码、库存等联动所以在闲暇时间就写了这篇文章实现这样的效果。首先还是上几张淘宝的效果图在选择尺码或者颜色分类的时候颜色分类、尺码、库存以及图片都会有相应变化。接下来我们 就看看如何实现这样的效果。先看看我实现的效果图一.分析要实现这样的效果商品属性就得有尺码、颜色、库存等我们简称为sku当你选择某一个尺码的时候先查找该颜色对应的尺码列表是什么接着用这个尺码列表和总的尺码列表进行对比要是有尺码不在总尺码列表中那么就标记改尺码是不可选的颜色也同理。只要你明白这道理那么就很好理解了。下来我们看看具体的代码实现。二.实现1.新建项目2.打开布局文件activity_main.xml该布局文件是主界面布局代码就不罗列了具体代码见代码下载。3.在layou文件夹中新建布局gridview_item.xml文件该布局文件主要是设置GridView的item布局主要是一个TextView显示商品属性PS: 这一块要是不了解的话可以先看看这篇文章Android 购物选择颜色(尺码)实现(一)4.新建MyGridView类继承GridView解决滑动冲突/** * 滑动冲突 */ public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() MotionEvent.ACTION_MOVE) { return true; } return super.dispatchTouchEvent(ev); } }5.新建SkuAdapter 继承BaseAdapter其中用到的接口回调public class SkuAdapter extends BaseAdapter { private ListBean list;//数据源 private LayoutInflater mInflater;// 得到一个LayoutInfalter对象用来导入布局 public onItemClickListener itemClickListener;// 接口回调 public void setItemClickListener(onItemClickListener itemClickListener) { this.itemClickListener itemClickListener; } public SkuAdapter(ListBean list, Context context) { super(); this.mInflater LayoutInflater.from(context); this.list list; } Override public int getCount() { // TODO Auto-generated method stub return list.size(); } Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; if (convertView null) { holder new ViewHolder(); convertView mInflater.inflate(R.layout.gridview_item, null); /** 得到各个控件的对象 */ holder.title (TextView) convertView.findViewById(R.id.ItemText); holder.layout (LinearLayout) convertView.findViewById(R.id.layout); convertView.setTag(holder);// 绑定ViewHolder对象 } else { holder (ViewHolder) convertView.getTag();// 取出ViewHolder对象 } final Bean bean list.get(position); switch (bean.getStates()) { // 选中 case 0: holder.layout.setBackgroundResource(R.xml.shape2); holder.title.setTextColor(Color.WHITE); break; // 未选中 case 1: holder.layout.setBackgroundResource(R.xml.shape1); holder.title.setTextColor(Color.BLACK); break; // 不可选 case 2: holder.layout.setBackgroundResource(R.xml.shape1); holder.title.setTextColor(Color.parseColor(#999999)); break; default: break; } /** 设置TextView显示的内容即我们存放在动态数组中的数据 */ holder.title.setText(bean.getName()); holder.layout.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { // TODO Auto-generated method stub if (itemClickListener ! null) { if(!bean.getStates().equals(2)){ itemClickListener.onItemClick(bean, position); } } } }); return convertView; } public final class ViewHolder { public TextView title; public LinearLayout layout; } public interface onItemClickListener { public void onItemClick(Bean bean, int position); } }6.新建Constants 类当然你也可以自己在Activity中定义常量public class Constants { //颜色数组 public static final String[] colorArr{铁蓝灰,孔雀蓝,深蓝,中国红,艳紫}; //尺码数组 public static final String[] sizeArr{S,M,L,XL,XXL,XXXL}; }7.新建DataUtil用来数据处理代码太长就不讲解了具体的代码请下载代码后查看8.最主要的类MainActivity该类包含了所有的实现代码如下public class MainActivity extends Activity { ListSkuItme mList;// sku数据 ListBean mColorList;// 颜色列表 ListBean mSizeList;// 尺码列表 GridView gvColor;// 颜色 GridView gvSize;// 尺码 SkuAdapter skuColorAdapter;// 颜色适配器 SkuAdapter skuSizeAdapter;// 尺码适配器 String color;// String size;// TextView tvSkuName;// 显示sku TextView tvSkuStock;// 显示库存 int stock 0;// 库存 Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gvSize (GridView) findViewById(R.id.gv_size); gvColor (GridView) findViewById(R.id.gv_color); tvSkuName (TextView) findViewById(R.id.tv_sku); tvSkuStock (TextView) findViewById(R.id.tv_sku_stock); addData(); stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } skuColorAdapter new SkuAdapter(mColorList, this); gvColor.setAdapter(skuColorAdapter); skuColorAdapter.setItemClickListener(new onItemClickListener() { Override public void onItemClick(Bean bean, int position) { // TODO Auto-generated method stub color bean.getName(); switch (bean.getStates()) { case 0: // 清空尺码 mSizeListDataUtil.clearAdapterStates(mSizeList); skuSizeAdapter.notifyDataSetChanged(); // 清空颜色 mColorListDataUtil.clearAdapterStates(mColorList); skuColorAdapter.notifyDataSetChanged(); color ; // 判断使用选中了尺码 if (!TextUtils.isEmpty(size)) { // 选中尺码计算库存 stock DataUtil.getSizeAllStock(mList,size); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); // 获取该尺码对应的颜色列表 ListString list DataUtil.getColorListBySize(mList,size); if (list ! null list.size() 0) { // 更新颜色列表 mColorList DataUtil.setSizeOrColorListStates(mColorList,list, color); skuColorAdapter.notifyDataSetChanged(); } mSizeListDataUtil.setAdapterStates(mSizeList,size); skuSizeAdapter.notifyDataSetChanged(); } else { // 所有库存 stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码,颜色分类); } break; case 1: // 选中颜色 mColorListDataUtil.updateAdapterStates(mColorList,0, position); skuColorAdapter.notifyDataSetChanged(); // 计算改颜色对应的尺码列表 ListString list DataUtil.getSizeListByColor(mList,color); if (!TextUtils.isEmpty(size)) { // 计算改颜色与尺码对应的库存 stock DataUtil.getStockByColorAndSize(mList,color, size); tvSkuName.setText(规格: color size); if (stock 0) { tvSkuStock.setText(库存 stock ); } if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, size); skuSizeAdapter.notifyDataSetChanged(); } } else { // 根据颜色计算库存 stock DataUtil.getColorAllStock(mList,color); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, ); skuSizeAdapter.notifyDataSetChanged(); } } break; default: break; } } }); skuSizeAdapter new SkuAdapter(mSizeList, this); gvSize.setAdapter(skuSizeAdapter); skuSizeAdapter.setItemClickListener(new onItemClickListener() { Override public void onItemClick(Bean bean, int position) { // TODO Auto-generated method stub size bean.getName(); switch (bean.getStates()) { case 0: // 清空尺码 mSizeListDataUtil.clearAdapterStates(mSizeList); skuSizeAdapter.notifyDataSetChanged(); // 清空颜色 mColorListDataUtil.clearAdapterStates(mColorList); skuColorAdapter.notifyDataSetChanged(); size ; if (!TextUtils.isEmpty(color)) { // 计算改颜色对应的所有库存 stock DataUtil.getColorAllStock(mList,color); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码); // 计算改颜色对应的尺码列表 ListString list DataUtil.getSizeListByColor(mList,color); if (list ! null list.size() 0) { // 更新尺码列表 mSizeList DataUtil.setSizeOrColorListStates(mSizeList,list, size); skuSizeAdapter.notifyDataSetChanged(); } mColorListDataUtil.setAdapterStates(mColorList,color); skuColorAdapter.notifyDataSetChanged(); } else { // 获取所有库存 stock DataUtil.getAllStock(mList); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择尺码,颜色分类); } break; case 1: // 选中尺码 mSizeListDataUtil.updateAdapterStates(mSizeList, 0, position); skuSizeAdapter.notifyDataSetChanged(); // 获取该尺码对应的颜色列表 ListString list DataUtil.getColorListBySize(mList,size); if (!TextUtils.isEmpty(color)) { // 计算改颜色与尺码对应的库存 stock DataUtil.getStockByColorAndSize(mList,color, size); tvSkuName.setText(规格: color size); if (stock 0) { tvSkuStock.setText(库存 stock ); } if (list ! null list.size() 0) { // 更新颜色列表 mColorList DataUtil.setSizeOrColorListStates(mColorList,list, color); skuColorAdapter.notifyDataSetChanged(); } } else { // 计算改尺码的所有库存 stock DataUtil.getSizeAllStock(mList,size); if (stock 0) { tvSkuStock.setText(库存 stock ); } tvSkuName.setText(请选择颜色分类); if (list ! null list.size() 0) { mColorList DataUtil.setSizeOrColorListStates(mColorList,list, ); skuColorAdapter.notifyDataSetChanged(); } } break; default: break; } } }); } /** * 模拟数据 */ private void addData() { mList new ArrayListSkuItme(); mColorList new ArrayListBean(); mSizeList new ArrayListBean(); String[] colorArr Constants.colorArr; String[] sizeArr Constants.sizeArr; int color colorArr.length; int size sizeArr.length; for (int i 0; i color; i) { Bean bean new Bean(); bean.setName(colorArr[i]); bean.setStates(1); mColorList.add(bean); } for (int i 0; i size; i) { Bean bean new Bean(); bean.setName(sizeArr[i]); bean.setStates(1); mSizeList.add(bean); } String color0 colorArr[0]; String size0 sizeArr[0]; String color1 colorArr[1]; String size1 sizeArr[1]; String color2 colorArr[2]; String size2 sizeArr[2]; String color3 colorArr[3]; String size3 sizeArr[3]; String color4 colorArr[4]; String size4 sizeArr[4]; String size5 sizeArr[5]; SkuItme item0 new SkuItme(); item0.setId(1); item0.setSkuColor(color0); item0.setSkuSize(size0); item0.setSkuStock(10); mList.add(item0); SkuItme item1 new SkuItme(); item1.setId(2); item1.setSkuColor(color0); item1.setSkuSize(size1); item1.setSkuStock(1); mList.add(item1); SkuItme item2 new SkuItme(); item2.setId(3); item2.setSkuColor(color1); item2.setSkuSize(size0); item2.setSkuStock(12); mList.add(item2); SkuItme item3 new SkuItme(); item3.setId(4); item3.setSkuColor(color1); item3.setSkuSize(size2); item3.setSkuStock(123); mList.add(item3); SkuItme item4 new SkuItme(); item4.setId(5); item4.setSkuColor(color1); item4.setSkuSize(size1); item4.setSkuStock(53); mList.add(item4); SkuItme item5 new SkuItme(); item5.setId(6); item5.setSkuColor(color2); item5.setSkuSize(size1); item5.setSkuStock(13); mList.add(item5); SkuItme item6 new SkuItme(); item6.setId(7); item6.setSkuColor(color0); item6.setSkuSize(size3); item6.setSkuStock(18); mList.add(item6); SkuItme item7 new SkuItme(); item7.setId(8); item7.setSkuColor(color2); item7.setSkuSize(size3); item7.setSkuStock(14); mList.add(item7); SkuItme item8 new SkuItme(); item8.setId(9); item8.setSkuColor(color1); item8.setSkuSize(size3); item8.setSkuStock(22); mList.add(item8); SkuItme item9 new SkuItme(); item9.setId(10); item9.setSkuColor(color0); item9.setSkuSize(size4); item9.setSkuStock(29); mList.add(item9); SkuItme item10 new SkuItme(); item10.setId(11); item10.setSkuColor(color2); item10.setSkuSize(size5); item10.setSkuStock(64); mList.add(item10); SkuItme item11 new SkuItme(); item11.setId(12); item11.setSkuColor(color3); item11.setSkuSize(size2); item11.setSkuStock(70); mList.add(item11); SkuItme item12 new SkuItme(); item12.setId(13); item12.setSkuColor(color4); item12.setSkuSize(size0); item12.setSkuStock(80); mList.add(item12); SkuItme item13 new SkuItme(); item13.setId(14); item13.setSkuColor(color3); item13.setSkuSize(size4); item13.setSkuStock(35); mList.add(item13); SkuItme item14 new SkuItme(); item14.setId(15); item14.setSkuColor(color4); item14.setSkuSize(size1); item14.setSkuStock(62); mList.add(item14); SkuItme item15 new SkuItme(); item15.setId(16); item15.setSkuColor(color3); item15.setSkuSize(size5); item15.setSkuStock(41); mList.add(item15); SkuItme item16 new SkuItme(); item16.setId(17); item16.setSkuColor(color1); item16.setSkuSize(size5); item16.setSkuStock(39); mList.add(item16); SkuItme item17 new SkuItme(); item17.setId(18); item17.setSkuColor(color4); item17.setSkuSize(size5); item17.setSkuStock(37); mList.add(item17); SkuItme item18 new SkuItme(); item18.setId(19); item18.setSkuColor(color4); item18.setSkuSize(size2); item18.setSkuStock(44); mList.add(item18); SkuItme item19 new SkuItme(); item19.setId(20); item19.setSkuColor(color4); item19.setSkuSize(size3); item19.setSkuStock(61); mList.add(item19); } }这样我们就基本可以实现类似淘宝选择颜色尺码的效果了。效果看着还不错O(∩_∩)O~三.我的项目分析说明1. 首先来张项目结构图(1).Bean类是适配器的数据实体它的属性有private String name;//名称 private String states;//状态 3种 1 选中 2 未选中 3不可选name即具体的尺码或者颜色states是用来标识目前状态是什么。(2).Constants 常量类保存了数据源//颜色数组 public static final String[] colorArr{铁蓝灰,孔雀蓝,深蓝,中国红,艳紫}; //尺码数组 public static final String[] sizeArr{S,M,L,XL,XXL,XXXL};(3).SkuItme sku的数据实体类private String id;//id private String skuSize;//尺码 private String skuColor;//颜色 private int skuStock;//库存 private String skuIamgeUrl;//图片路径(4).MyGridView 解决GridView和ScrollView滑动冲突(5).SkuAdapter 适配器显示尺码或者颜色分类(6).DataUtil 数据处理类相信大家看完这篇文章就或许有思路实现类似淘宝的选择颜色、尺码效果了本人水平有限有错误的地方欢迎大家指出PS代码下载

相关新闻

java web接口开发(一) 环境搭建和新建项目

java web接口开发(一) 环境搭建和新建项目

一直都在做App开发,但是对java web方面的了解比较少,最近有时间,所以自己就寻思动手从零开始搭建一个java web项目。该项目主要是给app,提供接口服务,简称项目为‘mserver’。好了,接下来,我们就…

2026/10/12 15:57:27 阅读更多 →
Spring Boot+Redis限流方案实战:应对高并发流量洪峰

Spring Boot+Redis限流方案实战:应对高并发流量洪峰

1. 项目概述:当接口遭遇流量洪峰时上周五凌晨三点,我被一阵急促的报警短信惊醒——核心支付接口的QPS突然从200飙升到8000。登录监控系统一看,整个服务集群已经全线飘红,罪魁祸首是某个合作方脚本失控导致的异常调用。这种场景在分…

2026/10/4 11:37:31 阅读更多 →
java web接口开发(二) 接口开发具体实现

java web接口开发(二) 接口开发具体实现

java web接口开发(一) 环境搭建和新建项目讲解了如何搭建一个简单的Java Web接口项目,如果你还没了解,建议先浏览下!今天这篇文章主要讲解的就是接口开发,打算使用比较古老的或者说比较原始方法实现的接口。 一.数据库设计。 假设要做一个简单的学生信息管理系统,数据库名…

2026/10/2 0:16:33 阅读更多 →

最新新闻

objectmarker正样本描述生成:从标注到训练的可复现流程

objectmarker正样本描述生成:从标注到训练的可复现流程

简介:这份资源是面向计算机视觉初学者与数据集制作者的objectmarker工具源码包,用于解决训练物体识别模型时正样本标注效率低的问题。它基于OpenCV实现鼠标交互式框选,用户可在图像上划定目标区域并按空格记录,退出时自动将边界框…

2026/10/12 21:14:59 阅读更多 →
仅用Redis+定时任务实现视频在线人数统计的缓存方案

仅用Redis+定时任务实现视频在线人数统计的缓存方案

有些需求,乍一看平平无奇,真正动手做的时候才发现水很深。比如“统计一个视频的在线观看人数”,很多人第一反应就是上WebSocket、上Netty、上长连接网关,再配一套实时计数服务。但有一次我接到的需求很明确:只允许用Re…

2026/10/12 21:14:59 阅读更多 →
Anaconda重装失败提示Failed to link extracted packages?一文彻底修复

Anaconda重装失败提示Failed to link extracted packages?一文彻底修复

重装Anaconda卡在进度条一半,屏幕上弹出一句“Failed to link extracted packages to D:\Anaconda\anaconda3”,这事儿光听着就让人头大。我前阵子就实打实踩过一次,网上搜了一圈,发现类似问题的人不少,但很多回答只说…

2026/10/12 21:14:59 阅读更多 →
objectmarker:自动生成正样本描述,打通标注到训练管线

objectmarker:自动生成正样本描述,打通标注到训练管线

简介:这份资源是面向计算机视觉初学者与数据集制作者的objectmarker工具源码包,用于交互式生成训练模型所需的正样本描述。用户通过鼠标在图像上框选目标区域,程序记录边界框坐标并保存为info.txt,格式为图像名加左上角与右下角坐…

2026/10/12 21:14:59 阅读更多 →
AutoJs 4.1.0 布局范围次分析:精准定位控件的实战指南

AutoJs 4.1.0 布局范围次分析:精准定位控件的实战指南

1. 拆解“部局范围次分析”到底在说什么第一次看到“AutoJs4.1.0 部局范围次分析”这个标题,很多人会愣一下。“部局范围”大概率是“布局范围”的输入法误打,而“次分析”则指向一种分层、分步骤的解析思路。合在一起,它讨论的其实是&#x…

2026/10/12 21:14:59 阅读更多 →
3DGS全流程复现指南:环境搭建、COLMAP数据准备与训练排查

3DGS全流程复现指南:环境搭建、COLMAP数据准备与训练排查

简介:面向新手小白的3D高斯(3DGS)复现全流程实战记录,以Linux/Ubuntu 20.04.3 LTS为背景,围绕NVIDIA GeForce RTX 3080 Ti显卡、CUDA 11.8与PyTorch环境,完整记录从零开始跑通gaussian-splatting项目的全过…

2026/10/12 21:13:58 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →