• 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

  • 相关阅读:
    2018-2019-2 20175310 个人项目总结报告
    2018-2019-2 20175310 个人项目报告5--勾股数
    2018-2019-2 20175310 个人项目报告6--四方定理
    2018-2019-2 20175310 个人项目报告7--尼科彻斯定理
    #2019-2020-4 《Java 程序设计》第十周总结
    数据库MySQL(20175229张智敏)
    #实验三 敏捷开发与XP实践---实验报告
    课下必做MyCP
    #2019-2020-4 《Java 程序设计》第九周总结
    #2019-2020-4 《Java 程序设计》第八周总结
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14565381.html
Copyright © 2020-2023  润新知