自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Selector在HarmonyOS中的使用

開發(fā) OpenHarmony
文章由鴻蒙社區(qū)產出,想要了解更多內容請前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術社區(qū)https://harmonyos.51cto.com

[[389418]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

Selector其實就是一組狀態(tài)列表(StateList),可以將不同的狀態(tài)關聯(lián)不同的效果,主要用于設置控件背景和字體顏色等??丶还灿?種狀態(tài),常用的有:空狀態(tài)empty,按下狀態(tài)pressed,獲取焦點focused,勾選狀態(tài)checked,不可用狀態(tài)disable。

鴻蒙中selector效果可以通過xml的state-container標簽或者在代碼中使用StateElement來實現(xiàn),下面以button的背景選擇器舉例說明:

  1. // 表示當前控件處于被勾選狀態(tài)(check狀態(tài)),如控件Checkbox 
  2. public static final int COMPONENT_STATE_CHECKED = 64; 
  3. // 表示當前控件處于不可用狀態(tài),如Button的setEnabled為false 
  4. public static final int COMPONENT_STATE_DISABLED = 32; 
  5. // 初始狀態(tài) 
  6. public static final int COMPONENT_STATE_EMPTY = 0; 
  7. // 表示當前控件處于獲取焦點的狀態(tài),如TextField被點擊輸入文字時 
  8. public static final int COMPONENT_STATE_FOCUSED = 2; 
  9. // 表示光標移動到當前控件上的狀態(tài) 
  10. public static final int COMPONENT_STATE_HOVERED = 268435456; 
  11. // 當用戶點擊或者觸摸該控件的狀態(tài),如Button點擊 
  12. public static final int COMPONENT_STATE_PRESSED = 16384; 
  13. // 表示控件被選擇地狀態(tài),比如一個ListContainer獲得焦點(focus),而用方向鍵選擇了其中一個item(selecter) 
  14. public static final int COMPONENT_STATE_SELECTED = 4; 

實現(xiàn)以及使用:

1創(chuàng)建selector.xml

在resources/base/graphic自定義 shape,定義不同狀態(tài)的背景,然后將多個shape組合配置到state-container中生成一個新的selector_button.xml文件,提供給控件使用。

定義空狀態(tài)下的shape背景生成background_btn_empty.xml,其他狀態(tài)類似:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <shape 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:shape="rectangle"
  5.  
  6.     <corners ohos:radius="5vp"/> 
  7.  
  8.     <solid ohos:color="#0000ff"/> 
  9. </shape> 

定義按下狀態(tài)下的背景生成background_btn_pressed.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <shape 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:shape="rectangle"
  5.  
  6.     <corners ohos:radius="5vp"/> 
  7.  
  8.     <solid 
  9.         ohos:color="#FF0000"/> 
  10. </shape> 

創(chuàng)建selector_button.xml,在ohos:element字段中配置shape背景, ohos:state配置控件狀態(tài):

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <state-container 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.  
  5.     <item 
  6.         ohos:element="$graphic:background_btn_disabled" 
  7.         ohos:state="component_state_disabled"/> 
  8.  
  9.     <item 
  10.         ohos:element="$graphic:background_btn_pressed" 
  11.         ohos:state="component_state_pressed"/> 
  12.  
  13.     <item 
  14.         ohos:element="$graphic:background_btn_empty" 
  15.         ohos:state="component_state_empty"/> 
  16.  
  17. </state-container> 

也可以直接使用顏色:

  1. <state-container 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3.  
  4.     <item 
  5.         ohos:element="#ff0000" 
  6.         ohos:state="component_state_disabled"/> 
  7.  
  8.     <item 
  9.         ohos:element="#00ff00" 
  10.         ohos:state="component_state_pressed"/> 
  11.  
  12.     <item 
  13.         ohos:element="#0000ff" 
  14.         ohos:state="component_state_empty"/> 
  15.  
  16. </state-container> 

2控件中使用

設置控件的背景background_element為狀態(tài)選擇器,并在狀態(tài)選擇器中按需添加不同的狀態(tài)和不同的狀態(tài)下的背景:

  1. <Button 
  2.     ohos:height="match_content" 
  3.     ohos:width="match_content" 
  4.     ohos:background_element="$graphic:selector_button" 
  5.     ohos:layout_alignment="horizontal_center" 
  6.     ohos:margin="5vp" 
  7.     ohos:text="Button xml" 
  8.     ohos:text_size="50" 
  9.     /> 

3代碼中使用

新建不同的狀態(tài)下的ShapeElement后將其添加到State Element中,并將需要設置狀態(tài)選擇器的部分設置為添加了狀態(tài)的StateElement,如Button的setBackground、Checkbox的setButtonElement,設置之后相關的控件就會有狀態(tài)選擇器的效果。

3.1 Button

  1. /** 
  2.  * 添加一個Button 
  3.  */ 
  4. private void initButton() { 
  5.     // Button在presses狀態(tài)的element 
  6.     ShapeElement elementButtonPressed = new ShapeElement(); 
  7.     elementButtonPressed.setRgbColor(RgbPalette.RED); 
  8.     elementButtonPressed.setShape(ShapeElement.RECTANGLE); 
  9.     elementButtonPressed.setCornerRadius(10); 
  10.     // Button在Disabled狀態(tài)下的element 
  11.     ShapeElement elementButtonDisable = new ShapeElement(); 
  12.     elementButtonDisable.setRgbColor(RgbPalette.GREEN); 
  13.     elementButtonDisable.setShape(ShapeElement.RECTANGLE); 
  14.     elementButtonDisable.setCornerRadius(10); 
  15.     // Button在Empty狀態(tài)下的element 
  16.     ShapeElement elementButtonEmpty = new ShapeElement(); 
  17.     elementButtonEmpty.setRgbColor(RgbPalette.BLUE); 
  18.     elementButtonEmpty.setShape(ShapeElement.RECTANGLE); 
  19.     elementButtonEmpty.setCornerRadius(10); 
  20.     // Button在Hoveered狀態(tài)下的element 
  21.     ShapeElement elementButtonHovered = new ShapeElement(); 
  22.     elementButtonHovered.setRgbColor(RgbPalette.GRAY); 
  23.     elementButtonHovered.setShape(ShapeElement.RECTANGLE); 
  24.     elementButtonHovered.setCornerRadius(10); 
  25.     // 將各種狀態(tài)下不同的背景添加到StateElement中 
  26.     StateElement stateElement = new StateElement(); 
  27.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementButtonPressed); 
  28.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementButtonDisable); 
  29.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_HOVERED}, elementButtonHovered); 
  30.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementButtonEmpty); 
  31.  
  32.     // 新建一個button并將其添加到布局中 
  33.     Button button = new Button(this); 
  34.     button.setMarginTop(20); 
  35.     button.setText("Button"); 
  36.     button.setTextSize(50); 
  37.     // 設置按鈕的狀態(tài),若為false,則表示狀態(tài)為COMPONENT_STATE_DISABLED 
  38.     // button.setEnabled(false); 
  39.     button.setBackground(stateElement); 
  40.     DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig( 
  41.             ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT); 
  42.     layoutConfig.alignment = LayoutAlignment.CENTER; 
  43.     layoutConfig.setMargins(20, 20, 20, 20); 
  44.     button.setLayoutConfig(layoutConfig); 
  45.     dlSelector.addComponent(button); 

3.2 TextField

  1. /** 
  2.  * 添加一個TextField 
  3.  */ 
  4. private void initTextField() { 
  5.     // TextField在presses狀態(tài)的element 
  6.     ShapeElement elementTextFieldPressed = new ShapeElement(); 
  7.     elementTextFieldPressed.setRgbColor(RgbPalette.RED); 
  8.     elementTextFieldPressed.setShape(ShapeElement.RECTANGLE); 
  9.     elementTextFieldPressed.setCornerRadius(10); 
  10.     // TextField在Disabled狀態(tài)下的element 
  11.     ShapeElement elementTextFieldDisable = new ShapeElement(); 
  12.     elementTextFieldDisable.setRgbColor(RgbPalette.GRAY); 
  13.     elementTextFieldDisable.setShape(ShapeElement.RECTANGLE); 
  14.     elementTextFieldDisable.setCornerRadius(10); 
  15.     // TextField在Empty狀態(tài)下的element 
  16.     ShapeElement elementTextFieldEmpty = new ShapeElement(); 
  17.     elementTextFieldEmpty.setRgbColor(RgbPalette.BLUE); 
  18.     elementTextFieldEmpty.setShape(ShapeElement.RECTANGLE); 
  19.     elementTextFieldEmpty.setCornerRadius(10); 
  20.     // TextField在Focused狀態(tài)下的element 
  21.     ShapeElement elementTextFieldFocused = new ShapeElement(); 
  22.     elementTextFieldFocused.setRgbColor(RgbPalette.GREEN); 
  23.     elementTextFieldFocused.setShape(ShapeElement.RECTANGLE); 
  24.     elementTextFieldFocused.setCornerRadius(10); 
  25.     //將各種狀態(tài)下不同的背景添加到StateElement中 
  26.     StateElement stateElement = new StateElement(); 
  27.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementTextFieldPressed); 
  28.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementTextFieldDisable); 
  29.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_FOCUSED}, elementTextFieldFocused); 
  30.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementTextFieldEmpty); 
  31.  
  32.     //新建一個TextField并將其添加到布局中 
  33.     TextField textField = new TextField(this); 
  34.     textField.setText("TextField"); 
  35.     textField.setTextSize(50); 
  36.     // 設置textfield的狀態(tài),若為false,則表示狀態(tài)為COMPONENT_STATE_DISABLED 
  37.     // textField.setEnabled(false); 
  38.     textField.setBackground(stateElement); 
  39.     DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig( 
  40.             ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT); 
  41.     layoutConfig.alignment = LayoutAlignment.CENTER; 
  42.     layoutConfig.setMargins(20, 20, 20, 20); 
  43.     textField.setLayoutConfig(layoutConfig); 
  44.     dlSelector.addComponent(textField); 

3.3 Checkbox

  1. /** 
  2.  * 添加一個Checkbox 
  3.  */ 
  4. private void initCheckbox() { 
  5.     // Checkbox在presses狀態(tài)的element 
  6.     ShapeElement elementCheckboxPressed = new ShapeElement(); 
  7.     elementCheckboxPressed.setRgbColor(RgbPalette.RED); 
  8.     elementCheckboxPressed.setShape(ShapeElement.RECTANGLE); 
  9.     elementCheckboxPressed.setCornerRadius(10); 
  10.     // Checkbox在Disabled狀態(tài)下的element 
  11.     ShapeElement elementCheckboxDisable = new ShapeElement(); 
  12.     elementCheckboxDisable.setRgbColor(RgbPalette.GREEN); 
  13.     elementCheckboxDisable.setShape(ShapeElement.RECTANGLE); 
  14.     elementCheckboxDisable.setCornerRadius(10); 
  15.     // Checkbox在Empty狀態(tài)下的element 
  16.     ShapeElement elementCheckboxEmpty = new ShapeElement(); 
  17.     elementCheckboxEmpty.setRgbColor(RgbPalette.BLUE); 
  18.     elementCheckboxEmpty.setShape(ShapeElement.RECTANGLE); 
  19.     elementCheckboxEmpty.setCornerRadius(10); 
  20.     // Checkbox在Checked狀態(tài)下的element 
  21.     ShapeElement elementCheckboxChecked = new ShapeElement(); 
  22.     elementCheckboxChecked.setRgbColor(RgbPalette.GRAY); 
  23.     elementCheckboxChecked.setShape(ShapeElement.RECTANGLE); 
  24.     elementCheckboxChecked.setCornerRadius(10); 
  25.     //將各種狀態(tài)下不同的背景添加到StateElement中 
  26.     StateElement stateElement = new StateElement(); 
  27.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementCheckboxPressed); 
  28.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementCheckboxDisable); 
  29.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_CHECKED}, elementCheckboxChecked); 
  30.     stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementCheckboxEmpty); 
  31.  
  32.     //新建一個button并將其添加到布局中 
  33.     Checkbox checkbox = new Checkbox(this); 
  34.     checkbox.setText("Checkbox"); 
  35.     checkbox.setTextSize(50); 
  36.     // 設置按鈕的狀態(tài),若為false,則表示狀態(tài)為COMPONENT_STATE_DISABLED 
  37.     // checkbox.setEnabled(false); 
  38.     checkbox.setButtonElement(stateElement); 
  39.     // checkbox點擊也會有狀態(tài)變化 
  40.     // checkbox.setBackground(stateElement); 
  41.     DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig( 
  42.             ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT); 
  43.     layoutConfig.alignment = LayoutAlignment.CENTER; 
  44.     layoutConfig.setMargins(20, 20, 20, 20); 
  45.     checkbox.setLayoutConfig(layoutConfig); 
  46.     dlSelector.addComponent(checkbox); 

本文作者:Zhang Heng 來自鴻蒙三方庫聯(lián)合特戰(zhàn)隊

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2011-06-01 14:20:06

Android Selector

2022-02-22 08:00:48

JavaNIOBuffer

2010-08-31 19:42:21

DHCPdhcpd

2011-06-16 14:08:20

JSONAjax

2018-12-24 12:40:03

大數(shù)據IT互聯(lián)網

2023-11-05 12:20:10

匿名函數(shù)Golang

2009-06-04 20:36:03

CheckStyle的Eclipse中的集成

2016-06-02 15:10:12

SwiftSelector

2022-01-06 09:55:19

鴻蒙HarmonyOS應用

2025-02-28 09:14:09

JavaNIO機制

2010-12-27 15:45:34

Exchange 20

2011-06-15 15:16:54

Session

2010-06-21 13:52:20

AODV路由協(xié)議

2019-12-03 10:00:19

awkLinux循環(huán)

2010-07-27 12:28:56

Flex Remote

2010-03-11 15:39:01

Python編程語言

2010-03-10 11:11:16

Python編程

2023-09-26 22:37:16

C++const

2009-01-16 13:17:16

AjaxASP.NET.NET

2009-12-28 16:55:25

點贊
收藏

51CTO技術棧公眾號