鸿蒙开发(15)---PageSlider组件

简介: 鸿蒙开发(15)---PageSlider组件

PageSlider组件


在前面介绍TabList组件之时,博主就提示过了,如果需要使用TabList进行页面的切换,必然用到PageSlider组件。


所以,今天我们将详细介绍PageSlider组件的使用规则。


基本用法

定义PageSlider组件

首先,我们使用XML布局文件进行PageSlider组件的定义。示例如下:

<PageSlider
        ohos:id="$+id:ability_main_pageslider"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:layout_alignment="center"/>


我们都知道,这种滑动切换页面的PageSlider组件,它每一页都基本是一个布局,所以我们需要为它创建一个布局。


但是它自己就是一个XML布局里面的一个组件,这如何操作呢?


PageSliderProvider

答案就是PageSliderProvider,这是一个类似前面讲解列表组件BaseItemProvider的适配器。不过它略微有些不同,我们先来看看如何使用它:

public class MyPageProvider extends PageSliderProvider {
    private AbilitySlice abilitySlice;
    private List<PageModel> list;
    public MyPageProvider(List<PageModel> list,AbilitySlice abilitySlice){
        this.list=list;
        this.abilitySlice=abilitySlice;
    }
    @Override
    public int getCount() {
        return this.list.size();
    }
    @Override
    public Object createPageInContainer(ComponentContainer componentContainer, int i) {
        final Component cpt;
        cpt = LayoutScatter.getInstance(this.abilitySlice).parse(ResourceTable.Layout_pageslider_layout, null, false);
        componentContainer.addComponent(cpt);
        cpt.setLayoutConfig(new StackLayout.LayoutConfig(
                ComponentContainer.LayoutConfig.MATCH_PARENT,
                ComponentContainer.LayoutConfig.MATCH_PARENT
        ));
        PageModel pageModel = this.list.get(i);
        Text name = (Text) cpt.findComponentById(ResourceTable.Id_pageslider_layout_name);
        name.setText(pageModel.getName());
        return cpt;
    }
    @Override
    public void destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o) {
        componentContainer.removeComponent((Component) o);
    }
    @Override
    public boolean isPageMatchToObject(Component component, Object o) {
        return true;
    }
}


重要的代码都在createPageInContainer()方法里面,本身PageSliderProvider就是一个布局,我们需要将该布局中添加组件,这里可以直接添加一个界面layout。


然后,我们在自定定义和配置该界面layout中的资源。


滑动页面

当然,我们这里主要是为了讲解PageSlider组件的使用,我们在这里放置一个不同的文本即可。布局文件代码如下(pageslider_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
    <StackLayout
        ohos:height="match_parent"
        ohos:width="match_parent">
        <Text
            ohos:id="$+id:pageslider_layout_name"
            ohos:height="match_content"
            ohos:width="match_content"
            ohos:text_size="30vp"
            ohos:text_color="#FF0000"
            ohos:layout_alignment="center"/>
    </StackLayout>
</DirectionalLayout>


这里,就只有一个文本组件,我们在MyPageProvider设置了该文本的内容。当然,是我们MainAbilitySlice类传递给它的实体类。


设置字符串

public class MainAbilitySlice extends AbilitySlice {
    HiLogLabel label=new HiLogLabel(HiLog.LOG_APP, 0x00201, "TAG");
    private PageSlider pageSlider;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        this.pageSlider=(PageSlider)findComponentById(ResourceTable.Id_ability_main_pageslider);
        this.pageSlider.setProvider(new MyPageProvider(getData(),this));
    }
    private List<PageModel> getData(){
        List<PageModel> pageModelList=new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            pageModelList.add(new PageModel("Page"+(i+1)));
        }
        return pageModelList;
    }
}


如上面代码所示,我们为每个页面设置了“page+数字”组合的字符串。运行之后,实现的效果如下图所示:


TabList与PageSlider联动

前面介绍TabList博主就说过了,它可以结合PageSlider进行联动。尽然,到这里我们2个组件的功能都已经掌握,那么实战吧!


修改主布局

ability_main.xml文件刚开始只是一个PageSlider组件,因为需要与PageSlider联动,所以需要添加TabList组件,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:background_element="#000000"
    ohos:orientation="vertical">
    <TabList
        ohos:id="$+id:ability_main_tablist"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:tab_length="60vp"
        ohos:text_alignment="center"
        ohos:orientation="horizontal"
        ohos:text_size="20vp"
        ohos:normal_text_color="#FFFFFF"
        ohos:selected_text_color="#00FF00"
        ohos:selected_tab_indicator_color="#FF0000"
        ohos:selected_tab_indicator_height="5vp"/>
    <PageSlider
        ohos:id="$+id:ability_main_pageslider"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:layout_alignment="center"/>
</DirectionalLayout>


监听PageSlider与TabList

因为我们是需要PageSlider与TabList组件联动。


那么翻页操作时,要监听PageSlider组件的滑动,然后切换TabList组件的选中项,而PageSlider组件的滑动监听由addPageChangedListener负责。


而TabList组件切换,也应该变更PageSlider组件的页面选择,所以我们还需要监听TabList组件切换事件:addTabSelectedListener。


示例如下:

public class MainAbilitySlice extends AbilitySlice {
    HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "TAG");
    private PageSlider pageSlider;
    private TabList tabList;
    private String[] tab_str_list = {"关注", "推荐", "热榜", "问答", "社区", "Blink"};
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        this.pageSlider = (PageSlider) findComponentById(ResourceTable.Id_ability_main_pageslider);
        this.pageSlider.setProvider(new MyPageProvider(getData(), this));
        this.tabList = (TabList) findComponentById(ResourceTable.Id_ability_main_tablist);
        for (int i = 0; i < tab_str_list.length; i++) {
            TabList.Tab tab = tabList.new Tab(getContext());
            tab.setText(tab_str_list[i]);
            this.tabList.addTab(tab);
            if (i == 0) {
                tab.select();
            }
        }
        this.tabList.addTabSelectedListener(new TabList.TabSelectedListener() {
            @Override
            public void onSelected(TabList.Tab tab) {
                //当某个Tab从未选中状态变为选中状态时的回调
                pageSlider.setCurrentPage(tab.getPosition());
            }
            @Override
            public void onUnselected(TabList.Tab tab) {
                //当某个Tab从选中状态变为未选中状态时的回调
            }
            @Override
            public void onReselected(TabList.Tab tab) {
                //当某个Tab已处于选中状态,再次被点击时的状态回调
            }
        });
        pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() {
            @Override
            public void onPageSliding(int itemPos, float itemPosOffset, int itemPosPixles) {
            }
            @Override
            public void onPageSlideStateChanged(int state) {
            }
            @Override
            public void onPageChosen(int itemPos) {
                tabList.selectTabAt(itemPos);
            }
        });
    }
    private List<PageModel> getData() {
        List<PageModel> pageModelList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            pageModelList.add(new PageModel("Page" + (i + 1)));
        }
        return pageModelList;
    }
}


这里的代码很简单,就是添加了2个方法,而TabList组件的使用,前面已经介绍过,这里就不在赘述。运行之后,效果如首图所示。


源代码下载:点击下载

目录
打赏
0
0
0
0
20
分享
相关文章
|
19天前
|
鸿蒙开发:资讯项目实战之项目初始化搭建
目前来说,我们的资讯项目只是往前迈了很小的一步,仅仅实现了项目创建,步虽小,但概念性的知识很多,这也是这个项目的初衷,让大家不仅仅可以掌握日常的技术开发,也能让大家理解实际的项目开发知识。
鸿蒙开发:资讯项目实战之项目初始化搭建
鸿蒙开发:基于最新API,如何实现组件化运行
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙开发:基于最新API,如何实现组件化运行
鸿蒙5开发宝藏案例分享---优化应用时延问题
鸿蒙性能优化指南来了!从UI渲染到数据库操作,6大实战案例助你提升应用流畅度。布局层级优化、数据加载并发、数据库查询提速、相机资源延迟释放、手势识别灵敏调整及转场动画精调,全面覆盖性能痛点。附赠性能自检清单,帮助开发者高效定位问题,让应用运行如飞!来自华为官方文档的精华内容,建议收藏并反复研读,共同探讨更多优化技巧。
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
本文分享了鸿蒙系统中Swiper组件的性能优化技巧,包括:1) 使用`LazyForEach`替代`ForEach`实现懒加载,显著降低内存占用;2) 通过`cachedCount`精准控制缓存数量,平衡流畅度与内存消耗;3) 利用`onAnimationStart`在抛滑时提前加载资源,提升构建效率;4) 添加`@Reusable`装饰器复用组件实例,减少创建开销。实际应用后,图库页帧率从45fps提升至58fps,效果显著。适合处理复杂列表或轮播场景,欢迎交流经验!
|
13天前
|
HarmonyOS Next快速入门:Button组件
本教程摘自《HarmonyOS Next快速入门》,聚焦HarmonyOS应用开发中的Button组件。Button支持胶囊、圆形和普通三种类型,可通过子组件实现复杂功能,如嵌入图片或文字。支持自定义样式(边框弧度、文本样式、背景色等)及点击事件处理。示例代码展示了不同类型按钮的创建与交互逻辑,助开发者快速上手。适合HarmonyOS初学者及对UI组件感兴趣的开发者学习。
55 0
|
13天前
|
HarmonyOS Next快速入门:Image组件
本教程摘自《HarmonyOS Next快速入门》,专注于HarmonyOS应用开发中的Image组件使用。Image组件支持多种图片格式(如png、jpg、svg等),可渲染本地资源、网络图片、媒体库文件及PixelMap像素图。通过设置`objectFit`属性,实现不同缩放类型;利用`fillColor`属性调整矢量图颜色。示例代码涵盖本地、网络及资源图片的加载与样式设置,同时需在`module.json5`中声明网络权限以加载外部资源。适合开发者快速掌握HarmonyOS图像展示功能。
61 0
鸿蒙5开发宝藏案例分享---优化应用包体积大小问题
本文分享了鸿蒙应用包体积优化的实用技巧,包括SO库压缩、HSP动态共享包、OHPM依赖冲突解决、按需加载和扫描工具定位优化点等方法。通过具体配置示例和实战经验,如启用`compressNativeLibs`、使用共享资源包、强制统一依赖版本以及动态导入功能模块,帮助开发者显著减少包体积,提升用户体验。文中还提供了图标优化、资源混淆和无用代码剔除等补充建议,助力打造更轻量的鸿蒙应用。
鸿蒙5开发宝藏案例分享---Grid性能优化案例
本文深入探讨了鸿蒙系统中Grid组件性能优化的实战技巧,针对Grid加载慢、滚动卡顿的问题,提出用GridLayoutOptions替代columnStart/columnEnd的方法。通过预定义不规则项索引,将位置计算复杂度从O(n)降至O(1),大幅提升性能(如scrollToIndex耗时从447ms降至12ms)。文章结合代码示例与Profiler数据分析,总结最佳实践,帮助开发者优化应用流畅度。
鸿蒙5开发宝藏案例分享---瀑布流优化实战分享
本文基于鸿蒙官方瀑布流优化案例,分享了瀑布流性能优化的实战经验。分析了导致卡顿的三大原因:一次性渲染、动态高度与组件重建,并提供了四大优化方案——懒加载+缓存池、组件复用、动态预加载及固定高度计算。通过实测对比,优化后内存占用降低至98MB,滑动FPS提升至60帧。最后总结避坑指南,帮助开发者解决图片加载、布局嵌套和视频处理等常见问题,实现流畅体验。
鸿蒙5开发宝藏案例分享---长列表性能优化解析
鸿蒙长列表性能优化全揭秘!通过五大实战技巧(LazyForEach懒加载、cachedCount缓存、Prefetcher动态预加载、@Reusable组件复用及布局优化),有效解决卡顿、白块和高内存问题。万条数据测试显示,首屏加载提速77%,滑动零丢帧,内存占用降低86%。针对不同数据量场景提供避坑指南,助你开发流畅的HarmonyOS应用!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问