電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 33|回復(fù): 0
收起左側(cè)

HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(Position和AdaptiveBox Layout)

[復(fù)制鏈接]

601

主題

601

帖子

4762

積分

四級(jí)會(huì)員

Rank: 4

積分
4762
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-7-31 12:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

( ]  M( ~3 t7 _! p1 ~8 N: u點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
4 @8 b! \$ o% Y+ r1
2 o0 W7 r3 |9 ~/ P# }7 x! ePosition layout$ E9 B% J" z( P
在PositionLayout中,子組件通過指定準(zhǔn)確的x/y坐標(biāo)值在屏幕上顯示。(0, 0)為左上角,當(dāng)向下或向右移動(dòng)時(shí),坐標(biāo)值變大;允許組件之間互相重疊。% w+ [2 r. G- m/ o. s, ]

- q: q1 {. }. @9 A8 zPositionLayout示意圖:- K6 X3 J( b0 ~# G1 a: F

/ s0 Z) H0 {+ E, T ; m& T  |6 k! D% v
7 [$ e) }+ @5 r5 a9 [" A7 x& j7 A
PositionLayout以坐標(biāo)的形式控制組件的顯示位置,允許組件相互重疊。: t7 I6 t2 {& m+ Q1 ^7 t
在layout目錄下的XML文件中創(chuàng)建PositionLayout并添加多個(gè)組件,并通過position_x和position_y屬性設(shè)置子組件的坐標(biāo)。# D, H  J5 d* Y3 O: d8 }* g
使用PositionLayout的布局效果:
* e5 f9 b% c% y9 Y6 c! }: F  s* ^! n) l- F

1 v" x% v, k3 X
8 p7 Z0 I4 b: Q# }8 n2 y7 ~7 t示例代碼:
) J6 o) O4 w1 N0 F1 Y, q: r$ ~
+ Q$ j6 W! c9 }& B
  • xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:id="$+id:position"    ohos:height="match_parent"    ohos:width="300vp"    ohos:background_element="#3387CEFA">
    & Q. ?, s; Z" O2 y    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"/>/ R4 U. c: e% P- f8 v
        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"/>' r5 S' E( b! n$ z
        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"/>
    $ x0 \3 ], v- A& e2 u! f. p' g( c) n
    設(shè)置子組件的坐標(biāo)時(shí)(position_x和position_y屬性),除了上述示例中的XML方式,還可以在對(duì)應(yīng)的AbilitySlice中通過setPosition(int x, int y)接口設(shè)置,Java示例代碼如下:
    2 a8 ^; W/ b. |1 Z' U' U& D
    + Y$ E4 k7 N% N( g4 S
  • 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);
    ) t6 c8 w) [5 T2 V* b" k+ w        title.setPosition(vp2px(50), vp2px(8));        content1.setPosition(vp2px(8), vp2px(64));        content2.setPosition(vp2px(92), vp2px(188));
    - d6 V5 @' N& P* C1 Y) d3 d% O# B) \單位轉(zhuǎn)換的方法如下:
    % H8 u0 }# m- z, I& n/ z
    9 c$ d; |, D. y8 K" h, |3 i
  • private int vp2px(float vp){        return AttrHelper.vp2px(vp,this);    }: a" Z7 O; n7 Q$ o! k
    對(duì)于超過布局本身大小的組件,超出部分將不顯示。
    & V$ _( I2 S" Q* M( M0 KRight組件右側(cè)超出部分將不顯示:
    . o, A$ k- C5 l3 v) i# R! n  x2 y' j+ a/ \3 y  q

    * @" C2 r. x1 h
    + [; e6 \$ a- _% ]示例代碼:. h. A# m2 _- \/ Y; V
    3 s/ r' w2 u4 o% m9 L/ g8 \
  • ...>
    " X2 ~: R2 X" ~& M" _5 ]% j( ~* a, [    ...
    7 h3 K! p) `6 B0 {  b    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& q$ e! V( t
    2
    5 D2 I+ l1 x7 s1 y1 U9 lAdaptiveBox Layout
    1 L: S; D, n2 C, N! oAdaptiveBox Layout是自適應(yīng)盒子布局,該布局提供了在不同屏幕尺寸設(shè)備上的自適應(yīng)布局能力,主要用于相同級(jí)別的多個(gè)組件需要在不同屏幕尺寸設(shè)備上自動(dòng)調(diào)整列數(shù)的場(chǎng)景。' m* I: j! Q. r! ^0 |, c

    6 {! u* K# b1 s# T  Z該布局中的每個(gè)子組件都用一個(gè)單獨(dú)的“盒子”裝起來,子組件設(shè)置的布局參數(shù)都是以盒子作為父布局生效,不以整個(gè)自適應(yīng)布局為生效范圍。
    $ e, x+ ^& @  A* C: R7 @+ z2 ^該布局中每個(gè)盒子的寬度固定為布局總寬度除以自適應(yīng)得到的列數(shù),高度為match_content,每一行中的所有盒子按高度最高的進(jìn)行對(duì)齊。3 g/ @( a( K3 _# k- c
    該布局水平方向是自動(dòng)分塊,因此水平方向不支持match_content,布局水平寬度僅支持match_parent或固定寬度。
    ' t! ]8 m4 ]* t/ o自適應(yīng)僅在水平方向進(jìn)行了自動(dòng)分塊,縱向沒有做限制,因此如果某個(gè)子組件的高設(shè)置為match_parent類型,可能導(dǎo)致后續(xù)行無法顯示。
      A. O0 j8 j% s! h6 H6 \' U/ FAdaptiveBox Layout示意圖:
      ]& _+ ^, k8 @) _$ v; `- b7 q( W/ Q8 X' n7 u7 v

    - O$ i! B" f( I/ V+ ]$ e9 _) G# H8 H7 \5 \  q! \! k. f' Q
    AdaptiveBox Layout布局常用方法如下:
    5 H2 b/ J) y% i. S7 M7 z! \, n! Y  |8 l' C" c

    6 O( g4 r2 m2 g. H' c9 b                        方法/ e( ?8 S9 l) M& C
                           

    + M7 o; Q9 O7 L9 V" O& _2 B7 D                        功能
    2 H/ d: T, T  X5 Q  O. \. U) `                       

      H/ N- d2 a$ M0 {+ H! Z                        addAdaptiveRule(int minWidth, int maxWidth, int columns)+ G& b8 j, |( Q8 |: }& M
                           

    * q. K; e" j1 u" F) C9 R3 E                        添加一個(gè)自適應(yīng)盒子布局規(guī)則。
    6 @, G5 \  u& @! C$ H                       

    3 S: |' Q- S! r/ V$ b                        removeAdaptiveRule(int minWidth, int maxWidth, int columns)8 E  H" f& X# M( c
                           

    & P" |' K) b0 q0 [( Z* G                        移除一個(gè)自適應(yīng)盒子布局規(guī)則。
    . ^2 O( E6 s' `$ P4 H1 H. l. |" ^                       
    * C5 R8 B, s! }5 q7 c1 r$ T
                            clearAdaptiveRules()
    $ G0 {# g' Y& O                       

    2 }8 u& A  p! @8 ?5 W                        移除所有自適應(yīng)盒子布局規(guī)則。
    # `- N0 ?2 y! b: c) |# S                       

    & r7 \# A7 l) v" o& V  Z& O8 h在AdaptiveBox Layout中添加和刪除自適應(yīng)盒子布局規(guī)則的效果對(duì)比如下。6 a  {" ~, H! I( y0 R

    ! k5 e4 c3 E% o- W* Z. C2 n
    3 r# L- V1 C6 o  a3 Z! r' w
    9 K1 ~8 m& w. n: \8 p( |* p; y; MXML布局示例代碼:
    4 q$ j6 @% \: W) Y4 s! Q, P' W" {4 ^' g! I5 ?3 ]! X! ^
  • xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">
    * F; ~% }8 t: C5 o1 b    xmlns:ohos="http://schemas.huawei.com/res/ohos"        ohos:height="0vp"        ohos:width="match_parent"        ohos:weight="1"        ohos:id="$+id:adaptive_box_layout">0 H0 e0 S+ ]: [6 j# }! X
            
    - X* ~3 D% k) f0 D. r2 K' ~Java關(guān)鍵代碼:
    ) ^! x( M' Q  y1 T3 F9 y! n3 K; G) j
  • AdaptiveBoxLayout adaptiveBoxLayout = (AdaptiveBoxLayout)findComponentById(ResourceTable.Id_adaptive_box_layout);
    8 Q$ K& ^) y; V/ D2 \! K$ yfindComponentById(ResourceTable.Id_add_rule_btn).setClickedListener((component-> {    // 添加規(guī)則    adaptiveBoxLayout.addAdaptiveRule(100, 2000, 3);    // 更新布局    adaptiveBoxLayout.postLayout();}));+ }0 x8 }4 {- R2 w
    findComponentById(ResourceTable.Id_remove_rule_btn).setClickedListener((component-> {    // 移除規(guī)則    adaptiveBoxLayout.removeAdaptiveRule(100, 2000, 3);    // 更新布局    adaptiveBoxLayout.postLayout();}));
    : ?/ Y/ D2 [8 p$ x1 k
    : c! ^. u* n' H' E  _
    9 @7 b7 [6 }9 m' h- V往期推薦HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(六大布局開發(fā))
    0 [+ C9 G: U! g, s1 s鴻蒙OS制作小游戲:數(shù)字華容道(自定義組件踩坑記錄)
    ' R" C* C( S' _* g8 f& q7 R; w' c- NHarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(組件與布局說明)/ ~1 {5 j0 a  [0 {9 O3 O& N+ M3 R
    HarmonyOS實(shí)戰(zhàn)—服務(wù)卡片初體驗(yàn)
      H8 ~: u( u. ]# m2 I4 _6 L! d

    ; N8 o; Q, q. q' I8 r7 Z% X 4 \9 p+ k2 X+ Q9 u4 W

    0 s9 b5 d- A! A2 H5 v- G; p點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表