版图Layout绘制技巧及其相关快捷键

来源于B站视频教程:Cadence Virtuoso Layout 电路版图绘制技巧及其相关快捷键


本文主要介绍了模拟IC设计中利用Cadence Virtuoso 软件进行版图绘制(Layout)的使用技巧及其相关快捷键。

一、版图前准备操作

  • 画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug)
    在这里插入图片描述

  • 在准备绘制的原理图界面启动layout XL/GXL

  • 利用layoutXL/GXL绘制版图的方式有一个好处是,后续的版图和电路图之间会有链接的关系,并有自动高亮的提示,方便更加快捷绘制版图。
    在这里插入图片描述
    在这里插入图片描述

  • 在更进一步操作之前,首先要去查看所使用工艺库的layout design rule文件,里面会有规定相应网格的大小,确定栅格单位设置大小
    在这里插入图片描述

  • 在layout界面按e,设置网格大小与design rule匹配,单位默认为um

  • 这个工艺库所对应的大小为0.005um
    在这里插入图片描述

  • 直接根据原理图生成版图
    在这里插入图片描述

  • 这里无需创建pr boundary边界,主要是用于数字IC中的要求。
    在这里插入图片描述

  • 点击IO pins,就可以设置对应pin的产生。

  • 选中所有元素,
    在这里插入图片描述

  • 然后选择pin所在的层次,然后点击Apply
    在这里插入图片描述

  • 相应给pin打上label

  • name与pin保持一致,purpose也与pin保持一致
    在这里插入图片描述

  • 然后就自动生成对应元器件的版图了
    在这里插入图片描述

  • 其是可以将版图与原理图进行高亮对应的,对应的连线也会进行高亮显示
    在这里插入图片描述

  • 如果只想查看管子高亮,取消查看连线高亮

  • 点击只选择管子的按钮,那么就只会显示选中的三个管子
    在这里插入图片描述

  • 但是现在只能看到元器件的名字,如果想查看器件版图内部细节

  • shift + f:显示器件版图细节
    在这里插入图片描述

  • 根据原理图连接关系,可以显示版图中未连接的飞线
    在这里插入图片描述

  • 查看原理图与版图中器件对应的链接关系
    在这里插入图片描述
    在这里插入图片描述

  • 如果想更改原理图和版图之间对应的连接关系

  • 点击想要取消的网络连接,点击Bind

  • 然后返回原理图就可以发现没有进行高亮了

  • 如果想重新绑定,那么就选择Bind按钮
    在这里插入图片描述

  • 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD

  • 模拟电路版图简略设计流程:

  • 导入元器件 ——> 根据原理图连接关系进行版图布局(添加dummy器件),匹配器件相对位置摆放 ——> 规定金属走线横竖与奇偶的关系,元器件连接 ——> 阱和衬底连接 ——> DRC / LVS 检查 ——> 寄生参数提取

二、基础操作

1. 鼠标

  • 左键单击 –> 选中或确定操作。如果点击处包含多个层次,则左键多次单击是在不同选中层次间切换

  • 按住左键 –> 选中区域内所有组件

  • 右键单击 –> 扩展操作

  • 按住右键 –> 将原理图自适应到所选中的区域

  • 滑动鼠标滚轮 –> 放大和缩小原理图界面

  • Shift + 滑动鼠标滚轮 –> 水平滚动原理图界面

  • Ctrl + 滑动鼠标滚轮 –> 垂直滚动原理图界面

  • 按住shift可多选

  • 按住Ctrl可取消多选

2. 键盘

  • 下述键盘快捷键操作中,开启大写锁定后,大部分字母按键都会等价于Shift + 该字母按键

  • e –> 打开显示选项。可修改网格点大小,开启display dimming,不显示网格点等等
    在这里插入图片描述

  • Ctrl+F or Shift+F –> 切换是否显示组件版图细节
    在这里插入图片描述

  • f –> 自动将原理图放大到适合屏幕窗口的大小

  • shift+z –> 放大界面;

  • ctrl+z–> 缩小界面;

  • tab –> 转换到以点击位置为画面中心。


  • i –> 添加组件

  • q –> 编辑选中组件的属性

  • shift + q(Q) –> 查看当前窗口的属性

  • ESC –> 取消操作

  • u –> 撤销上一步操作

  • Shift + u –> 恢复下一步操作

  • delete –> 删除

  • ctrl + D –> 取消选择,用鼠标点击空白区域也可实现


  • F2 –> 保存

  • F3 –> 打开基础操作的扩展选项

  • 标尺下F3可以调整标尺的大小
    在这里插入图片描述

  • F4 –> 全部/部分选择模式切换。在图形比较复杂时,可以仅框选图形一部分就同时选中多个图形
    在这里插入图片描述

  • r –> 添加矩形,一般用于绘制有源区,阱部等层

  • p–> 添加路径,一般用于金属走线(layout XL下可以直接延展对应边界)

  • F3 -> 调整走线线宽
    在这里插入图片描述

  • Shift+P–> 添加多边形

  • n –> 切换操作编辑方式,默认90°,在菜单栏中可以观察,90°/45°/任意角度三种模式间切换
    (如果是一条斜线,则表示为45度)
    在这里插入图片描述
    在这里插入图片描述

  • m –> 移动组件

  • Shift + M –> 组合所选中的多个图形(对metal来说,先要保证两者在物理逻辑上是相连接)

  • c –> 复制元素

  • Shift + c –> 裁剪图形

  • Ctrl + s –> 修改通过p产生的连线走向
    先画一条线,然后就会沿着这条线修改走线的走向
    在这里插入图片描述

在这里插入图片描述

  • k –> 添加标尺

  • Shift +k –> 去除所有标尺

  • s –> 拉伸

  • a –> 快速对齐
    点击A,然后选中两条需要对齐的边,进行快速对齐
    在这里插入图片描述
    在这里插入图片描述

另一种对齐方法,打开Align选项框,通过按键将元件进行对齐
在这里插入图片描述
在这里插入图片描述
如果需要进行边距设置,勾上对钩,然后填入间隔距离。再进行上对齐就会有相应的对齐了
在这里插入图片描述
在这里插入图片描述
另一个选项就是纵向的对齐。这样横向2um间隔,纵向1um间隔进行对齐
在这里插入图片描述

以上大部分操作使用时都可以按F3打开扩展选项

  • 对于不同层器件,可以先进行组合,再对齐
    在这里插入图片描述

  • 这里可以选择对齐的方式,是中心对齐还是边缘对齐
    在这里插入图片描述

  • o –> 添加过孔。mode选择stack可以直接创建多层通孔 ,single表示两层间的通孔
    由于不同层之间时存在高度差的,需要使用到通孔进行不同层的金属连接
    在这里插入图片描述

  • F4 -> (F)表示全部选择模式,点击任意器件会把整个器件都进行高亮;当切换到(P)就是边缘选择模式,可以单独选择器件的某个部位
    在这里插入图片描述
    这个方法在进行复杂版图设计时,如果想单独框选某两条走线,可以在(P)模式下,选择这两条走线的边缘,然后按住Q键,就可以单独进行设置了
    在这里插入图片描述
    在这里插入图片描述

  • shift+M -> 将同层金属进行组合
    在这里插入图片描述

  • Shift+o –>旋转

  • t –> 查看点击位置处所包含的所有层次元素
    在这里插入图片描述

  • g –> 切换鼠标是否自动吸附近元素(层次不多的时候比较方便,复杂的时候反而有副作用)

  • Shift + g –> 添加 Guard Ring

  • Multipart Path——用于画guard ring或衬底
    在这里插入图片描述

3. 层次化操作

  • x –> 在当前界面进入所选定的layout子模块的版图(左键双击也可以实现该功能)

  • shift+D -> 返回上一层编辑

  • Shift + x –> 以新简洁的界面打开编辑所选定的layout子模块
    在这里插入图片描述

  • Shift + b –> 返回上一层的layout

4. 进阶操作

  • 左侧绘制选择栏中used勾选只显示所用层、NV勾选可只显示某些层,AV勾选显示所有层
    在这里插入图片描述
  • 设置选择保护(进行高层版图连接时,避免误触选择到子元件)
    在这里插入图片描述
  • 设置成功后黄色线高亮表示对应元件被锁定,后续操作中无法被选择
    在这里插入图片描述

5. XL功能

  • XL probe,查看对应网络在版图的位置及其连接关系
    在这里插入图片描述
    在这里插入图片描述

  • 高亮选中网络所有相关的连接关系
    在这里插入图片描述
    在这里插入图片描述

  • 根据layout修改原理图(需要在layout界面先选好要修改的器件,在点该选项)
    在这里插入图片描述

  • 根据原理图修改layout(需要在layout界面先选好要修改的器件,在点该选项)
    在这里插入图片描述

  • 定义链接关系
    在这里插入图片描述

  • 在原理图中绘制新的器件并选中后,进行新器件导入(可用于dummy管添加)
    在这里插入图片描述

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 Cadence Virtuoso Layout 是一款用于集成电路版图设计的工具,其快捷键功能可显著提升设计效率。快捷键配置文件为 leBindKeys.il,用户可通过 Reshape 命令修改或添加快捷键。在 layout 窗口执行 Reshape 命令后按 ESC 键,layout 右下角会出现 R:后跟命令代码,格式如 bk("Layout" "Ctrl<Key> 以下是一些常用快捷键: 选择与编辑: a:点选物体或点。 Shift+a:框选物体或点。 Ctrl+a:全选。 b:返回上一层 cell。 Shift+b:直接返回上一层 cell。 c:拷贝。 Shift+c:切掉某区域。 Ctrl+c:强行中断命令。 d:去除已选择的物体。 Shift+d:去除已选择的物体。 Ctrl+d:去除所有已选择的物体。 e:显示选项。 Shift+e:布局编辑器选项。 f:在 layout 窗口显示所有已画的 layout。 Shift+f:显示 layout 层次。 Ctrl+f:显示 layout Cell 名字或 array。 绘制与操作: g:自动吸附边角功能的开关。 Shift+g:画 guard ring。 Ctrl+g:缩放到网格。 i:调出器件。 k:创建尺子。 Shift+k:清除尺子。 l:生成 label。 m:移动物体。 Shift+m:合并物体。 n:移动物体。 Shift+n:移动物体。 Ctrl+n:移动物体。 o:移动原点。 Shift+o:旋转物体。 p:画 path。 Shift+p:画多边形。 Ctrl+p:创建符号引脚。 q:修改物体的属性。 Shift+q:显示当前 Cell 的属性。 r:生成矩形。 Shift+r:重画所选的物体。 Ctrl
那接下来几个界面也像这样修改成这种形式,只用最小量修改。首先是fragment_home.xml:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.home.HomeFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 🔍 输入框 --> <EditText android:id="@+id/home_input" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入需要查询的公交线路或站点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:minHeight="48dp" android:textSize="16sp" android:padding="12dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/home_search" app:layout_constraintHorizontal_chainStyle="packed" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:layout_marginTop="88dp" /> <!-- 🔎 搜索按钮 --> <Button android:id="@+id/home_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" app:layout_constraintTop_toTopOf="@id/home_input" app:layout_constraintBottom_toBottomOf="@id/home_input" app:layout_constraintStart_toEndOf="@id/home_input" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" /> <!-- 🚌 图片:居中偏上 --> <ImageView android:id="@+id/image_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/bus" app:layout_constraintTop_toBottomOf="@id/home_input" app:layout_constraintBottom_toTopOf="@+id/text_home" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="144dp" android:layout_marginBottom="144dp"/> <!-- ℹ️ 底部说明文字 --> <TextView android:id="@+id/text_home" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> 其次是fragment_map.xml:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_top_offset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.015" /> <!-- 🔹 起点输入框 --> <EditText android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入起点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" android:layout_marginTop="32dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toTopOf="@id/guideline_top_offset" /> <!-- 🔹 终点输入框 --> <EditText android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入终点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/map_input1" /> <!-- ✅ 分割线:75% 处(原样保留) --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <!-- 🔍 搜索按钮:纵向拉高,覆盖两个输入框 --> <Button android:id="@+id/map_search" android:layout_width="0dp" android:layout_height="0dp" android:text="搜索" android:textSize="16sp" android:gravity="center" app:layout_constraintStart_toStartOf="@id/guideline_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/map_input1" app:layout_constraintBottom_toBottomOf="@id/map_input2" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图:从终点输入框下方开始,延伸到底部 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:text="Bus-1.0" android:textColor="#777777" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/map_input2" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="4dp" android:layout_marginBottom="0dp"/> </androidx.constraintlayout.widget.ConstraintLayout> 接着是fragment_settings.xml:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.settings.SettingsFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 🔹 Material Design 按钮组 --> <Button android:id="@+id/btn_gps" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="权限设置" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:layout_marginTop="56dp" /> <Button android:id="@+id/btn_apps" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关于公交查询系统" app:layout_constraintTop_toBottomOf="@id/btn_gps" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:layout_marginTop="16dp" /> <Button android:id="@+id/btn_user" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="用户调研" app:layout_constraintTop_toBottomOf="@id/btn_apps" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:layout_marginTop="16dp" /> <Button android:id="@+id/btn_exit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="退出程序" app:layout_constraintTop_toBottomOf="@id/btn_user" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:layout_marginTop="16dp" /> <!-- 🔹 图片:放在按钮下方 --> <ImageView android:id="@+id/image_bus" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="64dp" android:layout_marginBottom="64dp" android:src="@drawable/bus" app:layout_constraintBottom_toTopOf="@+id/text_settings" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/btn_exit" /> <!-- 🔹 底部 TextView --> <TextView android:id="@+id/text_settings" android:text="Bus-1.0" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> 还有activity_survey.xml:<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- 问题1:评分 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginBottom="32dp" android:text="🚌 用户体验调研" android:textColor="#777777" android:textSize="24sp" android:textStyle="bold" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1. 您对本应用的整体评分是?" android:textStyle="bold" android:textColor="#777777" android:layout_marginBottom="8dp" /> <RadioGroup android:id="@+id/radioGroupRating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp"> <RadioButton android:text="⭐ 1分 - 非常不满意" android:textColor="@color/black" android:id="@+id/rb1" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐ 2分 - 不满意" android:textColor="@color/black" android:id="@+id/rb2" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐ 3分 - 一般" android:textColor="@color/black" android:id="@+id/rb3" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐ 4分 - 满意" android:textColor="@color/black" android:id="@+id/rb4" android:layout_height="match_parent" android:layout_width="match_parent"/> <RadioButton android:text="⭐⭐⭐⭐⭐ 5分 - 非常满意" android:textColor="@color/black" android:id="@+id/rb5" android:layout_height="match_parent" android:layout_width="match_parent"/> </RadioGroup> <!-- 问题2:满意度 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2. 您对以下哪些方面或功能感到满意?(可多选)" android:textColor="#777777" android:textStyle="bold" android:layout_marginBottom="8dp" /> <CheckBox android:id="@+id/cb_ui" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="界面美观易用" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_speed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载速度快" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_information" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询信息准确" android:textColor="@color/black"/> <CheckBox android:id="@+id/cb_other" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="其他" android:textColor="@color/black"/> <!-- 问题3:建议 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3. 您有什么改进建议?" android:textColor="#777777" android:textStyle="bold" android:layout_marginTop="24dp" android:layout_marginBottom="8dp" /> <EditText android:id="@+id/et_suggestion" android:layout_width="match_parent" android:layout_height="120dp" android:gravity="top" android:hint="请输入您的建议..." android:textColorHint="#777777" android:textColor="@color/black" android:inputType="textMultiLine" android:minLines="3" /> <!-- 提交按钮 --> <Button android:id="@+id/btn_submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交反馈" android:textSize="18sp" android:layout_marginTop="32dp" style="?android:attr/buttonStyle" /> </LinearLayout> </ScrollView> 和activity_about.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:padding="20dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 软件名称 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公交查询系统" android:textSize="28sp" android:textStyle="bold" android:textColor="#000" android:layout_marginBottom="10dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bus" android:textSize="18sp" android:textColor="#555555" android:layout_marginBottom="80dp" /> <!-- 软件图片 --> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/bus" android:layout_marginBottom="100dp"/> <!-- 版本信息 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="版本:1.0" android:textSize="16sp" android:textColor="#777777" android:layout_marginBottom="20dp" /> <!-- 开发信息 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开发团队:white luminous" android:textSize="16sp" android:textColor="#777777" android:layout_marginBottom="10dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="邮箱:support@busapp.cn" android:textColor="#777777" android:textSize="16sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="hao" android:textSize="8sp" android:layout_marginTop="100dp" android:textColor="#EEE"/> </LinearLayout> 以及activity_route_plan.xml: <!-- res/layout/activity_route_plan.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:fitsSystemWindows="true" android:background="@color/surface_background"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="正在规划公交路线..." android:textSize="16sp" android:gravity="center" android:padding="16dp" android:textColor="#555" /> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
11-07
非常好!你提供了完整的项目 UI 布局,我们将 **逐个文件进行最小量修改**,目标是: --- ### ✅ 统一风格:使用 `ConstraintLayout` + `Space` + `Guideline` 实现 **响应式百分比布局** - 移除硬编码的 `dp` margin(如 `88dp`, `144dp`) - 用 `Space` 替代视觉空白 - 使用 `app:layout_constraintHeight_percent` 控制关键区域高度或间距 - 尽可能保留原有结构和逻辑 --- ## ✅ 1. `fragment_home.xml` → 首页搜索界面 ### 🔧 修改点: - 移除 `android:layout_marginTop="88dp"` - 用 `Space` 在输入框与图片之间留出 10% 屏幕高度的空隙 - 图片上下各占 20%,文字底部对齐 ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.home.HomeFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- 🔍 输入框 --> <EditText android:id="@+id/home_input" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="请输入需要查询的公交线路或站点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:minHeight="48dp" android:textSize="16sp" android:padding="12dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/home_search" app:layout_constraintHorizontal_chainStyle="packed" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" /> <!-- 🔎 搜索按钮 --> <Button android:id="@+id/home_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" app:layout_constraintTop_toTopOf="@id/home_input" app:layout_constraintBottom_toBottomOf="@id/home_input" app:layout_constraintStart_toEndOf="@id/home_input" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" /> <!-- ⬛ Space: 输入框下方留出 10% 高度作为间隔 --> <Space android:id="@+id/space_after_input" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/home_input" app:layout_constraintBottom_toTopOf="@id/image_bus" app:layout_constraintHeight_percent="0.1" /> <!-- 🚌 图片:居中偏上 --> <ImageView android:id="@+id/image_bus" android:layout_width="wrap_content" android:layout_height="0dp" android:scaleType="fitCenter" android:src="@drawable/bus" app:layout_constraintTop_toBottomOf="@id/space_after_input" app:layout_constraintBottom_toTopOf="@+id/text_home" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent="0.3" /> <!-- ⬛ Space: 图片下方再留 5% 空白 --> <Space android:id="@+id/space_after_image" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintBottom_toTopOf="@+id/text_home" app:layout_constraintHeight_percent="0.05" /> <!-- ℹ️ 底部说明文字 --> <TextView android:id="@+id/text_home" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toBottomOf="@id/space_after_image" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` --- ## ✅ 2. `fragment_map.xml` → 地图搜索界面 ### 🔧 修改点: - 移除 `layout_marginTop="32dp"` 和 `guideline_top_offset` - 使用 `Space` 在顶部留出 6% 高度 - 输入框总高约 15%,按钮拉伸匹配 ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- ⬛ Space: 顶部留出 6% 高度 --> <Space android:id="@+id/space_top_padding" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/map_input1" app:layout_constraintHeight_percent="0.06" /> <!-- 🔹 起点输入框 --> <EditText android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入起点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/space_top_padding" /> <!-- 🔹 终点输入框 --> <EditText android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入终点" android:textColorHint="#777777" android:textColor="@color/black" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/map_input1" app:layout_constraintVertical_bias="0" /> <!-- ✅ 分割线:75% 处 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <!-- 🔍 搜索按钮 --> <Button android:id="@+id/map_search" android:layout_width="0dp" android:layout_height="0dp" android:text="搜索" android:textSize="16sp" app:layout_constraintStart_toStartOf="@id/guideline_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/map_input1" app:layout_constraintBottom_toBottomOf="@id/map_input2" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/map_input2" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="4dp" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` --- ## ✅ 3. `fragment_settings.xml` → 设置界面 ### 🔧 修改点: - 按钮组上方留出 8% 空白 - 按钮间用 `Space` 保持 3% 间距 - 图片区域占 25%,底部文字固定 ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.settings.SettingsFragment" android:fitsSystemWindows="true" android:background="@color/surface_background"> <!-- ⬛ Top Padding --> <Space android:id="@+id/space_top" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/btn_gps" app:layout_constraintHeight_percent="0.08" /> <!-- 🔹 按钮组 --> <Button android:id="@+id/btn_gps" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="权限设置" app:layout_constraintTop_toBottomOf="@id/space_top" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" /> <Space android:id="@+id/space_1" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/btn_gps" app:layout_constraintBottom_toTopOf="@id/btn_apps" app:layout_constraintHeight_percent="0.03" /> <Button android:id="@+id/btn_apps" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关于公交查询系统" app:layout_constraintTop_toBottomOf="@id/space_1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" /> <Space android:id="@+id/space_2" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/btn_apps" app:layout_constraintBottom_toTopOf="@id/btn_user" app:layout_constraintHeight_percent="0.03" /> <Button android:id="@+id/btn_user" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="用户调研" app:layout_constraintTop_toBottomOf="@id/space_2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" /> <Space android:id="@+id/space_3" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/btn_user" app:layout_constraintBottom_toTopOf="@id/image_bus" app:layout_constraintHeight_percent="0.03" /> <!-- 🔹 图片 --> <ImageView android:id="@+id/image_bus" android:layout_width="match_parent" android:layout_height="0dp" android:src="@drawable/bus" app:layout_constraintTop_toBottomOf="@id/space_3" app:layout_constraintBottom_toTopOf="@id/text_settings" app:layout_constraintHeight_percent="0.25" /> <!-- ⬛ 中间空白 --> <Space android:id="@+id/space_after_image" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintBottom_toTopOf="@id/text_settings" app:layout_constraintHeight_percent="0.04" /> <!-- 🔹 底部 TextView --> <TextView android:id="@+id/text_settings" android:text="Bus-1.0" android:textColor="#777777" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:textAlignment="center" android:textSize="11sp" app:layout_constraintTop_toBottomOf="@id/space_after_image" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` --- ## ✅ 4. `activity_survey.xml` → 用户调研(保留 ScrollView) > ❗ 注意:`ScrollView` 内不能直接用 `ConstraintLayout` 的百分比约束,需嵌套一层 `ConstraintLayout` ```xml <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" android:fitsSystemWindows="true" android:background="@color/surface_background"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="🚌 用户体验调研" android:textColor="#777777" android:textSize="24sp" android:textStyle="bold" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp" android:layout_marginBottom="32dp" /> <TextView android:id="@+id/q1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1. 您对本应用的整体评分是?" android:textStyle="bold" android:textColor="#777777" app:layout_constraintTop_toBottomOf="@id/title" app:layout_constraintStart_toStartOf="parent" android:layout_marginBottom="8dp" /> <RadioGroup android:id="@+id/radioGroupRating" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/q1" app:layout_constraintStart_toStartOf="parent" android:layout_marginBottom="24dp" /> <TextView android:id="@+id/q2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2. 您对以下哪些方面或功能感到满意?(可多选)" android:textColor="#777777" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/radioGroupRating" app:layout_constraintStart_toStartOf="parent" android:layout_marginBottom="8dp" /> <CheckBox ... /> <CheckBox ... /> <CheckBox ... /> <CheckBox ... /> <TextView android:id="@+id/q3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="3. 您有什么改进建议?" android:textColor="#777777" android:textStyle="bold" app:layout_constraintTop_toBottomOf="@id/cb_other" android:layout_marginTop="24dp" android:layout_marginBottom="8dp" /> <EditText android:id="@+id/et_suggestion" android:layout_width="match_parent" android:layout_height="120dp" android:gravity="top" android:hint="请输入您的建议..." android:textColorHint="#777777" android:textColor="@color/black" android:inputType="textMultiLine" app:layout_constraintTop_toBottomOf="@id/q3" android:layout_marginBottom="32dp" /> <Button android:id="@+id/btn_submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交反馈" android:textSize="18sp" app:layout_constraintTop_toBottomOf="@id/et_suggestion" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="32dp" android:layout_marginBottom="48dp" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> ``` --- ## ✅ 5. `activity_about.xml` → 关于页面 改为 `ConstraintLayout` 并使用百分比: ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/surface_background" android:fitsSystemWindows="true"> <TextView android:id="@+id/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公交查询系统" android:textSize="28sp" android:textStyle="bold" android:textColor="#000" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="32dp" /> <TextView android:id="@+id/version_tag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bus" android:textSize="18sp" android:textColor="#555555" app:layout_constraintTop_toBottomOf="@id/app_name" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="8dp" /> <!-- ⬛ 上方空白 --> <Space android:id="@+id/space_above_img" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/version_tag" app:layout_constraintBottom_toTopOf="@id/image_bus" app:layout_constraintHeight_percent="0.06" /> <ImageView android:id="@+id/image_bus" android:layout_width="match_parent" android:layout_height="0dp" android:src="@drawable/bus" app:layout_constraintTop_toBottomOf="@id/space_above_img" app:layout_constraintHeight_percent="0.25" /> <!-- ⬛ 中间空白 --> <Space android:id="@+id/space_below_img" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/image_bus" app:layout_constraintHeight_percent="0.05" /> <TextView android:id="@+id/version_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="版本:1.0" android:textSize="16sp" android:textColor="#777777" app:layout_constraintTop_toBottomOf="@id/space_below_img" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <TextView android:id="@+id/team_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开发团队:white luminous" android:textSize="16sp" android:textColor="#777777" app:layout_constraintTop_toBottomOf="@id/version_info" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="8dp" /> <TextView android:id="@+id/email_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="邮箱:support@busapp.cn" android:textColor="#777777" android:textSize="16sp" app:layout_constraintTop_toBottomOf="@id/team_info" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="8dp" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` --- ## ✅ 6. `activity_route_plan.xml` → 路线规划 改为 `ConstraintLayout`,标题占 8%,地图占 92% ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/surface_background" android:fitsSystemWindows="true"> <TextView android:id="@+id/loading_text" android:layout_width="match_parent" android:layout_height="0dp" android:text="正在规划公交路线..." android:textSize="16sp" android:gravity="center" android:padding="16dp" android:textColor="#555" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHeight_percent="0.08" /> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/loading_text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` --- ## ✅ 总结:统一规范达成! | 文件 | 是否已响应式化 | 主要改动 | |------|----------------|----------| | `fragment_home.xml` | ✅ | 用 `Space` 替代 `marginTop` | | `fragment_map.xml` | ✅ | 移除硬编码 top margin | | `fragment_settings.xml` | ✅ | 按钮间距改为百分比 | | `activity_survey.xml` | ✅ | 嵌套 `ConstraintLayout` 支持约束 | | `activity_about.xml` | ✅ | 改为 `ConstraintLayout` + 百分比 | | `activity_route_plan.xml` | ✅ | 标题与地图按比例分配 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东南方的射频学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值