button_demo_v2/
button_demo_v2.rs

1// Button 交互式演示 - 使用新库 API
2// 展示如何创建按钮、布局和处理点击事件
3// 运行: cargo run --example button_demo_v2 --release
4
5use termux_gui::{Activity, Result};
6use termux_gui::connection::read_message;
7
8fn main() -> Result<()> {
9    println!("=== Button 交互演示 (新库版本) ===\n");
10    
11    // 创建 Activity(对话框模式)
12    let mut activity = Activity::new(true)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主布局
16    let layout = activity.create_linear_layout(None)?;
17    
18    // 创建标题
19    let title = activity.create_text_view("计数器演示 🦀", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 30)?;
21    title.view().set_margin(&mut activity, 10)?;
22    // 设置标题高度为WRAP_CONTENT,避免占用太多空间
23    title.view().set_height_wrap_content(&mut activity)?;
24    // 设置布局权重为0,不占用额外空间
25    title.view().set_linear_layout_params(&mut activity, 0, None)?;
26    
27    // 创建计数显示
28    let counter = activity.create_text_view("点击次数: 0", Some(layout.id()))?;
29    counter.set_text_size(&mut activity, 24)?;
30    counter.view().set_margin(&mut activity, 20)?;
31    // 设置计数器高度为WRAP_CONTENT
32    counter.view().set_height_wrap_content(&mut activity)?;
33    // 给计数器更高的权重,让它获得更多空间
34    counter.view().set_linear_layout_params(&mut activity, 1, None)?;
35    
36    // 创建按钮布局(横向)
37    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
38    // 按钮布局也使用WRAP_CONTENT
39    button_layout.view().set_height_wrap_content(&mut activity)?;
40    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
41    
42    // 创建按钮
43    let inc_button = activity.create_button("➕ 增加", Some(button_layout.id()))?;
44    inc_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
45    
46    let dec_button = activity.create_button("➖ 减少", Some(button_layout.id()))?;
47    dec_button.view().set_linear_layout_params(&mut activity, 1, None)?;  // 均分空间
48    
49    let reset_button = activity.create_button("🔄 重置", Some(layout.id()))?;
50    reset_button.view().set_height_wrap_content(&mut activity)?;
51    reset_button.view().set_linear_layout_params(&mut activity, 0, None)?;
52    
53    println!("✓ 界面创建完成");
54    println!("  - Counter ID: {}", counter.id());
55    println!("  - Button ID: {}", inc_button.id());
56    println!("━━━━━━━━━━━━━━━━━━━━━━");
57    println!("提示: 点击按钮进行交互");
58    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
59    
60    // 事件循环
61    let mut count = 0;
62    
63    loop {
64        let event = read_message(activity.event_stream())?;
65        let event_type = event["type"].as_str().unwrap_or("");
66        
67        match event_type {
68            "destroy" => {
69                // Activity 已被系统销毁,直接退出即可
70                // 不要调用 activity.finish(),因为 Activity 已经不存在了
71                println!("\n✓ Activity 已关闭");
72                println!("✓ 程序结束");
73                return Ok(());
74            },
75            "click" => {
76                let id = event["value"]["id"].as_i64().unwrap_or(-1);
77                
78                if id == inc_button.id() {
79                    count += 1;
80                    println!("➕ count = {}", count);
81                } else if id == dec_button.id() {
82                    count -= 1;
83                    println!("➖ count = {}", count);
84                } else if id == reset_button.id() {
85                    count = 0;
86                    println!("🔄 count = {}", count);
87                }
88                
89                // 更新文本
90                counter.set_text(&mut activity, &format!("点击次数: {}", count))?;
91                
92                // 根据计数改变颜色
93                let color = if count > 0 {
94                    0xFF4CAF50u32 as i32  // 绿色
95                } else if count < 0 {
96                    0xFFF44336u32 as i32  // 红色
97                } else {
98                    0xFF2196F3u32 as i32  // 蓝色
99                };
100                counter.set_text_color(&mut activity, color)?;
101            },
102            _ => {}
103        }
104    }
105}