zoukankan      html  css  js  c++  java
  • Selector在HarmonyOS中的使用

    目录:
    1、创建selector.xml
    2、控件中使用
    3、代码中使用
    4、下载附件

    Selector其实就是一组状态列表(StateList),可以将不同的状态关联不同的效果,主要用于设置控件背景和字体颜色等。控件一共有7种状态,常用的有:空状态empty,按下状态pressed,获取焦点focused,勾选状态checked,不可用状态disable。

    鸿蒙中selector效果可以通过xml的state-container标签或者在代码中使用StateElement来实现,下面以button的背景选择器举例说明:

    // 表示当前控件处于被勾选状态(check状态),如控件Checkbox
    public static final int COMPONENT_STATE_CHECKED = 64;
    // 表示当前控件处于不可用状态,如Button的setEnabled为false
    public static final int COMPONENT_STATE_DISABLED = 32;
    // 初始状态
    public static final int COMPONENT_STATE_EMPTY = 0;
    // 表示当前控件处于获取焦点的状态,如TextField被点击输入文字时
    public static final int COMPONENT_STATE_FOCUSED = 2;
    // 表示光标移动到当前控件上的状态
    public static final int COMPONENT_STATE_HOVERED = 268435456;
    // 当用户点击或者触摸该控件的状态,如Button点击
    public static final int COMPONENT_STATE_PRESSED = 16384;
    // 表示控件被选择地状态,比如一个ListContainer获得焦点(focus),而用方向键选择了其中一个item(selecter)
    public static final int COMPONENT_STATE_SELECTED = 4;
    

    实现以及使用:

    1创建selector.xml

    在resources/base/graphic自定义 shape,定义不同状态的背景,然后将多个shape组合配置到state-container中生成一个新的selector_button.xml文件,提供给控件使用。

    定义空状态下的shape背景生成background_btn_empty.xml,其他状态类似:

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

    定义按下状态下的背景生成background_btn_pressed.xml:

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

    创建selector_button.xml,在ohos:element字段中配置shape背景, ohos:state配置控件状态:

    <?xml version="1.0" encoding="UTF-8" ?>
    <state-container
        xmlns:ohos="http://schemas.huawei.com/res/ohos">
    
        <item
            ohos:element="$graphic:background_btn_disabled"
            ohos:state="component_state_disabled"/>
    
        <item
            ohos:element="$graphic:background_btn_pressed"
            ohos:state="component_state_pressed"/>
    
        <item
            ohos:element="$graphic:background_btn_empty"
            ohos:state="component_state_empty"/>
    
    </state-container>
    

    也可以直接使用颜色:

    <state-container
        xmlns:ohos="http://schemas.huawei.com/res/ohos">
    
        <item
            ohos:element="#ff0000"
            ohos:state="component_state_disabled"/>
    
        <item
            ohos:element="#00ff00"
            ohos:state="component_state_pressed"/>
    
        <item
            ohos:element="#0000ff"
            ohos:state="component_state_empty"/>
    
    </state-container>
    

    2控件中使用

    设置控件的背景background_element为状态选择器,并在状态选择器中按需添加不同的状态和不同的状态下的背景:

    <Button
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:selector_button"
        ohos:layout_alignment="horizontal_center"
        ohos:margin="5vp"
        ohos:text="Button xml"
        ohos:text_size="50"
        />
    

    3代码中使用

    新建不同的状态下的ShapeElement后将其添加到State Element中,并将需要设置状态选择器的部分设置为添加了状态的StateElement,如Button的setBackground、Checkbox的setButtonElement,设置之后相关的控件就会有状态选择器的效果。

    3.1 Button

    /**
     * 添加一个Button
     */
    private void initButton() {
        // Button在presses状态的element
        ShapeElement elementButtonPressed = new ShapeElement();
        elementButtonPressed.setRgbColor(RgbPalette.RED);
        elementButtonPressed.setShape(ShapeElement.RECTANGLE);
        elementButtonPressed.setCornerRadius(10);
        // Button在Disabled状态下的element
        ShapeElement elementButtonDisable = new ShapeElement();
        elementButtonDisable.setRgbColor(RgbPalette.GREEN);
        elementButtonDisable.setShape(ShapeElement.RECTANGLE);
        elementButtonDisable.setCornerRadius(10);
        // Button在Empty状态下的element
        ShapeElement elementButtonEmpty = new ShapeElement();
        elementButtonEmpty.setRgbColor(RgbPalette.BLUE);
        elementButtonEmpty.setShape(ShapeElement.RECTANGLE);
        elementButtonEmpty.setCornerRadius(10);
        // Button在Hoveered状态下的element
        ShapeElement elementButtonHovered = new ShapeElement();
        elementButtonHovered.setRgbColor(RgbPalette.GRAY);
        elementButtonHovered.setShape(ShapeElement.RECTANGLE);
        elementButtonHovered.setCornerRadius(10);
        // 将各种状态下不同的背景添加到StateElement中
        StateElement stateElement = new StateElement();
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementButtonPressed);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementButtonDisable);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_HOVERED}, elementButtonHovered);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementButtonEmpty);
    
        // 新建一个button并将其添加到布局中
        Button button = new Button(this);
        button.setMarginTop(20);
        button.setText("Button");
        button.setTextSize(50);
        // 设置按钮的状态,若为false,则表示状态为COMPONENT_STATE_DISABLED
        // button.setEnabled(false);
        button.setBackground(stateElement);
        DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(
                ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);
        layoutConfig.alignment = LayoutAlignment.CENTER;
        layoutConfig.setMargins(20, 20, 20, 20);
        button.setLayoutConfig(layoutConfig);
        dlSelector.addComponent(button);
    }
    

    3.2 TextField

    /**
     * 添加一个TextField
     */
    private void initTextField() {
        // TextField在presses状态的element
        ShapeElement elementTextFieldPressed = new ShapeElement();
        elementTextFieldPressed.setRgbColor(RgbPalette.RED);
        elementTextFieldPressed.setShape(ShapeElement.RECTANGLE);
        elementTextFieldPressed.setCornerRadius(10);
        // TextField在Disabled状态下的element
        ShapeElement elementTextFieldDisable = new ShapeElement();
        elementTextFieldDisable.setRgbColor(RgbPalette.GRAY);
        elementTextFieldDisable.setShape(ShapeElement.RECTANGLE);
        elementTextFieldDisable.setCornerRadius(10);
        // TextField在Empty状态下的element
        ShapeElement elementTextFieldEmpty = new ShapeElement();
        elementTextFieldEmpty.setRgbColor(RgbPalette.BLUE);
        elementTextFieldEmpty.setShape(ShapeElement.RECTANGLE);
        elementTextFieldEmpty.setCornerRadius(10);
        // TextField在Focused状态下的element
        ShapeElement elementTextFieldFocused = new ShapeElement();
        elementTextFieldFocused.setRgbColor(RgbPalette.GREEN);
        elementTextFieldFocused.setShape(ShapeElement.RECTANGLE);
        elementTextFieldFocused.setCornerRadius(10);
        //将各种状态下不同的背景添加到StateElement中
        StateElement stateElement = new StateElement();
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementTextFieldPressed);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementTextFieldDisable);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_FOCUSED}, elementTextFieldFocused);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementTextFieldEmpty);
    
        //新建一个TextField并将其添加到布局中
        TextField textField = new TextField(this);
        textField.setText("TextField");
        textField.setTextSize(50);
        // 设置textfield的状态,若为false,则表示状态为COMPONENT_STATE_DISABLED
        // textField.setEnabled(false);
        textField.setBackground(stateElement);
        DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(
                ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);
        layoutConfig.alignment = LayoutAlignment.CENTER;
        layoutConfig.setMargins(20, 20, 20, 20);
        textField.setLayoutConfig(layoutConfig);
        dlSelector.addComponent(textField);
    }
    

    3.3 Checkbox

    /**
     * 添加一个Checkbox
     */
    private void initCheckbox() {
        // Checkbox在presses状态的element
        ShapeElement elementCheckboxPressed = new ShapeElement();
        elementCheckboxPressed.setRgbColor(RgbPalette.RED);
        elementCheckboxPressed.setShape(ShapeElement.RECTANGLE);
        elementCheckboxPressed.setCornerRadius(10);
        // Checkbox在Disabled状态下的element
        ShapeElement elementCheckboxDisable = new ShapeElement();
        elementCheckboxDisable.setRgbColor(RgbPalette.GREEN);
        elementCheckboxDisable.setShape(ShapeElement.RECTANGLE);
        elementCheckboxDisable.setCornerRadius(10);
        // Checkbox在Empty状态下的element
        ShapeElement elementCheckboxEmpty = new ShapeElement();
        elementCheckboxEmpty.setRgbColor(RgbPalette.BLUE);
        elementCheckboxEmpty.setShape(ShapeElement.RECTANGLE);
        elementCheckboxEmpty.setCornerRadius(10);
        // Checkbox在Checked状态下的element
        ShapeElement elementCheckboxChecked = new ShapeElement();
        elementCheckboxChecked.setRgbColor(RgbPalette.GRAY);
        elementCheckboxChecked.setShape(ShapeElement.RECTANGLE);
        elementCheckboxChecked.setCornerRadius(10);
        //将各种状态下不同的背景添加到StateElement中
        StateElement stateElement = new StateElement();
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_PRESSED}, elementCheckboxPressed);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_DISABLED}, elementCheckboxDisable);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_CHECKED}, elementCheckboxChecked);
        stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, elementCheckboxEmpty);
    
        //新建一个button并将其添加到布局中
        Checkbox checkbox = new Checkbox(this);
        checkbox.setText("Checkbox");
        checkbox.setTextSize(50);
        // 设置按钮的状态,若为false,则表示状态为COMPONENT_STATE_DISABLED
        // checkbox.setEnabled(false);
        checkbox.setButtonElement(stateElement);
        // checkbox点击也会有状态变化
        // checkbox.setBackground(stateElement);
        DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(
                ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);
        layoutConfig.alignment = LayoutAlignment.CENTER;
        layoutConfig.setMargins(20, 20, 20, 20);
        checkbox.setLayoutConfig(layoutConfig);
        dlSelector.addComponent(checkbox);
    }
    

    本文作者:Zhang Heng 来自鸿蒙三方库联合特战队
    想了解更多内容,请访问51CTO和华为合作共建的鸿蒙社区:https://harmonyos.51cto.com

  • 相关阅读:
    Chrome开发者工具中Elements(元素)断点的用途
    最简单的SAP云平台开发教程
    Java实现 LeetCode 495 提莫攻击
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 494 目标和
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 493 翻转对
    Java实现 LeetCode 492 构造矩形
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14565381.html
Copyright © 2011-2022 走看看