【Android开发日常】一文弄懂桌面图标快捷菜单 桌面小组件

news2024/10/6 2:22:12

本文将介绍如何创建和管理应用快捷方式、如何创建和管理应用桌面小组件。

目录

  • 一、桌面菜单
    • 1.1 概览
    • 1.2、为什么需要桌面图标快捷菜单
    • 1.3、如何实现桌面图标快捷菜单
      • 1.3.1 创建静态快捷方式
      • 1.3.2 创建动态快捷方式
      • 1.3.3 创建固定快捷方式
      • 1.3.4 使用快捷方式的最佳做法
    • 1.4 注意事项
  • 二、桌面小组件
    • 2.1 概览
    • 2.2 添加桌面小组件

一、桌面菜单

1.1 概览

开发可以定义快捷方式,以便在应用中执行特定操作。
这些快捷方式可在受支持的启动器或助理(如 Google 助理)中显示,方便用户快速启动应用中的常见任务或推荐任务。

通过本文你还将了解一些可提升快捷方式效果的最佳做法。

1.2、为什么需要桌面图标快捷菜单

在Android设备上,可以通过快捷菜单来实现对桌面图标的快速操作,例如重命名、卸载、应用信息等。

以下是如何打开和使用Android桌面图标快捷菜单的步骤:

  1. 长按图标:在主屏幕上长按一个应用程序图标,直到它开始浮动或变大。

  2. 打开快捷菜单:一旦图标开始浮动,你会看到一些操作选项浮现在图标周围或者底部显示。

  3. 选择操作:根据你想要执行的操作,从快捷菜单中选择相应的选项

如图所示,
在这里插入图片描述

快捷方式可帮助用户快速访问您的应用的某些部分,从而为他们呈现特定类型的内容。

  • 静态快捷方式
    最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次只能显示四个快捷方式,因此静态快捷方式对常见 Activity 非常有用。例如,如果用户希望以特定的方式查看他们的日历或电子邮件,使用静态快捷方式可确保他们在执行日常任务时始终获得一致体验。
  • 动态快捷方式
    用于应用中与上下文相关的操作。上下文相关快捷方式是专为用户在应用内执行的操作而定制的。例如,如果您构建的游戏允许用户在启动时从当前关卡开始,您需要经常更新该快捷方式。动态快捷方式允许游戏在每次用户通关后更新快捷方式。
  • 固定快捷方式
  • 用于用户驱动的特定操作。例如,用户可能需要将特定网站固定到启动器。这很有用,因为它允许用户执行自定义操作,比如一步导航到网站,这比使用浏览器的默认实例速度更快。

1.3、如何实现桌面图标快捷菜单

1.3.1 创建静态快捷方式

静态快捷方式提供指向应用内常规操作的链接,这些操作在应用当前版本的生命周期内应保持一致。
其步骤如下:

  1. 创建新的资源文件:desk_menu.xml
    在res 下新建xml文件夹,然后在xml文件夹下新建 desk_menu.xml文件
  2. 添加快捷菜单列表,设置图标、跳转地址等
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <shortcut
    android:shortcutId="compose"
    android:enabled="true"
    android:icon="@drawable/compose_icon"
    android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    android:shortcutLongLabel="@string/compose_shortcut_long_label1"
    android:shortcutDisabledMessage="@string/compose_disabled_message1">
    <intent
      android:action="android.intent.action.VIEW"
      android:targetPackage="com.example.myapplication"
      android:targetClass="com.example.myapplication.ComposeActivity" />
    <!-- If your shortcut is associated with multiple intents, include them
         here. The last intent in the list determines what the user sees when
         they launch this shortcut. -->
    <categories android:name="android.shortcut.conversation" />
    <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
  </shortcut>
  <!-- Specify more shortcuts here. -->
</shortcuts>
  1. 找到app的主页面,即在应用的清单文件 (AndroidManifest.xml) 中intent 过滤器设置为 android.intent.action.MAIN 操作和 android.intent.category.LAUNCHER 类别的 Activity。

  2. 添加 元素,如下:
    < meta-data android:name=“android.app.shortcuts”
    android:resource=“@xml/desk_menu” />

<!-- 主页 -->
<activity
    android:name=".ui.HomeActivity"
    android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
    android:hardwareAccelerated="true"
    android:launchMode="singleTask"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustNothing"
    android:theme="@style/HomeTheme">
  <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>

  <meta-data android:name="android.app.shortcuts"
          android:resource="@xml/desk_menu" />
</activity>
  1. 属性说明
    • android:shortcutId
      必填项,且只能是常规字符,切不可将此属性的值设置为资源字符串(例如 @string/foo)。
    • android:shortcutShortLabel
      必填项,这是用于简短说明快捷方式用途的词组,
      此属性的值必须为资源字符串,例如 @string/shortcut_short_label
    • android:shortcutLongLabel
      选填,这是用于详细说明快捷方式用途的词组。如果空间足够大,启动器会显示此值,而不是 android:shortcutShortLabel。 请尽可能将快捷方式的“详细说明”的长度限制在 25 个字符以内。
      此属性的值必须为资源字符串,例如 @string/shortcut_short_label
    • android:shortcutDisabledMessage
      选填,这是当用户尝试启动已停用的快捷方式时出现在支持的启动器中的消息。此消息应向用户解释快捷方式现在停用的原因。 如果 android:enabled 为 true,则此属性的值无效,
      此属性的值必须为资源字符串,例如 @string/shortcut_short_label
    • android:enabled
      选填,这用于确定用户是否能够与支持的启动器中的快捷方式进行交互。 android:enabled 的默认值为 true。 如果您将其设置为 false,则还应设置 android:shortcutDisabledMessage,
      用于说明停用该快捷方式的原因。如果您认为自己不需要提供此类消息,最简单的做法就是从 XML 文件中完全移除该快捷方式
    • android:icon
      选填,这是启动器向用户显示快捷方式时所用的位图或自适应图标。此值可以是某个图片的路径,也可以是包含相应图片的资源文件。请尽可能使用自适应图标来提高性能和一致性。

1.3.2 创建动态快捷方式

动态快捷方式提供指向应用内特定的上下文相关操作的链接。这些操作可能会在应用的不同使用场景间发生变化,甚至会在应用运行时发生变化。
适合使用动态快捷方式的用例包括致电特定人员、导航到特定位置,以及从用户的上一个存档点加载游戏。您也可以使用动态快捷方式打开一个对话。

其步骤如下:

  1. 添加 Google 快捷方式集成库和 ShortcutManagerCompat 的依赖项

dependencies {
    implementation "androidx.core:core:1.6.0"
    implementation 'androidx.core:core-google-shortcuts:1.0.0'
    ...
}


  1. 更新 gradle.properties 文件以支持 AndroidX 库:

   android.useAndroidX=true
   # Automatically convert third-party libraries to use AndroidX
   android.enableJetifier=true

      
  1. 编码

ShortcutInfo shortcut = new ShortcutInfoCompat.Builder(context, "id1")
    .setShortLabel("Website")
    .setLongLabel("Open the website")
    .setIcon(IconCompat.createWithResource(context, R.drawable.icon_website))
    .setIntent(new Intent(Intent.ACTION_VIEW,
                   Uri.parse("https://www.mysite.example.com/")))
    .build();

ShortcutManagerCompat.pushDynamicShortcut(context, shortcut);

推送和更新:使用 pushDynamicShortcut() 发布和更新动态快捷方式。如果已经存在具有相同 ID 的动态快捷方式或固定快捷方式,那么每个可变快捷方式都会更新。
移除:使用 removeDynamicShortcuts() 移除一组动态快捷方式,或使用 removeAllDynamicShortcuts() 移除所有动态快捷方式。

如需详细了解如何对快捷方式执行操作,请参阅管理快捷方式和 ShortcutManagerCompat 参考文档

1.3.3 创建固定快捷方式

在 Android 8.0(API 级别 26)及更高版本中,您可以创建固定快捷方式。与静态和动态快捷方式不同,固定快捷方式在受支持的启动器中显示为单独的图标。图 1 显示了这两类快捷方式之间的区别。
如图所示:
在这里插入图片描述
注意:当您尝试将快捷方式固定到受支持的启动器上时,用户会收到一个确认对话框,询问其是否允许固定该快捷方式。如果用户不允许固定该快捷方式,启动器会取消这一请求。
我们可以使用** isRequestPinShortcutSupported()** 验证设备的默认启动器是否支持应用内固定快捷方式。

如果支持的话,则按下面步骤添加固定方式:

ShortcutManager shortcutManager =
        context.getSystemService(ShortcutManager.class);

if (shortcutManager.isRequestPinShortcutSupported()) {
    // Assumes there's already a shortcut with the ID "my-shortcut".
    // The shortcut must be enabled.
    ShortcutInfo pinShortcutInfo =
            new ShortcutInfo.Builder(context, "my-shortcut").build();

    // Create the PendingIntent object only if your app needs to be notified
    // that the user allowed the shortcut to be pinned. Note that, if the
    // pinning operation fails, your app isn't notified. We assume here that the
    // app has implemented a method called createShortcutResultIntent() that
    // returns a broadcast intent.
    Intent pinnedShortcutCallbackIntent =
            shortcutManager.createShortcutResultIntent(pinShortcutInfo);

    // Configure the intent so that your app's broadcast receiver gets
    // the callback successfully.For details, see PendingIntent.getBroadcast().
    PendingIntent successCallback = PendingIntent.getBroadcast(context, /* request code */ 0,
            pinnedShortcutCallbackIntent, /* flags */ 0);

    // 将快捷方式固定到设备的启动器上。
    shortcutManager.requestPinShortcut(pinShortcutInfo,
            successCallback.getIntentSender());
}

快捷方式固定后,您的应用可以使用 updateShortcuts() 方法更新其内容。

1.3.4 使用快捷方式的最佳做法

在设计和创建应用快捷方式时,请遵循以下准则:

  • 遵循设计准则
    为使您的应用的快捷方式在视觉上与系统应用的快捷方式保持一致,请遵循应用快捷方式设计准则。

  • 仅发布四个不同的快捷方式
    尽管 API 目前支持在任意指定时间为应用总计发布最多十五个静态和动态快捷方式,但我们建议您仅发布四个不同的快捷方式,以改善其在启动器中的视觉外观。

除了在启动器上显示快捷方式之外,您还可以使用 Google 快捷方式集成库在 Google Surface(例如 Google 助理)上显示快捷方式。此库支持推送任意数量的动态快捷方式。如果您要使用此库推送大量快捷方式,我们建议您通过调用 setRank() 方法来设置在支持的启动器中应该显示的快捷方式“排名”。

  • 限制快捷方式说明的长度
    启动器中用来显示应用快捷方式的菜单空间有限。 请尽可能将快捷方式的“简短说明”的长度限制在 10 个字符以内,将“详细说明”的长度限制在 25 个字符以内。

如需详细了解静态快捷方式的标签,请参阅自定义属性值。如需了解动态和固定快捷方式,请参阅有关 setLongLabel() 和 setShortLabel() 的参考文档。

  • 保留快捷方式和操作的使用记录
    对于您创建的每个快捷方式,请考虑用户可以通过哪些不同方式直接在应用内完成同一任务。请务必在每种情况下调用 reportShortcutUsed(),以便启动器准确记录用户执行快捷方式所表示的操作的频率。

  • 仅对含义未变的快捷方式执行更新
    更改动态快捷方式和固定快捷方式时,请仅在更改含义未变的快捷方式的信息时调用 updateShortcuts()。否则,您应该使用下列方法之一,具体取决于您要重新创建的快捷方式的类型:

动态快捷方式: pushDynamicShortcut()。
固定快捷方式: requestPinShortcut()。
例如,如果您创建了导航到超市的快捷方式,那么在超市的名称发生更改但其位置保持不变的情况下更新快捷方式才比较合适。不过,如果用户开始在其他超市购物,则最好创建一个新的快捷方式。

  • 发布应用时即检查动态快捷方式
    当用户将数据恢复到新设备时,系统不会保留动态快捷方式。 因此,我们建议您在每次启动应用时检查 getDynamicShortcuts() 返回的对象数量,并根据需要重新发布动态快捷方式,如备份和恢复中的代码段所示。

1.4 注意事项

  • 每个快捷方式都会引用一个或多个 intent,每个 intent 都会在用户选择相应快捷方式时在应用中启动特定操作。
    只有处理 Intent.ACTION_MAIN 操作和 Intent.CATEGORY_LAUNCHER 类别的主 activity 可以拥有快捷方式。如果应用有多个主 activity,则您需要为每个 activity 定义一组快捷方式。

  • 大多数受支持的启动器一次最多可显示四个快捷方式,包括静态和动态快捷方式。
    设备支持的快捷方式数量上限可能因设备而异。使用 getMaxShortcutCountPerActivity() 方法可确定特定设备支持多少个快捷方式。

  • 用户可创建的应用固定快捷方式数量没有限制。应用无法移除固定快捷方式,但仍然可以停用它们。
    虽然其他应用无法访问您的快捷方式内的元数据,但启动器本身可以访问此类数据。因此,这些元数据应隐藏敏感的用户信息。

二、桌面小组件

应用微件概览

2.1 概览

可以嵌入其他应用(如主屏幕)并接收定期更新的微型应用视图。这些视图称为界面中的微件,您可以使用应用微件提供程序发布微件。
能够容纳其他应用微件的应用组件称为应用微件托管应用。下面的屏幕截图显示了设置应用微件。
在这里插入图片描述

2.2 添加桌面小组件

这个比较简单,我们直接看步骤:

  1. 写一个继承自AppWidgetProvider的类

public class SettingsAppWidgetProvider extends AppWidgetProvider {

}
  1. 新建一个布局文件 widget.xml
  2. res文件夹下新建xml文件夹,并新建 appwidget_info.xml
    该文件用于指定 AppWidgetProviderInfo 资源位置。

<appwidget-provider
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/loading_widget"               用于定义应用微件布局的布局资源
        android:minHeight="@dimen/min_digital_widget_height"         指定应用微件默认情况下占用的最小空间
        android:minWidth="@dimen/min_digital_widget_width"           指定应用微件默认情况下占用的最小空间
        android:minResizeHeight="59dp"                               指定应用微件的绝对最小大小
        android:minResizeWidth="136dp"                                指定应用微件的绝对最小大小
        android:previewImage="@drawable/appwidget_digital_clock_preview" 指定预览来描绘应用微件经过配置后是什么样子的
        android:resizeMode="horizontal|vertical"                      按什么规则来调整微件的大小
        android:configure="com.example.android.ExampleAppWidgetConfigure"  在用户添加应用微件时启动以便用户配置应用微件属性的 Activity
        android:updatePeriodMillis="0"                                  刷新频率
        android:widgetCategory="keyguard|home_screen" />                应用微件是否可以显示在主屏幕 (home_screen)/或锁定屏幕 (keyguard)
  1. 清单文件 (AndroidManifest.xml)进行注册

<receiver android:name=".widget.SettingsAppWidgetProvider"
        android:label="@string/gadget_title"
        android:exported="false"
        android:enabled="@bool/has_powercontrol_widget">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
        <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        <action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
        <action android:name="android.location.MODE_CHANGED" />
        <action android:name="com.android.sync.SYNC_CONN_STATUS_CHANGED" />
    </intent-filter>

    <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
</receiver>

项目中的代码就不贴出来了,建议大家可以查看源码学习,如源码的 setting,deskclock,music等都有,源码位置:
在这里插入图片描述

再给一个官方demo demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DOTA-c(RGDyK)和DOTA-cyclo(RGDyK)对αVβ3的亲和力和选择性的影响

&#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09; ●英文名&#xff1a;DOTA-cyclo(RGDyK)&#xff0c;DOTA-c(RGDyK) ●外观以及性质&#xff1a; DOTA-cyclo(RGDyK)中Cyclo(RGDyK)作用于αVβ3比作用于αVβ5和αIIbβ3表现更高的亲和力…

Prometheus 指标存储 观测 dubbo /windows_exporter指标 windows 版本 其他系统换个语法思路一样

目录 下载 Prometheus 访问Prometheus Targets 发现服务 对应的 dubbo 指标就出来了 Dubbo脚手架生成个最简单的项目 导入 Prometheus 相关包 或者使用这个包即可 启动后就自动上报指标了 Windows_exporter or node_exporter 端口 9182 Prometheus 配置 windows_exp…

第37节:cesium 下雪效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

SpringBoot - 在IDEA中经常发现:Could not autowire. No beans of ‘xxx‘ type found的错误

错误描述 在SPRINGBOOT的项目中&#xff0c;使用IDEA时经常会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示&#xff0c;但是程序的编译和运行都没有问题&#xff0c;这个错误提示并不影响项目的生产。 解决方案

Unity3D:专属 Inspector

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 专属 Inspector 专属 Inspector 是专门用于特定游戏对象、Unity 组件或资源的 Inspector 窗口。 它始终显示为其打开的项目的属性&#xff0c;即使您在场景或项目中选择了其他内容…

Flask框架之WTForms(详解)

目录 WTForms介绍和基本使用 WTForms介绍 基本使用 WTForms表单验证的基本使用 WTForms常用验证器 WTForms自定义验证器 场景&#xff1a;验证码实现 WTForms渲染模版 常用的方法 代码示例 WTForms介绍和基本使用 WTForms介绍 这个插件库主要有两个作用。 第一个是做…

十九、socket套接字编程(一)——UDP

文章目录 一、socket套接字编程接口&#xff08;一&#xff09;socket头文件&#xff08;二&#xff09;socket 常见API&#xff08;套接字编程接口&#xff09;1. 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器 )2.绑定网络信息 (TCP/UDP, 服务器 )3.开始监听 socket (TCP…

如何使用 OCI Artifacts、ORAS 和 Docker Hub 标准化软件交付

Docker Hub 是最著名的用于分发和共享容器映像的注册表。不过, Docker Hub 和其他符合 OCI 的注册表现在可以做的不仅仅是容器镜像。ORAS (OCI 注册表作为存储)项目将注册表转换为通用工件存储,能够发布与您的应用程序相关的任何资产。 在本文中,您将了解 ORAS 是什么、它…

echarts-热力图+高亮+轨迹

var mapData [{name: "北京",devicesCount: 100, //总数value: 10, //使用个数},{name: "天津",devicesCount: 50,value: 20,},{name: "上海",devicesCount: 80,value: 30,},{name: "重庆",devicesCount: 90,value: 40,},{name: "…

HOT28-两数相加

leetcode原题链接&#xff1a;两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

搭建mysql集群(Windows环境)

1、MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性&#xff0c;增强了安全性&#xff0c;使得单个MySQL服务器故障不会对系统产生巨大的负面效应&#xff0c;系统的稳定性得到保障。 MySQL群集需要有一组计算机&#xff0c;每台计算机的…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

COMSOL基于随机Voronoi骨架的三维多孔材料泡沫铝骨小梁模型力学分析

力学模型 模型计算为圆柱体试件轴压模型&#xff0c;在轴向荷载作用下应力分布的计算。 几何生成 采用CAD Voronoi3D插件在AutoCAD内直接生成三维Voronoi&#xff0c;其计算参数如下&#xff1a; 模型生成后删除晶格部件&#xff0c;并对晶粒进行一步平滑处理&#xff1a…

Centos7系统,虚拟机断电后启动报错:You might want to save “/run/initramfs/rdsosreport.txt“

虚拟机突然断电造成centos8系统无法启动 Linux报You might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot after mounting 1.解决方法&#xff1a; 大家可以用umr查看到自己装的镜像对应的以-root结尾的文件是哪个。因为大家装的镜像不同&#x…

多语言翻译node工具

多语言 i18n 翻译node工具 介绍 本文是为了方便使用 i18n的翻译工具&#xff0c;实现把excel的内容追加或更改到项目中的多语言文件中主要文件为 index.js 、test.txt 和 dist 文件夹内所有内容&#xff08;dist为项目中需要翻译的多语言文件&#xff0c;下面有例子&#xff…

有源、无源晶振的区别

在PCB设计中&#xff0c;晶振&#xff08;晶体振荡器&#xff09;是非常重要的电子元器件&#xff0c;相信大部分的PCB工程师对它都不会陌生。而对于有源晶振与无源晶振&#xff0c;很多人却是“傻傻分不清楚”。 我们知道&#xff0c;电子线路中的晶体振荡器分为无源晶振和有源…

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

如何配置git的.bashrc文件

1、进入到.git文件里&#xff1a;新建一个.bashrc文件 2、打开.bashrc文件添加配置信息&#xff1a; 代码&#xff1a; #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文件及基本信息 alias llls -al …

Git入门(职场必备工具)

目录 一、git在职场中的重要性 1.1git是什么&#xff1f; 1.2什么是版本控制 1.3学习这个工具的作用和目的 二、Git开发必备技能及其应用场景 2.1 如何用Git对一个目录进行版本控制流程&#xff1f; 三、Git 如何上传和提取代码 3.1 克隆远端库到本地库 3.2 将本地库推…

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 &#xff08;两种方法&#xff09;&#xff08;又叫制作盲埋孔&#xff09; 1.1 制作热风焊盘 &#xff08;之前的教程有&#xff0c;现在只给数据&#xff09; 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘&#xff0c;查看…