frame_layout_demo_v2/
frame_layout_demo_v2.rs

1// FrameLayout 帧布局演示 - 使用新库 API
2// 展示如何使用 FrameLayout 创建层叠布局
3// 运行: cargo run --example frame_layout_demo_v2 --release
4
5use termux_gui::{Activity, Result};
6use termux_gui::connection::read_message;
7
8fn main() -> Result<()> {
9    println!("=== FrameLayout 帧布局演示 (新库版本) ===\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("🎭 FrameLayout 演示", 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    // 创建说明
26    let desc = activity.create_text_view("FrameLayout 按添加顺序层叠显示子视图", Some(layout.id()))?;
27    desc.view().set_margin(&mut activity, 5)?;
28    desc.view().set_height_wrap_content(&mut activity)?;
29    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
30    
31    // ========== 示例1: 简单层叠 ==========
32    let section1 = activity.create_text_view("示例1: 文本层叠", Some(layout.id()))?;
33    section1.set_text_size(&mut activity, 18)?;
34    section1.view().set_margin(&mut activity, 10)?;
35    section1.view().set_height_wrap_content(&mut activity)?;
36    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
37    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
38    
39    // 创建一个 FrameLayout
40    let frame1 = activity.create_frame_layout(Some(layout.id()))?;
41    frame1.view().set_margin(&mut activity, 10)?;
42    frame1.view().set_height(&mut activity, 150)?;
43    frame1.view().set_width_match_parent(&mut activity)?;
44    frame1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 FrameLayout 中添加三个层叠的 TextView
47    // 第一层(底层)
48    let layer1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━\n第一层(底层)", Some(frame1.id()))?;
49    layer1.set_text_size(&mut activity, 20)?;
50    layer1.view().set_margin(&mut activity, 5)?;
51    layer1.set_text_color(&mut activity, 0xFFFF5722u32 as i32)?;
52    
53    // 第二层(中层)- 稍微偏移
54    let layer2 = activity.create_text_view("\n\n  第二层(中层)", Some(frame1.id()))?;
55    layer2.set_text_size(&mut activity, 20)?;
56    layer2.view().set_margin(&mut activity, 5)?;
57    layer2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
58    
59    // 第三层(顶层)- 更多偏移
60    let layer3 = activity.create_text_view("\n\n\n\n    第三层(顶层)", Some(frame1.id()))?;
61    layer3.set_text_size(&mut activity, 20)?;
62    layer3.view().set_margin(&mut activity, 5)?;
63    layer3.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
64    
65    // ========== 示例2: 按钮叠加 ==========
66    let divider1 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
67    divider1.view().set_margin(&mut activity, 10)?;
68    divider1.view().set_height_wrap_content(&mut activity)?;
69    divider1.view().set_linear_layout_params(&mut activity, 0, None)?;
70    
71    let section2 = activity.create_text_view("示例2: 按钮居中叠加", Some(layout.id()))?;
72    section2.set_text_size(&mut activity, 18)?;
73    section2.view().set_margin(&mut activity, 10)?;
74    section2.view().set_height_wrap_content(&mut activity)?;
75    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
76    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
77    
78    // 创建第二个 FrameLayout
79    let frame2 = activity.create_frame_layout(Some(layout.id()))?;
80    frame2.view().set_margin(&mut activity, 10)?;
81    frame2.view().set_height(&mut activity, 200)?;
82    frame2.view().set_width_match_parent(&mut activity)?;
83    frame2.view().set_linear_layout_params(&mut activity, 0, None)?;
84    
85    // 背景文本
86    let bg_text = activity.create_text_view("这是背景文本\n\n下面有一个居中的按钮\n\n点击试试", Some(frame2.id()))?;
87    bg_text.set_text_size(&mut activity, 16)?;
88    bg_text.view().set_margin(&mut activity, 10)?;
89    bg_text.set_text_color(&mut activity, 0xFF999999u32 as i32)?;
90    
91    // 居中按钮(通过在 FrameLayout 中居中)
92    // 注意:FrameLayout 默认将子视图居中对齐
93    let center_btn = activity.create_button("点我!", Some(frame2.id()))?;
94    center_btn.view().set_margin(&mut activity, 80)?;  // 添加边距让按钮看起来居中
95    
96    // ========== 底部信息 ==========
97    let divider2 = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(layout.id()))?;
98    divider2.view().set_margin(&mut activity, 10)?;
99    divider2.view().set_height_wrap_content(&mut activity)?;
100    divider2.view().set_linear_layout_params(&mut activity, 0, None)?;
101    
102    let info = activity.create_text_view(
103        "💡 FrameLayout 特点:\n\
104        • 子视图按添加顺序层叠\n\
105        • 后添加的视图在上层\n\
106        • 适合创建叠加效果\n\
107        • 可以实现简单的 Z 轴布局",
108        Some(layout.id())
109    )?;
110    info.view().set_margin(&mut activity, 10)?;
111    info.view().set_height_wrap_content(&mut activity)?;
112    info.view().set_linear_layout_params(&mut activity, 0, None)?;
113    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
114    
115    // 状态显示
116    let status = activity.create_text_view("准备就绪", Some(layout.id()))?;
117    status.view().set_margin(&mut activity, 10)?;
118    status.view().set_height_wrap_content(&mut activity)?;
119    status.view().set_linear_layout_params(&mut activity, 0, None)?;
120    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
121    
122    println!("✓ 界面创建完成\n");
123    println!("━━━━━━━━━━━━━━━━━━━━━━");
124    println!("提示:");
125    println!("  • 观察三层文本的层叠效果");
126    println!("  • 点击示例2中的居中按钮");
127    println!("  • FrameLayout 中后添加的元素在上层");
128    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
129    
130    let mut click_count = 0;
131    
132    // 事件循环
133    loop {
134        let event = read_message(activity.event_stream())?;
135        let event_type = event["type"].as_str().unwrap_or("");
136        let event_value = &event["value"];
137        
138        match event_type {
139            "destroy" => {
140                // Activity 已被系统销毁,直接退出即可
141                println!("\n✓ Activity 已关闭");
142                return Ok(());
143            },
144            "click" => {
145                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
146                
147                if clicked_id == center_btn.id() {
148                    click_count += 1;
149                    println!("✅ 居中按钮被点击!(第{}次)", click_count);
150                    
151                    let messages = [
152                        "✅ 第一次点击!很好!",
153                        "👍 第二次点击!继续!",
154                        "🎉 第三次点击!太棒了!",
155                        "🌟 第四次点击!你很厉害!",
156                        "🏆 第五次点击!大师级别!",
157                    ];
158                    
159                    let msg = if click_count <= 5 {
160                        messages[click_count - 1]
161                    } else {
162                        "🎊 你已经是专家了!"
163                    };
164                    
165                    status.set_text(&mut activity, &format!("{} (点击{}次)", msg, click_count))?;
166                    
167                    // 根据点击次数改变颜色
168                    let color = match click_count % 5 {
169                        1 => 0xFF4CAF50u32 as i32,  // 绿色
170                        2 => 0xFF2196F3u32 as i32,  // 蓝色
171                        3 => 0xFFFF9800u32 as i32,  // 橙色
172                        4 => 0xFF9C27B0u32 as i32,  // 紫色
173                        _ => 0xFFF44336u32 as i32,  // 红色
174                    };
175                    status.set_text_color(&mut activity, color)?;
176                }
177            },
178            _ => {}
179        }
180    }
181}