電子產業(yè)一站式賦能平臺

PCB聯盟網

搜索
查看: 139|回復: 0
收起左側

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

[復制鏈接]

394

主題

394

帖子

2197

積分

三級會員

Rank: 3Rank: 3

積分
2197
跳轉到指定樓層
樓主
發(fā)表于 2023-7-31 12:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
. D1 Q$ |% ?6 D- e
點擊上方藍色字體,關注我們
: E. ]: R# Z! X! ^* Y1
8 M, F8 |/ N: V' T* _( CPosition layout& B7 |7 A" s, `4 B
在PositionLayout中,子組件通過指定準確的x/y坐標值在屏幕上顯示。(0, 0)為左上角,當向下或向右移動時,坐標值變大;允許組件之間互相重疊。
3 l4 j7 j9 {" Y, z! E; u- F' h" c" |! a" t- R/ C8 f8 W
PositionLayout示意圖:: c; _0 J5 {9 ^/ T: a3 w% S5 |
% p5 O$ @3 ]* t, q4 L) R! I

  {. W+ V) O) `# w) H2 r9 E% A7 d* R3 ~% W+ S* E3 P2 \
PositionLayout以坐標的形式控制組件的顯示位置,允許組件相互重疊。' f8 b; O' X0 s
在layout目錄下的XML文件中創(chuàng)建PositionLayout并添加多個組件,并通過position_x和position_y屬性設置子組件的坐標。$ X: x. q+ ~& n8 `6 q
使用PositionLayout的布局效果:
7 \: K( A7 @' v" F* ^. g& P
, R3 }7 O5 v0 w" N: O* E0 n
% `* d& @6 X+ G# e1 p
4 A- h- l  q" o9 C9 L& V+ ?* J示例代碼:
( B+ F9 [  x+ F- l3 C/ g! ~  ^3 @/ S% `4 O. _6 G7 J
  • xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:id="$+id:position"    ohos:height="match_parent"    ohos:width="300vp"    ohos:background_element="#3387CEFA">
    2 O% s9 h# ]% q% d8 A    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"/>
    9 A9 n/ C2 Y- y2 n! _6 C9 ?    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"/>
    ) K" U! k0 J$ ?  {4 V    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"/>5 [/ |9 u+ C3 z+ {  v6 F7 ]3 Y
    ' r0 \+ y9 p/ e
    設置子組件的坐標時(position_x和position_y屬性),除了上述示例中的XML方式,還可以在對應的AbilitySlice中通過setPosition(int x, int y)接口設置,Java示例代碼如下:3 V4 j1 k, v3 n) `+ ]. [

    % B" g7 J3 U+ E6 I; b' U6 M0 z( n
  • 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);& J. p$ W7 B- U
            title.setPosition(vp2px(50), vp2px(8));        content1.setPosition(vp2px(8), vp2px(64));        content2.setPosition(vp2px(92), vp2px(188));% Y0 i1 [; C5 F* {
    單位轉換的方法如下:: c  e( |, E& D
    6 }  c* Z7 P1 W
  • private int vp2px(float vp){        return AttrHelper.vp2px(vp,this);    }
    % x" k" r, M1 ]2 L對于超過布局本身大小的組件,超出部分將不顯示。* V& e! G1 F+ e; T0 G, G
    Right組件右側超出部分將不顯示:
    7 _2 q+ `3 l8 |! h# M! Q; ~9 N- i
    - t' p3 ?# x! `5 z! s# v
    + \. @/ a) |0 T8 {" o; k7 ^
    示例代碼:! T6 _6 Y9 z% J6 @% u! n
    " o4 i& b5 Z6 t  s, f  J
  • ...>% s  W" \. c# g  x- w" d( U9 v
        ...
    : h7 K% D$ C% a    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"/># ~" V# v; ~# n  a
    2
    6 r( u5 q2 j( n: ~. f1 Q. eAdaptiveBox Layout
    1 }: o2 x4 ^' F* rAdaptiveBox Layout是自適應盒子布局,該布局提供了在不同屏幕尺寸設備上的自適應布局能力,主要用于相同級別的多個組件需要在不同屏幕尺寸設備上自動調整列數的場景。, V* L) j4 {1 k+ t' L
    * S# u( D4 w) R) M+ {  B3 \
    該布局中的每個子組件都用一個單獨的“盒子”裝起來,子組件設置的布局參數都是以盒子作為父布局生效,不以整個自適應布局為生效范圍。
    + W+ m5 s3 g5 E% G. H8 p該布局中每個盒子的寬度固定為布局總寬度除以自適應得到的列數,高度為match_content,每一行中的所有盒子按高度最高的進行對齊。
    ! |7 E) g7 G! X/ Z: I! J: Z* F該布局水平方向是自動分塊,因此水平方向不支持match_content,布局水平寬度僅支持match_parent或固定寬度。
    9 Q6 I! C' [' b" w9 x自適應僅在水平方向進行了自動分塊,縱向沒有做限制,因此如果某個子組件的高設置為match_parent類型,可能導致后續(xù)行無法顯示。
    ! M. Z- f8 x% ]$ L+ U& i+ `8 i9 CAdaptiveBox Layout示意圖:% X6 w5 N$ D( t

    5 D8 |9 D3 \/ N! h; \% K; y 2 h# C: R  R7 R) d, Y% ]
    7 F" m: E( V" A. T% s7 ~" f) k1 W8 A
    AdaptiveBox Layout布局常用方法如下:5 b) [+ M/ S3 o' q, s. @
    5 h! |2 j5 o) J: V. @2 R/ [3 I/ O

    + L7 [6 i% w, I/ {                        方法8 C$ _7 H8 N3 N1 z! B; J, [: X
                           

    # V( T. A% a) I4 ^1 ?7 P                        功能# x9 E& L$ I2 y# d* B1 E
                           
      a: J2 `+ D0 ^- z& z9 V
                            addAdaptiveRule(int minWidth, int maxWidth, int columns)9 _/ \  q/ n5 o" t2 k* I" u
                           
    " U  T$ G! C0 B, ~
                            添加一個自適應盒子布局規(guī)則。$ P4 D  G. g  }+ V7 M+ _' ?4 Z
                           

    ! S/ c+ k( b% L7 S& x" N. X7 b$ {                        removeAdaptiveRule(int minWidth, int maxWidth, int columns)
    - x$ w* G8 u5 w                       

    . W: t0 N4 o8 j5 M$ D, D                        移除一個自適應盒子布局規(guī)則。
    ' x& E, H& F9 y* e  \8 O                       
    4 W8 i& `8 t! N! `  a5 H
                            clearAdaptiveRules()
    , R6 L" w# v0 v' Z) f! u9 _                       

    0 I6 F; K, b6 v! p                        移除所有自適應盒子布局規(guī)則。
    8 n! m- W. H3 ^$ s$ _# p                       

    , d' d9 ]  Q# I9 ]在AdaptiveBox Layout中添加和刪除自適應盒子布局規(guī)則的效果對比如下。
    5 F5 ]3 A8 b1 Q  r6 P+ ^# v. b! V
    $ u! Y' _% Q* A; G, C # ]* D# n* x" L) Y6 \. k

    " z- C) [' R- E5 [" p$ f; QXML布局示例代碼:
    - [4 i  t+ Y, \* H# q+ `) A  \" z0 o7 w  N
  • xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">" x( {0 B, Y( v  \# N
        xmlns:ohos="http://schemas.huawei.com/res/ohos"        ohos:height="0vp"        ohos:width="match_parent"        ohos:weight="1"        ohos:id="$+id:adaptive_box_layout">! l( E5 t$ F+ G/ X  r: r" Q
            
    - a8 j6 n) \0 l2 c: M$ v% v. r: JJava關鍵代碼:0 G7 \- V2 {' f1 q9 V0 {2 _
    " s1 F. o; ^9 d7 C( ?
  • AdaptiveBoxLayout adaptiveBoxLayout = (AdaptiveBoxLayout)findComponentById(ResourceTable.Id_adaptive_box_layout);
    2 q/ }* i  K) u' @, d# E* |& [findComponentById(ResourceTable.Id_add_rule_btn).setClickedListener((component-> {    // 添加規(guī)則    adaptiveBoxLayout.addAdaptiveRule(100, 2000, 3);    // 更新布局    adaptiveBoxLayout.postLayout();}));0 O* @3 ~/ I5 ?; N, I$ ~
    findComponentById(ResourceTable.Id_remove_rule_btn).setClickedListener((component-> {    // 移除規(guī)則    adaptiveBoxLayout.removeAdaptiveRule(100, 2000, 3);    // 更新布局    adaptiveBoxLayout.postLayout();}));- ~/ z3 m8 i+ l; P' o4 y
    % h  _( S2 V" C

    ; X8 G2 u' w. i0 l$ U往期推薦HarmonyOS學習路之開發(fā)篇—Java UI框架(六大布局開發(fā))
    - \/ v+ y. ~. I6 u! t鴻蒙OS制作小游戲:數字華容道(自定義組件踩坑記錄): O; y' @, ?' E. I1 i& h1 t
    HarmonyOS學習路之開發(fā)篇—Java UI框架(組件與布局說明)
    $ R& p+ d7 K! Q$ V6 THarmonyOS實戰(zhàn)—服務卡片初體驗8 M6 f0 ^0 D* q9 }, y. J% B% S

    ; I8 r% y5 H, t8 b
    7 b9 T! y5 \5 E: `* l( U! ?* V
    & J/ U' ]0 K4 R: w點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯系客服 關注微信 下載APP 返回頂部 返回列表