Houdini入门(每天持续更新一点点!!!)

本文是Houdini学习笔记,涵盖SOP基础节点、Group组、Attributes属性、循环迭代、动画相关等内容,介绍各模块功能与操作技巧,如节点使用、参数调整、动画制作等,还提及导出动画、HDA数字资产及RBD刚体破碎等,最后作者决定暂停学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部分的对照文件在这里,需要的自取THAA━━。゚(゚ノ∀`*゚)゚。━━NKS!!!!!GitHub - Dafenyuyu/Houdini_Dafenyuyu: 对照文件

第三章:SOP基础节点(SOP是Surface Operator)

第一节:Houdini的各个模块介绍

至于这些模块为什么这么叫,没有为什么,官方就是这么定的( ◠‿◠ )

重要程度了解一下

SOP

在 Houdini 中,SOP(Surface Operator)即曲面操作模块,是非常核心的模块之一。它主要用于几何物体的创建和修改,涵盖了从基础几何形状的生成到复杂的模型构建与变形等多种操作。

POP

POP(Particle Operators)即粒子操作模块,在 Houdini 中是用于处理粒子系统相关操作的关键部分。它能够让用户创建各种各样复杂且逼真的粒子效果,从自然现象模拟到抽象的视觉特效等诸多方面都有广泛应用。

VEX

VEX 是 Houdini 中一种强大的编程语言接口,它允许用户通过编写代码来对场景中的各种元素进行高度定制化的操作。VEX 模块在几何处理、动画制作、特效生成以及渲染等多个环节都发挥着关键作用。

Vellum

Vellum 是 Houdini 中用于模拟柔软物体和布料效果的模块。它基于物理模拟,能够真实地再现布料的飘动、拉伸、折叠,以及像软体动物、橡胶制品等柔软物体的变形等多种效果。

RBD

RBD(Rigid Body Dynamics)在 Houdini 中是用于刚体动力学模拟的模块。刚体是指在运动过程中形状和大小保持不变的物体,RBD 模块可以模拟这些刚体之间的碰撞、摩擦、破碎等物理现象,在影视特效、游戏开发等多个领域有广泛的应用。

Pyro

Pyro 是 Houdini 中专门用于火焰、烟雾和爆炸等热流体特效模拟的模块。它基于物理原理,能够生成非常逼真的气态效果,为影视、游戏等领域的特效制作提供强大的支持。

第二节:Font

在Houdini中收尾相连的线会自动形成一个面,如果想要关掉这个面的显示的话可以用ends节点

Ctrl+中键可以让参数回到默认值

如果这里只想要字体形成的曲线那Font里面就不要勾选Hole Faces,字体上的过渡线就会没有

Font节点中最后一个属性是Add Text Attributes给字体添加属性 可以给字母划分不同的颜色 点i—textindex或者textsymbol查看 i面板可以用Ctrl+中键快速调出

$F是最常见的一个变量 可以显示当前帧数

第三节:Trace

相当于用图片来代替文字输入 在这个节点的Filters里面有一些可以调节生成字曲线点的一些参数

这个文件不一定要用本地文件 也可以使用一个图片的网址 (但是使用了这个之后最好点击节点左下角的雪花图标锁起来)

这里先转成曲线 然后转成多变形可以做卡通字的效果 勾选Add Point Texture可以给生成的东西加UV

还可以用COP模块做一张图 然后用Trace抠出来(用的很少)

第四节:PolyExtrude与Sweep

挤出单面的模型需要勾选Output Back,如果基础全封闭的就不用勾选

挤出可以一起挤出或者是沿着面挤出,这种的就不用勾背面

做一个随机挤出的效果,用到的节点是Attribute Randomize(属性随机化)默认随机的属性是Cd也就是颜色

要挤出不同的距离,则需要控制Local Control里面的参数 距离对应的是Distance Scale 然后把这个参数的变量名(变量名建议保持默认就好)复制进随机的那个节点替换掉Cd ,Attribute Class改为Primitives。还需注意的一点是距离是一维参数 颜色是三维(我个人这么理解 可以专业叫法不是zy)。Options里面也有参数可以调整,类似于种子的一些东西

前后都不要,向内挤出出可以做出空心字的效果,也就是调整Inset的值

Twist是扭

接下来介绍的PolyExtrude右边的输入端,沿曲线寄出,首先使用Curve Bezier画一条曲线,并使用Smooth和resample节点让曲线变得更平滑,曲线的长度可以使用Measure测量

查看曲线长度

在加多一点分段就可以沿曲线寄出,但是这个东西并不好用哈哈哈,做这样的效果还是sweep节点更好用一点

使用sweep节点挤出,左路是曲线输入,右路是截面输入。将End Caps里面的End CapType改为Single Pologon可以把模型封口。这里需要注意一点,正常挤出的东西相对于截面来说是反的。需要纠正方向。这个节点最大的好处就是有UV

拧一拧

第五节:Curve绘制曲线

在Obj里面新建一个Geometry 然后geo里面建一个Curve Bezier,切换到多重手柄工具就可以绘制。空格+2键进入顶视图,Shift+F1显示操作文档。还有Ploygon和Nurbs两种类型的曲线,用法和Maya里面的差不多

这里来运用一下那个给曲线倒角的功能,首先创建一个Font节点,用文字转成曲线Primitive Type改为Beziers Only,然后使用Convert节点转一下(转成Bezier Curve),最后连接上曲线节点的输入端

第六节:综合小练习

使用一张图片结合Trace节点生成一个点赞形状

使用 delect节点删除外圈多余部分,再用divide节点三角化一下多边面

然后挤出倒角,右边的节点是一个投币的形状。

matchsize节点可以参考一个物体的大小,左边是修改对象,右边是参考对象

第七节:关于倒角问题

正确的和不正确的倒角,需要处理好多边面再挤出。

在进行布尔运算后,要使用PolySplit节点对多边面进行处理再挤出,然后再选中需要倒角的边(s进入选择模式,3键选线,双击环选),然后使用PolyBevel节点进行倒角处理(鼠标左键调整范围,滚轮调整段数)

这里介绍一个快捷操作,可以更改C键的热盒菜单,将其设置为PloyModeling,就可以快速调出切割,倒角,挤出的那些菜单。也可以按下Tab键找节点

下面是正确的节点演示

第四章:Group组

第一节:Group处理的元素

在场景中新建三个节点,全选Alt拉一下可以Merge合并,在使用Ployextrude挤出的话会全部挤出,因为Ployextrude的Group为null

然后给sphere加一个Group,挤出节点里面设置一下对应的组就可以单独对小球进行挤出。

创建组的注意事项,组的名字是区分一个组的关键,也就是属性面板里面的Group Name,复制的话这个名字是不会变的,新建的话可能会变,但最好还是手动检查一下

组就是针对某一些元素进行处理,而排除掉我不想要的元素

下面是一些小练习。对Frot节点中的部分字进行挤出,也是先给它添加一个Group节点,然后看图。这个Base Group里面也可以直接输入数字 对应的是面序号 用空格隔开

挤出中设置好对应的组就可以了

Vertices承载的是uv信息,是为了展uv用的,而且是不能在三维视图中进行编辑的。Vertices形成Primitives

第二节:Group_空间选择

先来了解一下Bounding Box和Bounding Sphere的打组方式,顾名思义就是用一个方盒子或者球体来框选范围。可以回车键进入多重手柄工具调节大小

这里介绍一个小技巧,正常情况下,复制节点 节点名会变,但是节点里面的Group Name不会变。这时候就可以使用一个通用本地变量名$OS,节点名字就会和Group Name保持一致

box和Sphere略有不同

第三种空间选择:Bounding Object(points or vertices only),这里用一个pighead来框选范围,连入Group节点右边的输入端,此时会选中一些点,但是需要挤出的是面,所以就需要一个grouppromote来转换,把Points转化为Primitives。

然后在挤出节点中选择对应的组就可以按范围挤出了

第四种体积选择,这种有一个好处就是可以将几个物体合并成一个大的体积 很方便的一种选择方式

基于法线方向的选择,确定好角度轴向的程序化选择

null是在Sop模块创建的

这个选一些不正常的面

19.5版本还新加了一个Bounding Tepe 文档链接指路http://127.0.0.1:48626/nodes/sop/groupcreate

总结

第三节:Group_by_Range

这个节点的属性面板中,Base Group可以像基本的Group节点那样用,组的类型(Group Type)要选对不然可能会没有效果,Merge Method在组名字一样的情况下可以使用,例如都为Group1,还可以使用RangeType设置开始和结束

做一个程序化的四角镖

按角度选边

然后用Bounding框选中间的点缩放,用一个!进行反向缩放

程序化的好处就是可以随时更改尖尖的数量

第四节:Group_Expand

先来介绍一下,删组和删属性。attribdelete是删属性,groupdelete是删组。clean节点组和属性都能删除都删需要输入一个*       Shift+R可以切换连线顺序

Switch是一个开关节点,可以一下输入很多个,用01这样的数字来控制

接下来是Group_Expand的使用

Flood Fill to Connected Geometry有点类似于Maya里面的壳选择,拿一个石头人的锤子举例

然后可以用balst删除锤子或者只留锤子

如果Group_Expand节点只有选面打组的功能那简直太无聊了,这里介绍一个用这个节点求管道中线的技巧

首先用spiral节点创建一条螺旋曲线,稍微调整一下参数

接下来连接一个Mountain(也就是Attritute Noise的一个属性预设),得到一个不规则的曲线

再使用sweep进行挤出,截面类型就用预设里面的圆盘就行,还可以用一条曲线控制不同地方的粗细

最后用Remesh节点对模型进行重拓补,Target Size值越小拓补的越精细,这里我们使用0.03就刚刚好。然后使用Stash节点进行冻结操作,来模拟一个从外部导入的模型。

断开stash节点和上面节点的连接,y键划一下断开,然后就轮到groupexpand节点登场了。操作是这样的,先选最头上的一圈点,勾上Flood Fill巴拉巴拉 勾上Step,按下回车就能全选打组

这时候重点就来了,点击groupexpend节点的i,再点step,再看三维视图,数字再均匀的递增上去

这个数字需要设置一下才能出现

然后使用Fuse节点焊接step的点,拉动Snap Distance就能看见效果

但这个时候的点序号是乱的,我们最后是需要用正确的点序号进行连线的

这里就需要用到Sort节点对点进行排序,Point Sort设置为By Attribute,属性设置为Step,这时的点的序号就正确了

最后使用add节点将所有的点连起来,把Ploygons里面改为By Group就会自动把所有的点连线

然后打开之前的管道作为参考,紫色的那个按钮,按Ctrl键点一下可以变成实体参考。就可以看到管道的中线已经求出。这个效果对做流体帮助比较大,例如血液在血管中流动

第五节:表达式打组

用到的节点是groupexpression,里面有一些预设的表达式

Within radius 1 sphere of origin 半径1范围内原点的原点球,有点像Bounding Sphere

X coordinate less than 0 X坐标小于0

30% chance 30%的几率 类似于随机选择

还有一些选三边四边或者五边的表达式

也可以加很多个VEXpressions然后将其合并

顺带提一下用Attributewrangle如何打组 拉杆是ch('变量名')

@group_grp1 = rand(@primnum+ch('seed')) < ch('Ratio');

第六节:节点输出组选项

利用规则来生成程序化的东西

用到的功能是输出组,可以把输出的东西进行打组,然后重复挤出向内偏移就能得到

第七节:组概念的应用

组的作用就是确定好去处理谁或者不去处理谁

选面打组的方式:可以s键进入选择模式,选好确定的面,然后按下delete,节点区域会出现一个blast,勾选Delete Non Selected可以反选。如果选择的是线,按下delete则会出现dissolve

也可以在三维区域选好面之后,按下Tab键建一个Group节点打组

Split节点可以分两路区分打组和未打组区域,赋予不同的颜色看看效果

第八节:拆解PointsFromVolume

PointsFromVolume节点在超过2.5的平面上就不起作用吗?

这个节点处理的是一个体积 但grid是一个平面无体积 只是恰好在屏幕大小小于2,5的时候回有作用

我们可以对Grid进行处理一下 添加一个extrudeVolume节点并把平面向上抬一点点就会在操作2.5的大小下起作用

第九节:Group_Combine

类似于布尔运算

这里介绍一个小技巧 获取上游节点名称并将其作为Group Name

表达式这样写`opinput(".",0)`      中键可以翻译内容

第十节:连续组的选择

shift+p   ctrl shift 上键 

这是一个钟根据习惯的选法,比如隔一个选一个然后按shift+p,再同时按ctrl shift 上键 就会一圈隔一个选一个,在此基础之上,shift+左向左扩展,shift+右向右扩展。不同的规则需要再次按Shift+P

Lab工具出不来待我找找原因

第五章:Attributes属性

第一节:属性的概念

Detail是整体属性 P是顶点属性 N是法线 Cd是ColorDiffulse v表示发射速度(小写的v)

查看点的属性 并不是非黑即白

使用AttributeCreate创建属性R值为1可以看到曲线变成了红色,RG都为1则会变成黄色

使用Attribute Wrangle也是一样的效果,只不过一个要写表达式一个不用写表达式

第二节:属性和组的关系

在认识的第一个Group节点中就有用到属性

根据点属性来选择区域打组表达式@P.y>0的意思是点位置的y轴大于0就会被选上,因为处理的类型是点,所以需要把Primitive改为Points,会得到一个模糊的区域

想要把这个模糊区域变实可以使用attribtepromote节点转化,选择需要转化的属性类型,更改好由哪种类型转化为哪种类型。正常状态会得到一个粉色区域 可以更改一下Promotion Method转换方式

组实际上就是条件 谁满足了处理谁 属性本身就能成为组的条件

将一个球Y轴小于0的点拍平但保留拓补结构

首先是直接写VEX表达式的方式

下面两种写法都可以

但是这个操作用VOP节点连就会非常费劲 两种方式

用ray节点投射也可以做到,将球体投射到一个平面上

第三节:Transform

先使用Polyframe节点求一个点的切线,模式改为First Edge,不改的话这个线会默认往里面走

再连一个粒子节点玩一下

接下来看看Transform节点,里面有一个Attributes的框,默认是一个*号,也就是默认全部处理,这里我输入v,让Transform节点只处理上面求出来的切线,转一转角度

粒子的发射方向也会跟着变

技巧2:用Transfrom求枢轴中心

这里创建一个小恐龙,删除其他部分只保留尖尖,这时就可以用Transform节点将其位置归到世界中心原点

点击这个Move Centroid to Origin,当然这个办法有点笨,是不够程序化的

用表达式和本地变量来将物体归到原点

时代变了 也可以用一种很简单的方法 就是用matchsize节点,这是一个大小参照节点,右路不连的情况下大小是不会变的,但是会将物体归到世界中心原点

第四节:Copy_to_Transform

使用Copy_to_Transform复制一些猪头,间隔为2,数量为6

一边复制一边旋转

猪头踩地$YMIN,缩放用的是Uniform Scale

第五节:Copy_to_Points

制作一个随机分布物体的效果。撒点撒了100个。这边建议用Transform节点控制物体的大小,而不是直接对物体进行缩放

Attributes Name 控制颜色的是Cd    大小是pscale    法线是N

第六节:Copy_Stamp 

使用Stamp功能

emm 敲不出来在这个节点 下一节

第七节:Copy_to_Curve

做一个猪头排排队,两种方式都可以

Pitch Yaw Roll 代表不同方向的旋转 可以理解为点头摇头这样

第八节:Chain

有点像穿项链的一个工具

这里是把猪头 玩具和小球穿在一起,chain节点会自动识别merge节点里面的东西。先用Transform节点调整物体大小,再用matchsize节点节点将物体居中和对其位置。由于toy是几个单独物体结合起来的需要用一个pack节点打包。再用一个Sweep节点将曲线变成一个管,就有穿起来的感觉

关于贝塞尔曲线节点的用法

在节点区创建一个Curve节点是不会进入绘制模式的,可以先按2键调整到顶视图,然后Enter键回车进入绘制模式,关键的是这两个东西,第一个箭头是选择,第二个是绘制模式

在来说说Chair节点的一些用法,选中节点后,按下回车会出现一根绿色的线

用这个参数调整从头部开始的裁切量

还可以这样,切掉一点再往前推一点

案例 先看效果

这里会用到foreach节点,作用应该就是把每个字母都matchsize一遍,归到世界中心原点

首先给font节点添加属性

给颜色的时候会用到,处理的是Primitive

给倒角一个角度限制

Matchsize循环居中

第九节:多物体Copy

首先出场的是Copypoints

CopyToPoints是Houdini的一个重要节点,作用是将输入geometry根据输入点集进行复制。

在一个平面上随机撒点

复制出来是这个样子

现在复制出来的是一团一团的 要区分开必须手动定义变量 可以用Pointswrangle

现在复制出来的物体有很多穿插,可以用Points relax节点对点进行松弛

这里付一张变量类型表

另一种形式的复制,用到的也是Copytopoints

一些英文翻译

还有一种更高级的

第十节:Mask属性

1、根据Mask权重来撒点 画遮罩的那种

attributepaint后面一般会跟一个attributeblur 用来模糊上面画的遮罩

2、根据输入几何体来获取遮罩关系,用到的节点是maskfromgeometry,输入的几何体是一个猪头,按i点mask就能出现颜色

使用Ployreduce优化面时就可以用到那一圈遮罩,遮罩部分保留更多的细节

用遮罩删除红色区域,用地形Mask相关的节点来区分出想要的区域

第十一节:Attribute_Transfer

1、将低模的Mask映射到高模上去

先创建一个猪头,用remesh给模型重新拓补,将Target Size的值调小即可。这便得到了高模,再用Attributepaints给低模的猪头画一点遮罩,再用AttBlur模糊一下。创建一个attribtransfer,左边连高模,右边连低模模糊后的遮罩

如果想用Mountain节点来控制遮罩区域的变化,则勾选Use Attribute

2、maskfromgeometry和maskalonggeometry

用这个Mask影响mountain的范围,调整maskalonggeometry节点里面Raius的值

做一个好玩的,取一个grid和sphere相交的遮罩,遮罩控制mountain区域,并动起来

组是一个非黑即白的东西,而Mask是一个可以有柔和过渡的东西,如果用组来做下面的效果就会很生硬

第十二节:N_attribute

由多个Vertices的顶点可以构成一个Primitives的点

reverse节点可以反转面法线

十三节:六边形蜂窝状思路

1、用transform和CopyAndTransform,间距需要自己算一下

2、第二种是将一个平面变成竖线的模式,需要设置好对应的边数和大小

然后用grouprange节点隔一个选一个 成一个组

然后用transform选好向上移动一点

然后点就会变成这个样子,

再用CopytoPoints

3、第三种是用Pointsfromvolume撒点,点的排布方式要选Tetrahedral

再接一个triangulate2d和一个divide

十四节:根据规则连线

将乱序的点按照某一规律连接

未处理之前点序号是乱的,所以用add节点连的线也是乱七八糟的

这边可以用attribute transform来映射,右路输入一个画的曲线

起点的黑白由绘制的曲线决定

第六章:循环迭代

第一节:Foreach_Number

案例1:把一个小球每次移动1,循环移动10次,新建一个Foreach Number

但此时还看不到效果,因为begin那里默认状态使用的是input,也就是每次都是把在外面输入的那个小球移动一个单位,然后end那里的状态又是Merge,所以就是把这个小球移动了10次并Merge到了一起,来看看前后数据对比

so 想要看到一个小球移动10个单位后的效果,要改两个设置

如果想让每次移动的随机一点可以用这串表达式

rand(detail('../foreach_count1/','iteration',0))

这个节点是用来记录一些循环信息的

案例2:循环的向内偏移并且挤出

案例3

第二节:Foreach_Primitive

其实foreach节点就那几个 不同的地方在于预设不同

处理Primitive 将Polygon球的三角面沿面的中心点缩放50%的两种方法

第一种:用表达式$CEXYZ

第二种:先用matchsize里面的Stash Transform然后接一个Traform节点缩小50% 然后再用matchsize节点里面的Restore Transform 这种对比第一种的好处就是不用写表达式

可以再添加一个Switch对两种方式进行左右控制  Shift+R进行切换

做一个这种的效果

1

循环得到这个效果

此时有些点还处于浮空状态,需要使用ray节点将点投射到面上

然后点的For each 配合copytopoints

将排布好的数字挤出一点

和之前的面做一个布尔,类型需要选对

再用polywire把mesh变成管道和上面做好的merge到一起就行

还可以做这样的

第三节:Foreach_Connectivity

这个循环节点可以处理类似于大写的字母(完整一个的。如果是小写的例如一个i处理起来就不太行,就要用到下面的节点,要勾选Add Text Attributes)

做一个堆书的效果

双击高亮x的值并选中,然后左键拖入到Z 

再选这个就会有ch("sx")

第七章:动画相关

第一节:动画时间线

循环往回播 上键往后播 下键往前播 Ctrl上去到第一 Ctrl下去到最后

play once只播一次

zig-zag左右播

Alt+左键 k帧  Ctrl+左键删除帧(只能删除关键帧)  Ctrl+shift+左键全部删除(关键帧表达式之类的)  Ctrl加中键回到默认参数

自动关键帧

显示关键帧的一些曲线属性

第二节:路径动画

最简单的表达式动画

做一个简单的路径动画,这里新建一个rubbertoy和一条曲线,是在两个不同的geo层级下的,曲线的geo命名为path

使用Fallow Path,先选物体,回车,再选曲线,回车

然后就动起来了

关于表达式状态的一个变化

Ctrl Shift加鼠标左键清除  就可以变成关键帧动画

如果想要把运动的物体换成猪头 ,只要在框住的geo层级里面新建一个猪头并显示就可以,这就是Chop的一大优点

用一下LookAT的功能 先什么都不选 ,然后点击要看的,回车,再点击被看的,回车,再回车

效果

再做一个相机看向一个物体绕圈圈的效果

第三节:表达式动画

表达式变量与属性

 $F是整数 $FF是小数  

做一个最简单的表达式动画

绕圈圈表达式

旋转往上升

第四节:CHOP与循环动画

很难以后再说

第五节:拖尾动画

对应文件是Trail_Animation

第六节:SOP_SOLVER

xxxxxxx

学了这么久 感觉这个东西对我的帮助其实也不是很大 所以我决定先暂时停止学这个,以后用到了再去学,下面记一些让我比较好奇的东西

1、houdini导出FXB和ABC动画

可能会遇到的问题 FBX比例不对用Transform去调整 ABC动画可能角度不对

2、HDA数字资产

otls是大家约定俗成的一个路径 不要多嘴去问HDA放在哪 没做过HDA的话otls文件是不存在的

然后apply一下,做好的都会存在这里

这个类似于解包,点了的话就可以编辑里面的内容

第十五章:RBD刚体破碎

第一节:RBD刚体基础

做一个物体破碎的效果,首先用的是voronoifracture节点,是根据点来切割模型

用explodedview节点查看碎的效果

用assemble节点将每个碎块都pack一次,后面破碎要用到

然后创建一个DOP模块

里面这样连

然后就可以碎了,拖动时间轴查看

破碎的块可以调整一些 弹力 摩擦力 代理的一些属性

粒子发射刚体的一些案例

第二节:RBD MaterialFractu

破碎的集大成者,可以碎的很彻底

边缘有细节的一些破碎

这两个一连基本完事

第三节:碎裂导入UE

思路就是 要先把UE的那个桌子导到houdini 然后做好破碎效果 用ropnet导出破碎动画 

UE里面怎么爆的 先显示完好的模型 当按下某个键的时候 丸子模型隐藏 显示破碎的模型

这个节点可以画一个碎的权重

第四节:猪头切片

先这样吧  学这个挺烦的 等我把Zbrush搞定了再回来

冻结时间2023年5月23日( ´༎ຶㅂ༎ຶ`)

03-20
### Geek in Technology Context In the context of technology, the term **geek** often refers to individuals who are deeply passionate about specific areas within science, technology, engineering, or mathematics (STEM). This passion typically translates into an advanced level of knowledge and skill in these domains. For instance, geeks may focus on cutting-edge technologies such as virtual worlds[^1], where they explore ethical dilemmas alongside technical innovations. Additionally, their interest might extend to futuristic concepts like the metaverse[^2], which represents a blend of augmented reality, virtual reality, and digital ecosystems. From another perspective, geeks also contribute significantly to technological advancements by engaging with complex systems that require specialized expertise. An example includes working with high-performance networking solutions using RDMA (Remote Direct Memory Access)[^3]. Such work involves overcoming challenges related to learning curves while optimizing system performance for real-world applications. Moreover, when it comes to software development practices among tech enthusiasts—or geeks—they frequently experiment with various tools and techniques aimed at enhancing user experiences through creative designs. One illustration could be crafting simple yet effective UI components like footer views utilizing XML layouts in Android apps[^4]. ```xml <?xml version="1.0" encoding="utf-8"?> <TextView android:id="@+id/footer_text" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="48dp" android:gravity="center" android:textColor="#666" android:textSize="12sp"/> ``` This snippet demonstrates how even seemingly minor elements can reflect broader principles valued within geek culture—such as efficiency combined with aesthetic appeal.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值