当前位置: 首页 > news >正文

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI

文章目录

  • 1 GUILayout
  • 2 EditorGUI 介绍
  • 3 文本、层级、标签、颜色拾取
    • 3.1 LabelField
    • 3.2 LayerField
    • 3.3 TagField
    • 3.4 ColorField
    • 3.5 代码示例
  • 4 枚举选择、整数选择、按下按钮
    • 4.1 EnumPopup / EnumFlagsField
    • 4.2 IntPopup
    • 4.3 DropdownButton
    • 4.4 代码示例
  • 5 对象关联、各类型输入
    • 5.1 ObjectField
    • 5.2 各类型输入
    • 5.3 代码示例
  • 6 折叠、折叠组
    • 6.1 Foldout
    • 6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup
    • 6.3 代码示例
  • 7 开关、开关组
    • 7.1 Toggle / ToggleLeft
    • 7.2 BeginToggleGroup / EndToggleGroup
    • 7.3 代码示例
  • 8 滑动条、双滑块滑动条
    • 8.1 Slider / IntSlider
    • 8.2 MinMaxSlider
    • 8.3 代码示例
  • 9 帮助框、间隔
    • 9.1 HelpBox
    • 9.2 Space
    • 9.3 代码示例
  • 10 动画曲线、布局
    • 10.1 CurveField
    • 10.2 布局相关 API
    • 10.3 代码示例

1 GUILayout

​ GUILayout 是 GUI 自动布局的公共类,其中的方法和 GUI 基本类似,均用来绘制、响应各种 UI 控件,不同之处在于 GUILayout 在 GUI 的基础上加入了自动布局功能,无需过多关心 UI 控件的位置和大小。

GUILayoutOption 布局选项

  1. 控件的固定宽高
    • GUILayout.Width(300);
    • GUILayout.Height(200);
  2. 允许控件的最小宽高
    • GUILayout.MinWidth(50);
    • GUILayout.MinHeight(50);
  3. 允许控件的最大宽高
    • GUILayout.MaxWidth(100);
    • GUILayout.MaxHeight(100);
  4. 允许或禁止水平拓展
    • GUILayout.ExpandWidth(true); //允许
    • GUILayout.ExpandHeight(false); //禁止
    • GUILayout.ExpandHeight(true); //允许
    • GUILayout.ExpandHeight(false); //禁止

2 EditorGUI 介绍

​ EditorGUI 类似 GUI,是用于绘制编辑器拓展 UI 的工具类,提供 GUI 中没有的 API(主要是编辑器功能中会用到的一些特殊控件)。

​ EditorGUILayout 类似于 GUILayout,是带有自动布局功能的 EditorGUI 绘制工具类。通常,会将 EditorGUI 和 GUI 混合使用来制作编辑器拓展功能。但由于用到自动布局功能,因此接下来着重介绍 EditorGUILayout 中的功能。EditorGUI 和它的区别仅仅是需要自己设置位置而已。

​ 详细内容:https://docs.unity.cn/cn/2022.3/ScriptReference/EditorGUILayout.html。

3 文本、层级、标签、颜色拾取

3.1 LabelField

  • EditorGUILayout.LabelField("文本标题", "文本内容");

3.2 LayerField

  • int变量 = EditorGUILayout.LayerField("层级选择", int变量);

3.3 TagField

  • string变量 = EditorGUILayout.TagField("标签选择", string变量);

3.4 ColorField

  • color变量 = EditorGUILayout.ColorField(new GUIContent("标题"), color变量, 是否显示拾色器, 是否显示透明度通道, 是否支持HDR);

3.5 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}int    layer;string tag;Color  color;private void OnGUI() {// 窗口中的控件相关绘制 逻辑处理相关的内容// EditorGUI相关的控件 同样还是需要在OnGUI当中进行实现 才能被显示出来// 文本EditorGUILayout.LabelField("文本标题", "测试内容");EditorGUILayout.LabelField("文本内容");// 层级layer = EditorGUILayout.LayerField("层级选择", layer);// 标签tag = EditorGUILayout.TagField("标签选择", tag);// 颜色获取color = EditorGUILayout.ColorField(new GUIContent("自定义颜色获取"), color, true, false, false);}
}
image-20240212141148011

4 枚举选择、整数选择、按下按钮

4.1 EnumPopup / EnumFlagsField

  • 枚举选择

    枚举变量 = (枚举类型)EditorGUILayout.EnumPopup("枚举选择", 枚举变量);

  • 多选枚举

    注意:多选枚举进行的是或运算,声明枚举时一定注意其中的赋值,并且一定要有多种情况的搭配值。

    枚举变量 = (枚举类型)EditorGUILayout.EnumFlagsField("枚举多选", 枚举变量);

4.2 IntPopup

  • int变量 = EditorGUILayout.IntPopup("整数单选框", int变量, 字符串数组, int数组);

4.3 DropdownButton

  • EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive)
    • FocusType:枚举时告诉 UI 系统能够获得键盘焦点,当用户按 Tab 键时在控件之间进行切换。
    • Keyboard:该控件可接收键盘焦点。
    • Passive:该控件不能接收键盘焦点。

4.4 代码示例

public enum E_TestType
{One         = 1,Two         = 2,Three       = 4,One_and_Two = 1 | 2,
}public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}E_TestType type;E_TestType type2;string[] strs = { "选择123", "选择234", "选择345" };int[]    ints = { 123, 234, 345 };int      num  = 0;private void OnGUI() {// 枚举选择type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);// 整数选择控件// 返回值是整数数组当中的某一个值num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);EditorGUILayout.LabelField(num.ToString());// 按下就响应的按钮if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))Debug.Log("按下就响应");}
}
image-20240212142052588

5 对象关联、各类型输入

5.1 ObjectField

  • 对象变量 = EditorGUILayout.ObjectField(对象变量, typeof(对象类型), 是否允许关联场景上对象资源) as 对象类型;

5.2 各类型输入

  • int变量 = EditorGUILayout.IntField("Int输入框", int变量);

  • long变量 = EditorGUILayout.LongField("long输入框", long变量);

  • float变量 = EditorGUILayout.FloatField("Float 输入:", float变量);

  • double变量 = EditorGUILayout.DoubleField("double 输入:", double变量);

  • string变量 = EditorGUILayout.TextField("Text输入:", string变量);

  • vector2变量 = EditorGUILayout.Vector2Field("Vec2输入: ", vector2变量);

  • vector3变量 = EditorGUILayout.Vector3Field("Vec3输入: ", vector3变量);

  • vector4变量 = EditorGUILayout.Vector4Field("Vec4输入: ", vector4变量);

  • rect变量 = EditorGUILayout.RectField("rect输入: ", rect变量);

  • bounds变量 = EditorGUILayout.BoundsField("Bounds输入: ", bounds变量);

  • boundsInt变量 = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt变量);

​ 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是:在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。

5.3 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}GameObject obj;int    i;int    i2;float  f;double d;long   l;string  str;Vector2 vec2;Vector3 vec3;Vector4 vec4;Rect      rect;Bounds    bounds;BoundsInt boundsInt;private void OnGUI() {// 对象关联obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;// 各类型输入i = EditorGUILayout.IntField("Int输入框", i);EditorGUILayout.LabelField(i.ToString());l = EditorGUILayout.LongField("long输入框", l);f = EditorGUILayout.FloatField("Float 输入:", f);d = EditorGUILayout.DoubleField("double 输入:", d);str = EditorGUILayout.TextField("Text输入:", str);vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);rect = EditorGUILayout.RectField("rect输入: ", rect);bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);// 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是://      在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);EditorGUILayout.LabelField(i2.ToString());}
}
image-20240212142613862

6 折叠、折叠组

6.1 Foldout

  • bool变量 = EditorGUILayout.Foldout(bool变量, "标题名");

6.2 BeginFoldoutHeaderGroup / EndFoldoutHeaderGroup

  • bool变量 = EditorGUILayout.BeginFoldoutHeaderGroup(bool变量, "标题名");

    ...

    EditorGUILayout.EndFoldoutHeaderGroup();

​ 折叠组会有高亮加粗的显示,而普通折叠没有。

image-20240212143316336

6.3 代码示例

public enum E_TestType
{One         = 1,Two         = 2,Three       = 4,One_and_Two = 1 | 2,
}public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}E_TestType type;E_TestType type2;string[] strs = { "选择123", "选择234", "选择345" };int[]    ints = { 123, 234, 345 };int      num  = 0;GameObject obj;int    i;int    i2;float  f;double d;long   l;string  str;Vector2 vec2;Vector3 vec3;Vector4 vec4;Rect      rect;Bounds    bounds;BoundsInt boundsInt;bool isHide;bool isHideGroup;private void OnGUI() {isHide = EditorGUILayout.Foldout(isHide, "折叠控件", false);if (isHide) {// 枚举选择type = (E_TestType)EditorGUILayout.EnumPopup("枚举选择", type);type2 = (E_TestType)EditorGUILayout.EnumFlagsField("枚举多选", type2);// 整数选择控件// 返回值是整数数组当中的某一个值num = EditorGUILayout.IntPopup("整数单选框", num, strs, ints);EditorGUILayout.LabelField(num.ToString());// 按下就响应的按钮if (EditorGUILayout.DropdownButton(new GUIContent("按钮上文字"), FocusType.Passive))Debug.Log("按下就响应");}isHideGroup = EditorGUILayout.BeginFoldoutHeaderGroup(isHideGroup, "折叠组控件");if (isHideGroup) {// 对象关联obj = EditorGUILayout.ObjectField("关联资源对象", obj, typeof(GameObject), false) as GameObject;// 各类型输入i = EditorGUILayout.IntField("Int输入框", i);EditorGUILayout.LabelField(i.ToString());l = EditorGUILayout.LongField("long输入框", l);f = EditorGUILayout.FloatField("Float 输入:", f);d = EditorGUILayout.DoubleField("double 输入:", d);str = EditorGUILayout.TextField("Text输入:", str);vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", vec2);vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", vec3);vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", vec4);rect = EditorGUILayout.RectField("rect输入: ", rect);bounds = EditorGUILayout.BoundsField("Bounds输入: ", bounds);boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", boundsInt);// 注意:EditorGUILayout 中 Delayed 开头的输入控件和普通输入控件最主要的区别是://      在用户按 Enter 键或将焦点从字段移开之前,返回值不会更改。i2 = EditorGUILayout.DelayedIntField("Int输入框", i2);EditorGUILayout.LabelField(i2.ToString());}EditorGUILayout.EndFoldoutHeaderGroup();}
}
image-20240212143225100

7 开关、开关组

7.1 Toggle / ToggleLeft

  • 普通开关

    bool变量 = EditorGUILayout.Toggle("普通开关", bool变量);

  • 左侧开关

    bool变量 = EditorGUILayout.ToggleLeft("开关在左侧", bool变量);

7.2 BeginToggleGroup / EndToggleGroup

  • bool变量 = EditorGUILayout.BeginToggleGroup("开关组", bool变量);

    ...

    EditorGUILayout.EndToggleGroup();

7.3 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}bool isTog;bool isTogLeft;bool isTogGroup;private void OnGUI() {// 开关组控件isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);// 开关控件isTog = EditorGUILayout.Toggle("开关控件", isTog);isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);EditorGUILayout.EndToggleGroup();}
}
image-20240212143916072

8 滑动条、双滑块滑动条

8.1 Slider / IntSlider

  • float变量 = EditorGUILayout.Slider("滑动条", float变量, 最小值, 最大值);
  • int变量 = EditorGUILayout.IntSlider("整数值滑动条", int变量, 最小值, 最大值);

8.2 MinMaxSlider

  • EditorGUILayout.MinMaxSlider("双块滑动条", ref 左侧值, ref 右侧值, 最小值, 最大值);

​ 没有返回值,通过 ref 关键字修改数值。

8.3 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}float fSlider;int   iSlider;float leftV;float rightV;private void OnGUI() {// 滑动条fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);// 双块滑动条EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);EditorGUILayout.LabelField(leftV.ToString());EditorGUILayout.LabelField(rightV.ToString());}
}
image-20240212144337815

9 帮助框、间隔

9.1 HelpBox

  • EditorGUILayout.HelpBox("一般提示", MessageType.None);
  • EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);
  • EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);
  • EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);

9.2 Space

  • EditorGUILayout.Space(10); // 间隔 10 个单位

9.3 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}private void OnGUI() {EditorGUILayout.HelpBox("一般提示", MessageType.None);EditorGUILayout.Space(10);EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);EditorGUILayout.Space(50);EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);EditorGUILayout.Space(100);EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);}
}
image-20240212144916875

10 动画曲线、布局

10.1 CurveField

  • AnimationCurve变量 = EditorGUILayout.CurveField("动画曲线:", AnimationCurve变量);

10.2 布局相关 API

  • 水平布局

    EditorGUILayout.BeginHorizontal(); // 开始水平布局

    ...
    EditorGUILayout.EndHorizontal(); // 结束水平布局

  • 垂直布局

    EditorGUILayout.BeginVertical(); // 开始垂直布局
    ...
    EditorGUILayout.EndVertical(); // 结束垂直布局

  • 滚动视图

    Vector2布局 = EditorGUILayout.BeginScrollView(Vector2布局); // 开启滚动视图

    ...
    EditorGUILayout.EndScrollView(); // 结束滚动视图

10.3 代码示例

public class Lesson3 : EditorWindow
{[MenuItem("Unity编辑器拓展/Lesson3/EditorGUI知识讲解窗口")]private static void OpenLesson3() {Lesson3 win = EditorWindow.GetWindow<Lesson3>("EditorGUI知识讲解窗口");win.Show();}bool isTog;bool isTogLeft;bool isTogGroup;float fSlider;int   iSlider;float leftV;float rightV;AnimationCurve curve = new AnimationCurve();Vector2 vec2Pos;private void OnGUI() {vec2Pos = EditorGUILayout.BeginScrollView(vec2Pos); // 开启滚动视图// 开关组控件isTogGroup = EditorGUILayout.BeginToggleGroup("开关组控件", isTogGroup);// 开关控件isTog = EditorGUILayout.Toggle("开关控件", isTog);isTogLeft = EditorGUILayout.ToggleLeft("左侧开关", isTogLeft);EditorGUILayout.EndToggleGroup();// 滑动条fSlider = EditorGUILayout.Slider("滑动条", fSlider, 0, 10);iSlider = EditorGUILayout.IntSlider("整形滑动条", iSlider, 0, 10);// 双块滑动条EditorGUILayout.MinMaxSlider("双块滑动条", ref leftV, ref rightV, 0, 10);EditorGUILayout.LabelField(leftV.ToString());EditorGUILayout.LabelField(rightV.ToString());// 帮助框控件EditorGUILayout.HelpBox("一般提示", MessageType.None);EditorGUILayout.Space(10);EditorGUILayout.HelpBox("感叹号提示", MessageType.Info);EditorGUILayout.Space(50);EditorGUILayout.HelpBox("警告符号提示", MessageType.Warning);EditorGUILayout.Space(100);EditorGUILayout.HelpBox("错误符号提示", MessageType.Error);// 间隔控件EditorGUILayout.EndScrollView(); // 结束滚动视图// 动画曲线控件curve = EditorGUILayout.CurveField("曲线控件", curve);// 布局APIEditorGUILayout.BeginHorizontal(); // 开始水平布局EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.EndHorizontal(); // 结束水平布局EditorGUILayout.BeginVertical(); // 开始垂直布局EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.LabelField("123123");EditorGUILayout.EndVertical(); // 结束垂直布局}
}
image-20240212145703501

相关文章:

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI

文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…...

shell脚本编译与解析

文章目录 shell变量全局变量&#xff08;环境变量&#xff09;局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...

第64讲个人中心用户操作菜单实现

静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…...

工业以太网交换机引领现代工厂自动化新潮流

随着科技的飞速发展&#xff0c;现代工厂正迎来一场前所未有的自动化变革&#xff0c;而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成&#xff0c;探讨这一集成如何推动工业生产的智能化、效率提升以及未…...

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理

通过“添加自定义菜单”来学习menuconfig图形化配置原理&#xff0c;将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”&#xff0c;此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”&#xff0c;此配置项处于菜单“My test m…...

推荐高端资源素材图库下载平台整站源码

推荐高端图库素材下载站的响应式模板和完整的整站源码&#xff0c;适用于娱乐网资源网。该模板支持移动端&#xff0c;并集成了支付宝接口。 演示地 址 &#xff1a; runruncode.com/tupiao/19692.html 页面设计精美&#xff0c;不亚于大型网站的美工水准&#xff0c;并且用户…...

Redis实现:每个进程每30秒执行一次任务

前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由

文章目录 前言一、RWKV-Runner是什么&#xff1f;RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; ChatGPT的横空出世&#xff0c;打开了AI的大门&#xff…...

Dockerfile和.gitlab-ci.yml文件模板

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum&#xff0c;也就是Linux系统的应用商店 Linux--基础开…...

Learn LaTeX 017 - LaTex Multicolumn 分栏

在科学排版中进行分栏操作&#xff0c;能够有效的利用页面中的空间&#xff0c;避免空白位置的浪费。 好的分栏设计能对你的排版增色不少&#xff01; https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...

Android 9.0 禁用adb install 安装app功能

1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实&#xff0c;OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码&#xff0c;还没有仔细去学习。 “HybridOctree_Hex”的开发者说&#xff1a;六面体网格主要是用在数值模拟领域的&#xff0c;比如汽车…...

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…...

vscode开发FPGA(0)--windows平台搭建

一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese&#xff08;simplified&#xff09;中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…...

Java String源码剖析+面试题整理

由于字符串操作是计算机程序中最常见的操作之一&#xff0c;在面试中也是经常出现。本文从基本用法出发逐步深入剖析String的结构和性质&#xff0c;并结合面试题来帮助理解。 String基本用法 在Java中String的创建可以直接像基本类型一样定义&#xff0c;也可以new一个 Str…...

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战

开篇部分&#xff1a;人工智能、深度神经网络与内存计算的交汇 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一股强大力量&#xff0c;而深度神经网络&#xff08;DNN&#xff09;则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…...

[C/C++] -- CMake使用

CMake&#xff08;Cross-platform Make&#xff09;是一个开源的跨平台构建工具&#xff0c;用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程&#xff0c;使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…...

笔记本选购配置参数详解

笔记本电脑的选购是一个技术活&#xff0c;涉及到众多的配置参数。本文将为您详细解析笔记本电脑的主要配置参数&#xff0c;帮助您在选购时做出明智的决策。 1. 处理器&#xff08;CPU&#xff09; 处理器是笔记本电脑的核心组件&#xff0c;负责执行计算任务…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...