image_demo_v2/
image_demo_v2.rs

1// ImageView 图像显示演示 - 使用新库 API
2// 展示如何显示图片(base64编码)
3// 运行: cargo run --example image_demo_v2 --release
4
5use termux_gui::{Activity, Result};
6use termux_gui::connection::read_message;
7
8fn main() -> Result<()> {
9    println!("=== ImageView 图像显示演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建 NestedScrollView 作为根布局(支持滚动)
16    let scroll = activity.create_nested_scroll_view(None)?;
17    
18    // 创建主布局(放在 ScrollView 内)
19    let layout = activity.create_linear_layout(Some(scroll.id()))?;
20    layout.view().set_margin(&mut activity, 15)?;
21    
22    // 创建标题
23    let title = activity.create_text_view("🖼️ 图片显示测试", Some(layout.id()))?;
24    title.set_text_size(&mut activity, 26)?;
25    title.view().set_margin(&mut activity, 10)?;
26    title.view().set_height_wrap_content(&mut activity)?;
27    title.view().set_linear_layout_params(&mut activity, 0, None)?;
28    
29    // 创建说明
30    let desc = activity.create_text_view("显示一个小的测试图片", Some(layout.id()))?;
31    desc.view().set_margin(&mut activity, 5)?;
32    desc.view().set_height_wrap_content(&mut activity)?;
33    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
34    
35    // 创建 ImageView
36    let image_view = activity.create_image_view(Some(layout.id()))?;
37    image_view.view().set_margin(&mut activity, 10)?;
38    // ImageView 使用权重占据主要空间
39    image_view.view().set_linear_layout_params(&mut activity, 1, None)?;
40    
41    // 创建一个简单的 1x1 红色像素 PNG 图片(base64编码)
42    // 这是一个最小的有效PNG文件
43    let red_pixel_png_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
44    
45    // 设置图片
46    image_view.set_image(&mut activity, red_pixel_png_base64)?;
47    
48    // 创建状态显示
49    let status = activity.create_text_view("✅ 图片已加载", Some(layout.id()))?;
50    status.view().set_margin(&mut activity, 10)?;
51    status.view().set_height_wrap_content(&mut activity)?;
52    status.view().set_linear_layout_params(&mut activity, 0, None)?;
53    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
54    
55    // 创建按钮布局
56    let button_layout = activity.create_linear_layout_horizontal(Some(layout.id()))?;
57    button_layout.view().set_margin(&mut activity, 10)?;
58    button_layout.view().set_height_wrap_content(&mut activity)?;
59    button_layout.view().set_linear_layout_params(&mut activity, 0, None)?;
60    
61    // 红色图片按钮
62    let red_btn = activity.create_button("🔴 红色", Some(button_layout.id()))?;
63    red_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
64    
65    // 绿色图片按钮
66    let green_btn = activity.create_button("🟢 绿色", Some(button_layout.id()))?;
67    green_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
68    
69    // 蓝色图片按钮
70    let blue_btn = activity.create_button("🔵 蓝色", Some(button_layout.id()))?;
71    blue_btn.view().set_linear_layout_params(&mut activity, 1, None)?;
72    
73    println!("✓ 界面创建完成\n");
74    println!("━━━━━━━━━━━━━━━━━━━━━━");
75    println!("提示:");
76    println!("  • 点击按钮切换不同颜色的图片");
77    println!("  • 图片会自动缩放填充区域");
78    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
79    
80    // 预定义几个不同颜色的1x1像素PNG图片(base64)
81    // 红色像素
82    let red_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
83    // 绿色像素
84    let green_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg==";
85    // 蓝色像素
86    let blue_png = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg==";
87    
88    // 事件循环
89    loop {
90        let event = read_message(activity.event_stream())?;
91        let event_type = event["type"].as_str().unwrap_or("");
92        let event_value = &event["value"];
93        
94        match event_type {
95            "destroy" => {
96                // Activity 已被系统销毁,直接退出即可
97                println!("\n✓ Activity 已关闭");
98                return Ok(());
99            },
100            "click" => {
101                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
102                
103                if clicked_id == red_btn.id() {
104                    println!("🔴 切换到红色图片");
105                    image_view.set_image(&mut activity, red_png)?;
106                    status.set_text(&mut activity, "🔴 红色图片")?;
107                    status.set_text_color(&mut activity, 0xFFF44336u32 as i32)?;
108                } else if clicked_id == green_btn.id() {
109                    println!("🟢 切换到绿色图片");
110                    image_view.set_image(&mut activity, green_png)?;
111                    status.set_text(&mut activity, "🟢 绿色图片")?;
112                    status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
113                } else if clicked_id == blue_btn.id() {
114                    println!("🔵 切换到蓝色图片");
115                    image_view.set_image(&mut activity, blue_png)?;
116                    status.set_text(&mut activity, "🔵 蓝色图片")?;
117                    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
118                }
119            },
120            _ => {}
121        }
122    }
123}