HorizontalScrollView

Struct HorizontalScrollView 

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

A HorizontalScrollView provides horizontal scrolling capability

Implementations§

Source§

impl HorizontalScrollView

Source

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

Create a new HorizontalScrollView

Source

pub fn id(&self) -> i64

Get the view ID

Examples found in repository?
examples/horizontal_scroll_demo_v2.rs (line 47)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}
Source

pub fn view(&self) -> &View

Get the underlying View

Examples found in repository?
examples/horizontal_scroll_demo_v2.rs (line 42)
8fn main() -> Result<()> {
9    println!("=== HorizontalScrollView 水平滚动演示 (新库版本) ===\n");
10    
11    // 创建 Activity(全屏模式)
12    let mut activity = Activity::new(false)?;
13    println!("✓ 连接建立\n");
14    
15    // 创建主垂直布局
16    let main_layout = activity.create_linear_layout(None)?;
17    main_layout.view().set_margin(&mut activity, 15)?;
18    
19    // 创建标题
20    let title = activity.create_text_view("↔️ HorizontalScrollView 演示", Some(main_layout.id()))?;
21    title.set_text_size(&mut activity, 26)?;
22    title.view().set_margin(&mut activity, 10)?;
23    title.view().set_height_wrap_content(&mut activity)?;
24    title.view().set_linear_layout_params(&mut activity, 0, None)?;
25    
26    // 创建说明
27    let desc = activity.create_text_view("左右滑动查看更多按钮", Some(main_layout.id()))?;
28    desc.view().set_margin(&mut activity, 5)?;
29    desc.view().set_height_wrap_content(&mut activity)?;
30    desc.view().set_linear_layout_params(&mut activity, 0, None)?;
31    
32    // ========== 第一行: 水果按钮 ==========
33    let section1 = activity.create_text_view("第一行: 水果按钮(左右滑动)", Some(main_layout.id()))?;
34    section1.set_text_size(&mut activity, 18)?;
35    section1.view().set_margin(&mut activity, 10)?;
36    section1.view().set_height_wrap_content(&mut activity)?;
37    section1.view().set_linear_layout_params(&mut activity, 0, None)?;
38    section1.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
39    
40    // 创建第一个 HorizontalScrollView
41    let h_scroll1 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
42    h_scroll1.view().set_margin(&mut activity, 10)?;
43    h_scroll1.view().set_height_wrap_content(&mut activity)?;
44    h_scroll1.view().set_linear_layout_params(&mut activity, 0, None)?;
45    
46    // 在 HorizontalScrollView 内创建水平 LinearLayout
47    let h_layout1 = activity.create_linear_layout_horizontal(Some(h_scroll1.id()))?;
48    h_layout1.view().set_height_wrap_content(&mut activity)?;
49    
50    // 添加10个水果按钮
51    let fruits = ["🍎 苹果", "🍊 橙子", "🍌 香蕉", "🍇 葡萄", "🍓 草莓", 
52                  "🍑 桃子", "🍒 樱桃", "🍍 菠萝", "🥝 猕猴桃", "🥭 芒果"];
53    let mut fruit_buttons = Vec::new();
54    for fruit in &fruits {
55        let btn = activity.create_button(fruit, Some(h_layout1.id()))?;
56        btn.view().set_width(&mut activity, 180)?;  // 固定宽度180dp
57        btn.view().set_margin(&mut activity, 5)?;
58        fruit_buttons.push(btn);
59    }
60    
61    // ========== 第二行: 数字按钮 ==========
62    let section2 = activity.create_text_view("第二行: 数字按钮(左右滑动)", Some(main_layout.id()))?;
63    section2.set_text_size(&mut activity, 18)?;
64    section2.view().set_margin(&mut activity, 10)?;
65    section2.view().set_height_wrap_content(&mut activity)?;
66    section2.view().set_linear_layout_params(&mut activity, 0, None)?;
67    section2.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
68    
69    // 创建第二个 HorizontalScrollView
70    let h_scroll2 = activity.create_horizontal_scroll_view(Some(main_layout.id()))?;
71    h_scroll2.view().set_margin(&mut activity, 10)?;
72    h_scroll2.view().set_height_wrap_content(&mut activity)?;
73    h_scroll2.view().set_linear_layout_params(&mut activity, 0, None)?;
74    
75    // 在 HorizontalScrollView 内创建水平 LinearLayout
76    let h_layout2 = activity.create_linear_layout_horizontal(Some(h_scroll2.id()))?;
77    h_layout2.view().set_height_wrap_content(&mut activity)?;
78    
79    // 添加20个数字按钮
80    let mut number_buttons = Vec::new();
81    for i in 0..20 {
82        let btn = activity.create_button(&format!("数字 {}", i * 5), Some(h_layout2.id()))?;
83        btn.view().set_width(&mut activity, 150)?;  // 固定宽度150dp
84        btn.view().set_margin(&mut activity, 5)?;
85        number_buttons.push(btn);
86    }
87    
88    // ========== 底部信息 ==========
89    let divider = activity.create_text_view("━━━━━━━━━━━━━━━━━━━━", Some(main_layout.id()))?;
90    divider.view().set_margin(&mut activity, 10)?;
91    divider.view().set_height_wrap_content(&mut activity)?;
92    divider.view().set_linear_layout_params(&mut activity, 0, None)?;
93    
94    let info = activity.create_text_view(
95        "💡 提示:\n\
96        • 在每一行中左右滑动\n\
97        • 点击任意按钮查看效果\n\
98        • HorizontalScrollView 支持水平滚动",
99        Some(main_layout.id())
100    )?;
101    info.view().set_margin(&mut activity, 10)?;
102    info.view().set_height_wrap_content(&mut activity)?;
103    info.view().set_linear_layout_params(&mut activity, 0, None)?;
104    info.set_text_color(&mut activity, 0xFF666666u32 as i32)?;
105    
106    // 状态显示
107    let status = activity.create_text_view("准备就绪 - 尝试左右滑动", Some(main_layout.id()))?;
108    status.view().set_margin(&mut activity, 10)?;
109    status.view().set_height_wrap_content(&mut activity)?;
110    status.view().set_linear_layout_params(&mut activity, 0, None)?;
111    status.set_text_color(&mut activity, 0xFF2196F3u32 as i32)?;
112    
113    println!("✓ 界面创建完成\n");
114    println!("━━━━━━━━━━━━━━━━━━━━━━");
115    println!("提示:");
116    println!("  • 第一行: 10个水果按钮");
117    println!("  • 第二行: 20个数字按钮");
118    println!("  • 左右滑动查看更多内容");
119    println!("━━━━━━━━━━━━━━━━━━━━━━\n");
120    
121    // 事件循环
122    loop {
123        let event = read_message(activity.event_stream())?;
124        let event_type = event["type"].as_str().unwrap_or("");
125        let event_value = &event["value"];
126        
127        match event_type {
128            "destroy" => {
129                println!("\n✓ Activity 已关闭");
130                return Ok(());
131            },
132            "click" => {
133                let clicked_id = event_value["id"].as_i64().unwrap_or(-1);
134                
135                // 检查水果按钮
136                for (i, btn) in fruit_buttons.iter().enumerate() {
137                    if clicked_id == btn.id() {
138                        println!("✅ 选择: {}", fruits[i]);
139                        status.set_text(&mut activity, &format!("✅ 选择: {}", fruits[i]))?;
140                        status.set_text_color(&mut activity, 0xFF4CAF50u32 as i32)?;
141                        break;
142                    }
143                }
144                
145                // 检查数字按钮
146                for (i, btn) in number_buttons.iter().enumerate() {
147                    if clicked_id == btn.id() {
148                        let value = i * 5;
149                        println!("🔢 选择数字: {}", value);
150                        status.set_text(&mut activity, &format!("🔢 选择数字: {}", value))?;
151                        status.set_text_color(&mut activity, 0xFFFF9800u32 as i32)?;
152                        break;
153                    }
154                }
155            },
156            _ => {}
157        }
158    }
159}

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