【Harmony OS】【JAVA UI】鸿蒙怎么实现无限轮播功能

 关于HarmonyOS 开发中鸿蒙的无线轮播功能(效果图如下)是一个很常见的功能,在鸿蒙中怎么实现呢?今天写一个demo来记录一下该功能的实现,主要分为“准备工作”,“图片轮播”,“无线轮播”,“运行效果”四个方面进行实

20220119-090545(WeLinkPC).GIF

1.       准备工作

1.1想要实现无线轮播功能需要查看PageSlider“线程管理”“线程通信”这个几个知识的准备

image.png

image.png

1.2图片准备

我们从网上下载几张图片放在resources/base/media目录下(如下如所示)

image.png

2.       图片轮播

2.1xml 布局书写

我们新建一个AbilitySlice的界面然后在他的layout布局代码如下

<?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">

    <PageSlider

        ohos:top_margin="10vp"

        ohos:id="$+id:page_slider"

        ohos:height="300vp"

        ohos:width="300vp"

        ohos:layout_alignment="horizontal_center"/>

 

</DirectionalLayout>

2.2书写TestPageProvider

这个可以参考HarmonyOS官网的TestPageProvider(具体代码如下)

package com.harmony.alliance.mydemo.adapter;

 

import com.harmony.alliance.mydemo.ResourceTable;

import ohos.agp.colors.RgbColor;

import ohos.agp.components.*;

import ohos.agp.components.element.ShapeElement;

import ohos.agp.utils.Color;

import ohos.agp.utils.TextAlignment;

import ohos.app.Context;

 

import java.util.List;

public class TestPageProvider extends PageSliderProvider {

    // 数据源,每个页面对应list中的一项

    private List<Integer> list;

    private Context mContext;

 

    public TestPageProvider(List<Integer> list,Context context) {

        this.list = list;

        this.mContext = context;

    }

    @Override

    public int getCount() {

        return list.size();

    }

    @Override

    public Object createPageInContainer(ComponentContainer componentContainer,int i) {

        Image image = new Image(mContext);

        image.setPixelMap(list.get(i));

        image.   setLayoutConfig(

                new StackLayout.LayoutConfig(

                        ComponentContainer.LayoutConfig.MATCH_PARENT,ComponentContainer.LayoutConfig.MATCH_PARENT

                ));

        image.setScaleMode(Image.ScaleMode.STRETCH);

        componentContainer.addComponent(image);

        return image;

    }

    @Override

    public void destroyPageFromContainer(ComponentContainer componentContainer,int i,Object o) {

        componentContainer.removeComponent((Component) o);

    }

    @Override

    public boolean isPageMatchToObject(Component component,Object o) {

        return true;

    }

}

2.3写abilitySlice文件

在abilitySlice的Onstart的方中进行如下查找组件和初始化TestPageProvider和设置page缓存(具体代码如下)

protected void onStart(Intent intent) {

        super.onStart(intent);

        setUIContent(ResourceTable.Layout_ad_slot_pager);

        pageSlider = (PageSlider) findComponentById(ResourceTable.Id_page_slider);//查找组件

        //todo 初始化mTestPageProvider

        TestPageProvider mTestPageProvider=    new TestPageProvider(getData(),this);

        pageSlider.setProvider(mTestPageProvider);

        //todo 设置缓存page

        pageSlider.setPageCacheSize(4);

        eventRunner = EventRunner.create("TestRunner");

    

}

//todo 设置数据源

private ArrayList<Integer> getData() {

        ArrayList<Integer> dataItems = new ArrayList<>();

        for(int i=0;i<1024*10;i++){

            dataItems.add(images[i%4]);

        }

        return dataItems;

    }

效果图如下

image.png

3.       无限轮播

我们PagerSlider功能已经实现了,让PagerSlider进行滑动我们可以调用setCurrentPage的方法进行图片滑动,我们可以参考EventHandler这篇文章,没隔一秒钟进行处罚一下这个定时器,

3.1 实现EventHandler的类代码如下

private class TestEventHandler extends EventHandler {

        private TestEventHandler(EventRunner runner) {

            super(runner);

 

        }

 

        @Override

        public void processEvent(InnerEvent event) {

            getUITaskDispatcher().asyncDispatch(new Runnable() {

                @Override

                public void run() {

                    pageSlider.setCurrentPage(pos+1);//让pageSlider滑到下一个

                    InnerEvent normalInnerEvent = InnerEvent.get(0,null);

                    handler.sendEvent(normalInnerEvent,1000);//Todo 隔一秒 发送一个消息

                }

            });

        }

    }

3.2在Onstart中触发计时器功能

//创建EventRunner

        eventRunner = EventRunner.create("TestRunner");

        //初始化TestEventHandler

        handler = new TestEventHandler(eventRunner);

        InnerEvent normalInnerEvent = InnerEvent.get(0,null);

        handler.sendEvent(normalInnerEvent,1000);//发送消息

3.3监听PagerSlider的滑动监听,当手动滑动的时候,重写统计一下索引(代码如下)

pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() {

            /**

             *  选择新页面的回调

             *

             * @param i     指示所显示页的位置索引。

             * @param v     指示页的位置偏移量。值范围是(0,1]。0表示显示相同的页面; 1表示显示目标页面。

             * @param i1    指示所显示页面的位置偏移像素数。

             */

            @Override

            public void onPageSliding(int i,float v,int i1) {//

 

            }

            /**

             * 页面幻灯片状态更改时回调

             * @param i     指示页面状态。该值可以是0、1或2,分别表示页处于空闲状态、拖动状态或滑动状态。

             */

            @Override

            public void onPageSlideStateChanged(int i) {

 

            }

            /**

             * 页面滑动时回调

             *

             * @param i     指示所选页的索引。

             */

            @Override

            public void onPageChosen(int i) {

                pos=i;

            }

        });

4.       运行效果图

4.1全部代码如下

TestPageProvider代码

package com.harmony.alliance.mydemo.adapter;

 

import com.harmony.alliance.mydemo.ResourceTable;

import ohos.agp.colors.RgbColor;

import ohos.agp.components.*;

import ohos.agp.components.element.ShapeElement;

import ohos.agp.utils.Color;

import ohos.agp.utils.TextAlignment;

import ohos.app.Context;

 

import java.util.List;

public class TestPageProvider extends PageSliderProvider {

    // 数据源,每个页面对应list中的一项

    private List<Integer> list;

    private Context mContext;

 

    public TestPageProvider(List<Integer> list,Object o) {

        return true;

    }

}

4.2xml代码

<?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">

    <PageSlider

        ohos:top_margin="10vp"

        ohos:id="$+id:page_slider"

        ohos:height="300vp"

        ohos:width="300vp"

        ohos:layout_alignment="horizontal_center"/>

 

</DirectionalLayout>

4.3abilitySlice代码如下

package com.harmony.alliance.mydemo.slice;

 

import com.harmony.alliance.mydemo.ResourceTable;

import com.harmony.alliance.mydemo.adapter.TestPageProvider;

import com.harmony.alliance.mydemo.utils.HiLogUtils;

import ohos.aafwk.ability.AbilitySlice;

import ohos.aafwk.content.Intent;

import ohos.agp.components.PageSlider;

import ohos.eventhandler.EventHandler;

import ohos.eventhandler.EventRunner;

import ohos.eventhandler.InnerEvent;

 

import java.util.ArrayList;

 

public class AdSlotPager  extends AbilitySlice {

    private    PageSlider pageSlider;

    private int pos=0;

    private TestEventHandler handler;

 

    private EventRunner eventRunner;

    private Integer[] images=new Integer[]{ResourceTable.Media_once,ResourceTable.Media_two,ResourceTable.Media_three,ResourceTable.Media_four};

    @Override

    protected void onStart(Intent intent) {

        super.onStart(intent);

        setUIContent(ResourceTable.Layout_ad_slot_pager);

        pageSlider = (PageSlider) findComponentById(ResourceTable.Id_page_slider);//查找组件

        //todo 初始化mTestPageProvider

        TestPageProvider mTestPageProvider=    new TestPageProvider(getData(),this);

        pageSlider.setProvider(mTestPageProvider);

        //todo 设置缓存page

        pageSlider.setPageCacheSize(4);

        //创建EventRunner

        eventRunner = EventRunner.create("TestRunner");

        //初始化TestEventHandler

        handler = new TestEventHandler(eventRunner);

        InnerEvent normalInnerEvent = InnerEvent.get(0,1000);//发送消息

        pageSlider.addPageChangedListener(new PageSlider.PageChangedListener() {

            /**

             *  选择新页面的回调

             *

             * @param i     指示所显示页的位置索引。

             * @param v     指示页的位置偏移量。值范围是(0,int i1) {//

 

            }

            /**

             * 页面幻灯片状态更改时回调

             * @param i     指示页面状态。该值可以是0、1或2,分别表示页处于空闲状态、拖动状态或滑动状态。

             */

            @Override

            public void onPageSlideStateChanged(int i) {

 

            }

            /**

             * 页面滑动时回调

             *

             * @param i     指示所选页的索引。

             */

            @Override

            public void onPageChosen(int i) {

                pos=i;

            }

        });

    }

    private ArrayList<Integer> getData() {

        ArrayList<Integer> dataItems = new ArrayList<>();

        for(int i=0;i<1024*10;i++){

            dataItems.add(images[i%4]);

        }

        return dataItems;

    }

 

 

    private class TestEventHandler extends EventHandler {

        private TestEventHandler(EventRunner runner) {

            super(runner);

 

        }

 

        @Override

        public void processEvent(InnerEvent event) {

            getUITaskDispatcher().asyncDispatch(new Runnable() {

                @Override

                public void run() {

                    pageSlider.setCurrentPage(pos+1);//让pageSlider滑到下一个

                    InnerEvent normalInnerEvent = InnerEvent.get(0,1000);//Todo 隔一秒 发送一个消息

                }

            });

        }

    }

 

 

 

}

4.4效果如下

efb1df3b0cbb9719206ce2afa13e644b_300x650.gif%40900-0-90-f.gif

更多相关学习资料:
https://developer.huawei.com/consumer/cn/forum/topic/0202779034289830523?fid=0102683795438680754?ha_source=zzh

原文地址:https://blog.csdn.net/weixin_44708240/article/details/125806928

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1.4k次。被@Observed装饰的类,可以被观察到属性的变化;子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中是属性,这个属性同样也需要被@Observed装饰。单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。_鸿蒙ark对象数组
文章浏览阅读1k次。Harmony OS_harmonyos创建数据库
文章浏览阅读1.1k次,点赞25次,收藏23次。自定义组件Header.ets页面(子组件)//自定义组件@Component//组件声明private title:ResourceStr//接收的参数build(){Row() {index.ets(父组件)//导入自定义组件@Entry@Componentbuild() {Column() {/*** 1. 自定义组件调用-----自定义组件------* 2. 在调用的组件上设置样式*/ShopTitle({ title: '商品列表' })
文章浏览阅读952次,点赞11次,收藏25次。ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。_支持ios 安卓 鸿蒙next的跨平台方案
文章浏览阅读735次。​错误: 找不到符号符号: 变量 Layout_list_item位置: 类 ResourceTable_错误: 找不到符号 符号: 变量 resourcetable 位置: 类 mainabilityslice
文章浏览阅读941次,点赞23次,收藏21次。harmony ARKTS base64 加解密_鸿蒙 鸿蒙加解密算法库
文章浏览阅读860次,点赞21次,收藏24次。使用自定义布局,实现子组件自动换行功能。图1自定义布局的使用效果创建自定义布局的类,并继承ComponentContainer,添加构造方法。//如需支持xml创建自定义布局,必须添加该构造方法实现ComponentContainer.EstimateSizeListener接口,在onEstimateSize方法中进行测量。......@Override//通知子组件进行测量//关联子组件的索引与其布局数据idx++) {//测量自身。_鸿蒙javaui
文章浏览阅读917次,点赞25次,收藏25次。这里需要注意的是,真机需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。当前,真机调试需要使用华为侧提供的测试机,测试机中会安装纯鸿蒙的系统镜像,能够体验到完整的鸿蒙系统功能,纯鸿蒙应用目前还不能完美地在 HarmonyOS 4.0 的商用机侧跑起来。另外,由于样式的解析是基于组件文件的纬度的,因此样式文件只能应用于被其引用的组件文件中,而不能跨文件应用,并且样式文件也只支持类选择器。_鸿蒙 小程序
文章浏览阅读876次,点赞17次,收藏4次。2. HarmonyOS应用开发DevEcoStudio准备-1HUAWEI DevEco Studio为运行在HarmonyOS和OpenHarmony系统上的应用和服务(以下简称应用/服务)提供一站式的开发平台。
文章浏览阅读811次。此对象主要映射JSON数组数据,比如服务器传的数据是这样的。_arkts json
文章浏览阅读429次。鸿蒙小游戏-数字华容道_华为鸿蒙手机自带小游戏
文章浏览阅读1.1k次,点赞24次,收藏19次。Ability是应用/服务所具备的能力的抽象,一个Module可以包含一个或多个Ability。
文章浏览阅读846次。本文带大家使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发主板_mqtt 如何对接第三方iot平台
文章浏览阅读567次。HarmonyOS_arkts卡片
文章浏览阅读1k次,点赞19次,收藏20次。ArkTS开发鸿蒙OS连接mongoDB(后端node.js)2024最新教程
文章浏览阅读1.2k次,点赞23次,收藏15次。HarmonyOS与OpenHarmony(1)本质上的不同是:HarmonyOS是鸿蒙操作系统,而OpenHarmony则是从开源项目。这里可以联想一下Android,比如小米手机在Android开源系统的基础上开发了MIUI的手机操作系统,HarmonyOS就类似于MIUI,OpenHarmony类似Android基础底座。(2)HarmonyOS:是双框架,内聚了AOSP(Android Open Source Project )和OpenHarmony等。_鸿蒙模拟器开了怎么跑代码
文章浏览阅读1.1k次,点赞21次,收藏21次。鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Navigation组件。
文章浏览阅读2k次。由于之前的哥们匆忙离职了,所以鸿蒙手表项目的新版本我临时接过来打包发布,基本上之前没有啥鸿蒙经验,但是一直是做Android开发的,在工作人员的指导下发现打包配置基本上和Android一样,所以这些都不是问题,这里记录一下使用过程中遇到的问题。!过程和遇到的问题基本上都讲解了,关机睡觉,打卡收工。_鸿蒙系统adb命令
文章浏览阅读7.3k次,点赞9次,收藏29次。39. 【多选题】_column和row容器中,设置子组件在主轴方向上的对齐格式
文章浏览阅读1.1k次,点赞13次,收藏24次。18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器点击button按钮显示月份与获取的时间。_harmonyos农历获取