|
2dnf2ss4ta464018790212.gif
l: J" J m6 t" ~* |6 W
点击上方蓝色字体,关注我们
2 o3 E" I/ L% m3 G. i. r9 P1
5 v. r% b$ W; U* V: t4 A$ D1 fPosition layout1 T' W- H g6 R1 P6 a: X/ P
在PositionLayout中,子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角,当向下或向右移动时,坐标值变大;允许组件之间互相重叠。
6 m8 q0 }3 t( V5 l X# P3 F
9 \" \1 ~/ q% h: W8 vPositionLayout示意图:: ?( Y; m5 K. C1 t
1 G3 y' ?& V8 ~% O( x. a1 ~8 Y2 y
gxpyia4vgzz64018790313.png
( {& ]% U6 ?* O3 `
6 F0 I- q. C/ lPositionLayout以坐标的形式控制组件的显示位置,允许组件相互重叠。
% B7 Q# N- L$ u2 E在layout目录下的XML文件中创建PositionLayout并添加多个组件,并通过position_x和position_y属性设置子组件的坐标。( E- S, U' D% Q! a3 i! t
使用PositionLayout的布局效果:
, s' k& o+ L8 M) H
. J/ Z6 q. P3 [$ d1 Q
r3qxhdeq0sd64018790413.png
$ z2 G T1 l& c4 q: {
# x% F7 c/ n- a/ `8 `5 `8 @示例代码:
, {* u; x0 t* I8 d) t* }: n/ E
3 X7 w- q* P: S& a/ S2 cxmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:id="$+id:position" ohos:height="match_parent" ohos:width="300vp" ohos:background_element="#3387CEFA">( \# U! C; H- M
ohos:id="$+id:position_text_1" ohos:height="50vp" ohos:width="200vp" ohos:background_element="#9987CEFA" ohos:position_x="50vp" ohos:position_y="8vp" ohos:text="Title" ohos:text_alignment="center" ohos:text_size="20fp"/>
' t" k! Q+ S$ _8 J8 z9 P1 D ohos:id="$+id:position_text_2" ohos:height="200vp" ohos:width="200vp" ohos:background_element="#9987CEFA" ohos:position_x="8vp" ohos:position_y="64vp" ohos:text="Content" ohos:text_alignment="center" ohos:text_size="20fp"/>& P7 j7 I3 K9 v) T
ohos:id="$+id:position_text_3" ohos:height="200vp" ohos:width="200vp" ohos:background_element="#9987CEFA" ohos:position_x="92vp" ohos:position_y="188vp" ohos:text="Content" ohos:text_alignment="center" ohos:text_size="20fp"/>3 w; y% W: \. s$ q/ Q; p' w* ]
3 y4 \! r: `. s$ u
设置子组件的坐标时(position_x和position_y属性),除了上述示例中的XML方式,还可以在对应的AbilitySlice中通过setPosition(int x, int y)接口设置,Java示例代码如下:
% u0 P& {' q; r$ I6 g7 `& x1 `, S( Q3 ^7 j) q
Text title = (Text)findComponentById(ResourceTable.Id_position_text_1); Text content1 = (Text)findComponentById(ResourceTable.Id_position_text_2); Text content2 = (Text)findComponentById(ResourceTable.Id_position_text_3);
' I* d8 G8 Q* Y/ f' x1 V' P title.setPosition(vp2px(50), vp2px(8)); content1.setPosition(vp2px(8), vp2px(64)); content2.setPosition(vp2px(92), vp2px(188));" ]1 z/ F: d4 j5 K- n
单位转换的方法如下:
% p& O, {. r" f! @ n7 f( B( K7 T+ U3 Q( a# P2 ]( h. \
private int vp2px(float vp){ return AttrHelper.vp2px(vp,this); }0 j9 g0 i1 O' k5 Z# I1 X% F, E/ I
对于超过布局本身大小的组件,超出部分将不显示。
) J. j: [. ~# HRight组件右侧超出部分将不显示:
! O/ j' h% g# C
% G9 |& V8 U& e8 C
n4sytoehlfq64018790513.png
7 r: Q/ j5 u! D! u
0 E. E, k. G& ]& K) ^+ c$ J: W6 B示例代码:+ \1 C4 ~: g& q' H( F
$ Y" d# ~! S' t- d5 m( w9 k1 Q
...>- M$ T; h9 s9 m3 P z4 ^; B
...
, c. T1 J6 P7 o; Y ohos:id="$+id:position_text_4" ohos:height="120vp" ohos:width="120vp" ohos:background_element="#9987CEFA" ohos:position_x="212vp" ohos:position_y="64vp" ohos:text="Right" ohos:text_alignment="center" ohos:text_size="20fp"/>& L% ?0 Z# \8 D; ? j# i2 ~
23 E3 e3 u* c G# d6 B3 Y" l, {0 t
AdaptiveBox Layout
$ [+ T8 r# \$ TAdaptiveBox Layout是自适应盒子布局,该布局提供了在不同屏幕尺寸设备上的自适应布局能力,主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自动调整列数的场景。$ O. K8 i% _" c! O, n$ {% ?
& k; F' h9 V2 d# D9 b- K
该布局中的每个子组件都用一个单独的“盒子”装起来,子组件设置的布局参数都是以盒子作为父布局生效,不以整个自适应布局为生效范围。/ u& @. _+ p2 b9 Q- P$ y% R) r
该布局中每个盒子的宽度固定为布局总宽度除以自适应得到的列数,高度为match_content,每一行中的所有盒子按高度最高的进行对齐。* s% S1 n; C& ~$ I. P. e5 O
该布局水平方向是自动分块,因此水平方向不支持match_content,布局水平宽度仅支持match_parent或固定宽度。- @8 v" R3 u/ s) _# i+ z
自适应仅在水平方向进行了自动分块,纵向没有做限制,因此如果某个子组件的高设置为match_parent类型,可能导致后续行无法显示。5 m6 k$ M6 i: O7 X0 w! M
AdaptiveBox Layout示意图:
% `+ p; o4 Z% x2 K F+ r0 Q
$ ~* h8 r; d! Z3 f& J# t) m! I
pjl0xcb1q1364018790613.jpg
" d6 f' ~2 p/ U' E4 H1 g" K/ U/ ~8 K# S8 m' |1 B( l
AdaptiveBox Layout布局常用方法如下:
) v/ `* [8 s5 C2 y8 Y. y9 H- N
, N5 c3 D( I! g: _
l, E e! l) P 方法/ |7 r, [9 Z: m0 h5 ]1 [2 F
| 6 p" U1 s$ f/ X2 j4 z0 f& Q
功能
( l$ E! v( I* E( g9 y: ] |
) `% r: `0 A7 w addAdaptiveRule(int minWidth, int maxWidth, int columns)+ O& c- a8 C3 {7 y8 \3 O
|
; e0 ^: J! L! p/ P 添加一个自适应盒子布局规则。* O. f, m; A4 Z, Q( J8 U) B% [0 m6 @
| / v5 e; f" D: \7 I( z
removeAdaptiveRule(int minWidth, int maxWidth, int columns)# n0 c2 k3 _0 ~! U3 H: o$ R1 s
|
4 d4 a9 Z0 {. Y4 K# R+ O& z 移除一个自适应盒子布局规则。
0 D5 C0 a* R/ e* ? |
! q. F/ N( a4 k$ ? clearAdaptiveRules(), n" S7 J" M& }/ j( m8 \+ Z* s
|
+ C$ j+ N7 }& M% j 移除所有自适应盒子布局规则。
E' q7 [( p! ]% b* F/ m | ; @7 r3 p$ E, f' B; N5 ^
在AdaptiveBox Layout中添加和删除自适应盒子布局规则的效果对比如下。
# Q7 r7 z& c6 P4 i0 A9 t+ k+ C2 F+ k0 g! M" a1 l0 V
gkvnu5ktcei64018790713.gif
1 b* m9 |) T, |! }
8 S6 C$ k6 D6 R1 M( S% n+ kXML布局示例代码:* ^. m L) K& K+ N
' p& N2 [$ l1 u; E
xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical">2 W4 b; h# m3 v0 J N+ z
xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="0vp" ohos:width="match_parent" ohos:weight="1" ohos:id="$+id:adaptive_box_layout">- y# [1 N5 h& M4 o" ]
$ U/ g. ~& p' H2 g- g
Java关键代码:! i6 x/ `' \$ ^
( |0 s* @7 |+ V0 \* X0 q9 fAdaptiveBoxLayout adaptiveBoxLayout = (AdaptiveBoxLayout)findComponentById(ResourceTable.Id_adaptive_box_layout);
; C! ^! ?5 m9 U7 S8 q2 ^( T3 XfindComponentById(ResourceTable.Id_add_rule_btn).setClickedListener((component-> { // 添加规则 adaptiveBoxLayout.addAdaptiveRule(100, 2000, 3); // 更新布局 adaptiveBoxLayout.postLayout();}));% V, h5 k v7 A
findComponentById(ResourceTable.Id_remove_rule_btn).setClickedListener((component-> { // 移除规则 adaptiveBoxLayout.removeAdaptiveRule(100, 2000, 3); // 更新布局 adaptiveBoxLayout.postLayout();}));( p+ u3 J0 b) A$ d0 H: K( F
5 ?8 \; v7 V. i: G# Q8 x z
zjd3pncry4p64018790813.png
+ V# @/ X, V7 l$ T; ^往期推荐HarmonyOS学习路之开发篇—Java UI框架(六大布局开发)
8 ^7 U7 o# _. u1 s2 P) K: W8 x鸿蒙OS制作小游戏:数字华容道(自定义组件踩坑记录)% ?8 k9 X9 k5 y6 q) e s
HarmonyOS学习路之开发篇—Java UI框架(组件与布局说明)9 X, l3 p- |' g
HarmonyOS实战—服务卡片初体验: ^1 ~# U) u! U: c- ]
1 K. D/ \2 @+ U
mmmjolywxbn64018790913.jpg
* A! E$ X0 M" v* R- S3 Q2 B
oq23hsjdckf64018791013.gif
1 ]0 x$ `& T0 M) x7 ] v点击阅读原文,更精彩~ |
|