FrameLayout

Struct FrameLayout 

Source
pub struct FrameLayout { /* private fields */ }
Expand description

A FrameLayout is a simple layout that stacks children on top of each other

Implementations§

Source§

impl FrameLayout

Source

pub fn new(activity: &mut Activity, parent: Option<i64>) -> Result<Self>

Create a new FrameLayout

Children are drawn in the order they are added, with the last child on top. FrameLayout is useful for overlaying views or creating simple stacked layouts.

Source

pub fn id(&self) -> i64

Get the view ID

Examples found in repository?
examples/frame_layout_demo_v2.rs (line 48)
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}
Source

pub fn view(&self) -> &View

Get the underlying View

Examples found in repository?
examples/frame_layout_demo_v2.rs (line 41)
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}

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V