space_demo_v2/
space_demo_v2.rs

1// Space 空白间隔演示 - 使用新库 API
2// 展示如何使用 Space 创建布局间隔
3// 运行: cargo run --example space_demo_v2 --release
4
5use termux_gui::{Activity, Result};
6use termux_gui::connection::read_message;
7
8fn main() -> Result<()> {
9    println!("=== Space 空白间隔演示 (新库版本) ===\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("📐 Space 间隔演示", Some(layout.id()))?;
20    title.set_text_size(&mut activity, 26)?;
21    title.view().set_margin(&mut activity, 10)?;
22    title.view().set_height_wrap_content(&mut activity)?;
23    title.view().set_linear_layout_params(&mut activity, 0, None)?;
24    
25    // ========== 示例1: 固定高度的间隔 ==========
26    let section1 = activity.create_text_view("示例1: 固定高度间隔", Some(layout.id()))?;
27    section1.set_text_size(&mut activity, 18)?;
28    section1.view().set_margin(&mut activity, 10)?;
29    section1.view().set_height_wrap_content(&mut activity)?;
30    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
31    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
32    
33    let text1a = activity.create_text_view("这是第一个元素", Some(layout.id()))?;
34    text1a.view().set_margin(&mut activity, 5)?;
35    text1a.view().set_height_wrap_content(&mut activity)?;
36    text1a.view().set_linear_layout_params(&mut activity, 0, None)?;
37    
38    // 创建一个 50dp 高度的 Space
39    let space1 = activity.create_space(Some(layout.id()))?;
40    space1.view().set_height(&mut activity, 50)?;
41    space1.view().set_linear_layout_params(&mut activity, 0, None)?;
42    
43    let text1b = activity.create_text_view("这是第二个元素(上方有50dp间隔)", Some(layout.id()))?;
44    text1b.view().set_margin(&mut activity, 5)?;
45    text1b.view().set_height_wrap_content(&mut activity)?;
46    text1b.view().set_linear_layout_params(&mut activity, 0, None)?;
47    
48    // ========== 示例2: 权重间隔(弹性空间)==========
49    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
50    divider1.view().set_margin(&mut activity, 10)?;
51    divider1.view().set_height_wrap_content(&mut activity)?;
52    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
53    
54    let section2 = activity.create_text_view("示例2: 权重间隔(填充剩余空间)", Some(layout.id()))?;
55    section2.set_text_size(&mut activity, 18)?;
56    section2.view().set_margin(&mut activity, 10)?;
57    section2.view().set_height_wrap_content(&mut activity)?;
58    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
59    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
60    
61    let text2a = activity.create_text_view("顶部内容", Some(layout.id()))?;
62    text2a.view().set_margin(&mut activity, 5)?;
63    text2a.view().set_height_wrap_content(&mut activity)?;
64    text2a.view().set_linear_layout_params(&mut activity, 0, None)?;
65    
66    // 创建一个 weight=1 的 Space,它会占据所有剩余空间
67    let space2 = activity.create_space(Some(layout.id()))?;
68    space2.view().set_linear_layout_params(&mut activity, 1, None)?;
69    
70    let text2b = activity.create_text_view("底部内容(被推到底部)", Some(layout.id()))?;
71    text2b.view().set_margin(&mut activity, 5)?;
72    text2b.view().set_height_wrap_content(&mut activity)?;
73    text2b.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // ========== 示例3: 水平间隔 ==========
76    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
77    divider2.view().set_margin(&mut activity, 10)?;
78    divider2.view().set_height_wrap_content(&mut activity)?;
79    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
80    
81    let section3 = activity.create_text_view("示例3: 水平间隔", Some(layout.id()))?;
82    section3.set_text_size(&mut activity, 18)?;
83    section3.view().set_margin(&mut activity, 10)?;
84    section3.view().set_height_wrap_content(&mut activity)?;
85    section3.view().set_linear_layout_params(&mut activity, 0, None)?;
86    section3.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
87    
88    // 创建水平布局
89    let h_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
90    h_layout.view().set_margin(&mut activity, 5)?;
91    h_layout.view().set_height_wrap_content(&mut activity)?;
92    h_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let btn1 = activity.create_button("按钮1", Some(h_layout.id()))?;
95    btn1.view().set_linear_layout_params(&mut activity, 0, None)?;
96    
97    // 水平 Space,宽度30dp
98    let h_space = activity.create_space(Some(h_layout.id()))?;
99    h_space.view().set_width(&mut activity, 30)?;
100    h_space.view().set_linear_layout_params(&mut activity, 0, None)?;
101    
102    let btn2 = activity.create_button("按钮2", Some(h_layout.id()))?;
103    btn2.view().set_linear_layout_params(&mut activity, 0, None)?;
104    
105    // 弹性水平 Space(weight=1),把按钮3推到右边
106    let h_space2 = activity.create_space(Some(h_layout.id()))?;
107    h_space2.view().set_linear_layout_params(&mut activity, 1, None)?;
108    
109    let btn3 = activity.create_button("按钮3", Some(h_layout.id()))?;
110    btn3.view().set_linear_layout_params(&mut activity, 0, None)?;
111    
112    // ========== 底部说明 ==========
113    let divider3 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
114    divider3.view().set_margin(&mut activity, 10)?;
115    divider3.view().set_height_wrap_content(&mut activity)?;
116    divider3.view().set_linear_layout_params(&mut activity, 0, None)?;
117    
118    let info = activity.create_text_view(
119        "💡 Space 用途:\n\
120        • 固定间隔:设置固定宽度/高度\n\
121        • 弹性间隔:使用 weight 填充空间\n\
122        • 推送元素:将元素推到边缘",
123        Some(layout.id())
124    )?;
125    info.view().set_margin(&mut activity, 10)?;
126    info.view().set_height_wrap_content(&mut activity)?;
127    info.view().set_linear_layout_params(&mut activity, 0, None)?;
128    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
129    
130    println!("✓ 界面创建完成\n");
131    println!("━━━━━━━━━━━━━━━━━━━━━━");
132    println!("提示:");
133    println!("  • 观察不同类型的 Space 效果");
134    println!("  • Space 本身是不可见的");
135    println!("  • 使用 Space 可以精确控制布局");
136    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
137    
138    // 事件循环
139    loop {
140        let event = read_message(activity.event_stream())?;
141        let event_type = event["type"].as_str().unwrap_or("");
142        let event_value = &event["value"];
143        
144        match event_type {
145            "destroy" => {
146                // Activity 已被系统销毁,直接退出即可
147                println!("\n✓ Activity 已关闭");
148                return Ok(());
149            },
150            "click" => {
151                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
152                
153                if clicked_id == btn1.id() {
154                    println!("点击了按钮1");
155                    info.set_text(&mut activity, "✅ 按钮1 被点击")?;
156                    info.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
157                } else if clicked_id == btn2.id() {
158                    println!("点击了按钮2");
159                    info.set_text(&mut activity, "✅ 按钮2 被点击(左侧有30dp间隔)")?;
160                    info.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
161                } else if clicked_id == btn3.id() {
162                    println!("点击了按钮3");
163                    info.set_text(&mut activity, "✅ 按钮3 被点击(被弹性Space推到右边)")?;
164                    info.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
165                }
166            },
167            _ => {}
168        }
169    }
170}