rust druid 之 Lens使用

我们通过上几章的学习,我们做一个小练习,

效果图

实现一个效果,通过 按钮对滑块的操作,并且label显示滑块位置。

我们接下来开始实现这个小练习,我们使用的组件有 Button(按钮)、Slider(滑块)、Label(文本)、Flex(布局)。

让我们创建一个rust项目

cargo new lens_demo

让我们添加包

[dependencies]
druid = { git = "https://github.com/linebender/druid.git"}

添加我们需要用到的引用

use druid::widget::{Button,Label,Slider,Flex};
use druid::widget::Widget;
use druid::{Env, WindowDesc, AppLauncher, Data, Lens, WidgetExt};

创建我们的Data Lens

#[derive(Data,Clone,Lens)]
struct AppState{
    current:f64,
}

创建界面和启动程序

fn ui_builder() -> impl Widget<AppState> {

    //创建label显示滑块的位置数字 绑定了current
    let label = Label::new(|app_state:&AppState,_env:&Env|{ format!("{:.1}",app_state.current)});

    //创建滑块,with_range 设置滑块的开始位置结束位置,lens绑定了current,fix_width设置滑块的宽度
    let slider = Slider::new().with_range(1., 100.).lens(AppState::current).fix_width(250.);

    //创建减一按钮,fix_width 设置按钮的宽度,on_click 绑定点击事件,
    let button_reduce = Button::new("- 1").fix_width(100.).on_click(|_,app_state: &mut AppState,_|{
        //对值进行判断,不能小于1,修改current的值
        if app_state.current - 1. < 1. {
            app_state.current = 1.;
        }else{
            app_state.current -= 1.;
        }
    });

    let button_increase = Button::new("+ 1").fix_width(100.).on_click(|_,app_state: &mut AppState,_|{
        if app_state.current + 1. > 100. {
            app_state.current = 100.;
        }else{
            app_state.current += 1.;
        }

    });

    //创建布局垂直排列
    Flex::column()
        .with_child(
            //水平排列
            Flex::row()
            //添加显示位置的label
            .with_child(label)
        )
        .with_child(
            //水平排列
            Flex::row()
                //添加滑块
                .with_child(slider)   
        )
        .with_child(
            //水平排列
            Flex::row()
                //添加按钮
                .with_child(button_reduce)
                .with_child(button_increase).padding(10.)
        )

}

fn main() {
    let win = WindowDesc::new(ui_builder()).window_size((300.,200.)).title("rust语言编程");
    let _app = AppLauncher::with_window(win).launch(AppState{current:1.});
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!