| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package com.fujica.abk.utils;
- import com.fujica.abk.ResourceTable;
- import ohos.agp.animation.Animator;
- import ohos.agp.animation.AnimatorProperty;
- import ohos.agp.components.AttrSet;
- import ohos.agp.components.Component;
- import ohos.agp.components.ComponentContainer;
- import ohos.agp.components.DirectionalLayout;
- import ohos.agp.components.Image;
- import ohos.agp.components.LayoutScatter;
- import ohos.agp.components.ProgressBar;
- import ohos.agp.utils.Color;
- import ohos.agp.utils.LayoutAlignment;
- import ohos.app.Context;
- import ohos.eventhandler.EventHandler;
- import ohos.eventhandler.EventRunner;
- /**
- * Loading组件类,继承DirectionalLayout
- * 全屏遮罩,中间显示loading,不可点击,不可取消
- * 使用方式:在 AbilitySlice 中定义为属性,初始化后添加到根布局
- */
- public class LoadingComponent extends DirectionalLayout {
- private Component contentLayout;
- private Image loadingImage;
- private AnimatorProperty rotationAnimator;
- /**
- * 构造函数(用于代码创建)
- */
- public LoadingComponent(Context context) {
- super(context);
- initComponent(context);
- }
- /**
- * 构造函数(用于XML布局文件)
- */
- public LoadingComponent(Context context, AttrSet attrSet) {
- super(context, attrSet);
- initComponent(context);
- }
- /**
- * 构造函数(用于XML布局文件,带样式)
- */
- public LoadingComponent(Context context, AttrSet attrSet, String styleName) {
- super(context, attrSet, styleName);
- initComponent(context);
- }
- private void initComponent(Context context) {
- // 设置全屏布局属性
- setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
- setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
- setAlignment(LayoutAlignment.CENTER);
- setOrientation(VERTICAL);
-
- // 使用布局文件加载内容
- contentLayout = LayoutScatter.getInstance(context)
- .parse(ResourceTable.Layout_layout_loading_dialog, null, false);
- // 将内容布局添加到根布局中
- addComponent(contentLayout);
-
- // 获取图片组件
- Component imageComponent = contentLayout.findComponentById(ResourceTable.Id_loading_image);
- if (imageComponent instanceof Image) {
- loadingImage = (Image) imageComponent;
- // 创建旋转动画
- initRotationAnimation();
- }
-
- // 默认隐藏
- setVisibility(HIDE);
- }
-
- /**
- * 初始化旋转动画
- */
- private void initRotationAnimation() {
- if (loadingImage == null) {
- return;
- }
-
- // 先设置初始旋转角度为0
- loadingImage.setRotation(0f);
-
- // 创建旋转动画属性
- rotationAnimator = loadingImage.createAnimatorProperty();
- // 设置旋转动画(从当前位置旋转360度)
- rotationAnimator.rotate(360f);
- // 设置动画持续时间(2秒)
- rotationAnimator.setDuration(2000);
- // 不设置无限循环,而是通过监听器手动控制
- rotationAnimator.setLoopedCount(1);
- // 设置动画曲线为线性(匀速旋转)
- rotationAnimator.setCurveType(Animator.CurveType.LINEAR);
-
- // 添加动画状态监听器,在每次动画结束后重新启动
- rotationAnimator.setStateChangedListener(new Animator.StateChangedListener() {
- @Override
- public void onStart(Animator animator) {
- }
-
- @Override
- public void onStop(Animator animator) {
- }
-
- @Override
- public void onCancel(Animator animator) {
- }
-
- @Override
- public void onEnd(Animator animator) {
- // 每次动画结束时重置旋转角度为0,然后重新启动
- if (loadingImage != null && rotationAnimator != null && getVisibility() == VISIBLE) {
- loadingImage.setRotation(0f);
- // 延迟一小段时间后重新启动动画,实现连续旋转
- EventHandler mainHandler = new EventHandler(EventRunner.getMainEventRunner());
- mainHandler.postTask(() -> {
- if (rotationAnimator != null && loadingImage != null && getVisibility() == VISIBLE) {
- rotationAnimator.start();
- }
- }, 10);
- }
- }
-
- @Override
- public void onPause(Animator animator) {
- }
-
- @Override
- public void onResume(Animator animator) {
- }
- });
- }
-
- /**
- * 显示Loading
- */
- public void show() {
- setVisibility(VISIBLE);
- // 延迟启动旋转动画,确保组件已完全渲染
- EventHandler mainHandler = new EventHandler(EventRunner.getMainEventRunner());
- mainHandler.postTask(() -> {
- if (rotationAnimator != null && loadingImage != null) {
- // 重置旋转角度
- loadingImage.setRotation(0f);
- // 如果动画正在运行,先停止
- if (rotationAnimator.isRunning()) {
- rotationAnimator.stop();
- }
- // 启动动画
- rotationAnimator.start();
- }
- }, 100);
- }
-
- /**
- * 隐藏Loading
- */
- public void hide() {
- setVisibility(HIDE);
- // 停止旋转动画
- if (rotationAnimator != null && rotationAnimator.isRunning()) {
- rotationAnimator.stop();
- }
- }
-
- /**
- * 是否正在显示
- */
- public boolean isShowing() {
- return getVisibility() == VISIBLE;
- }
- }
|