android怎么实现加载动画效果

什么是加载动画效果

加载动画效果,顾名思义,就是在程序加载数据或者页面时,给用户一个视觉上的反馈,让用户知道当前操作正在进行中,从而提高用户体验,在Android开发中,实现加载动画效果可以帮助我们提升应用的交互体验,让用户在使用过程中感受到更加流畅的操作。

如何实现加载动画效果

1、使用ViewPager2和Fragment实现翻页动画

android怎么实现加载动画效果

ViewPager2是Android官方推荐的一个高性能的View组件,它可以实现类似于ViewPager的滑动翻页效果,通过结合Fragment的使用,我们可以轻松地为ViewPager2添加自定义的翻页动画效果。

需要在项目的build.gradle文件中添加ViewPager2的依赖:

dependencies {
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
}

创建一个自定义的Fragment类,继承自Fragment,并重写onCreateView方法,在其中绘制自定义的翻页动画效果,我们可以创建一个简单的淡入淡出动画效果:

public class CustomFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_custom, container, false);
        ImageView imageView = view.findViewById(R.id.imageView);
        imageView.setAlpha(0f); // 初始状态透明度为0
        return view;
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                imageView.setAlpha(1f); // 开始动画时设置透明度为1,即完全显示出来
            }
        }.startOnAnimation(view); // 为View设置动画监听器
    }
}

接下来,在Activity中使用ViewPager2和自定义的Fragment:

android怎么实现加载动画效果

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
        viewPager2.setAdapter(new CustomFragmentAdapter()); // 为ViewPager2设置适配器,包含自定义Fragment实例列表
    }
}

这样,当用户滑动ViewPager2时,就会看到自定义的淡入淡出动画效果,当然,你可以根据需要替换为其他类型的动画效果。

2、使用Handler和Runnable实现定时刷新动画效果

另一种实现加载动画效果的方法是使用Handler和Runnable结合定时任务来实现,这种方法的优点是简单易用,但缺点是性能相对较差。

在Activity或Fragment中创建一个Handler对象:

android怎么实现加载动画效果

private static final int SHOW_LOADING_ANIMATION = R.anim.show_loading_animation; // 显示加载动画的资源ID
private static final int HIDE_LOADING_ANIMATION = R.anim.hide_loading_animation; // 隐藏加载动画的资源ID
private static final long SHOW_LOADING_DELAY = 1000; // 显示加载动画的延迟时间(毫秒)
private static final long HIDE_LOADING_DELAY = 500; // 隐藏加载动画的延迟时间(毫秒)
private static final int SHOW_LOADING_DURATION = 300; // 显示加载动画的持续时间(毫秒)
private static final int HIDE_LOADING_DURATION = 100; // 隐藏加载动画的持续时间(毫秒)
private static final int REMAINING_RETRY_TIMES = 3; // 每次失败后重新尝试的次数限制
private static final long RETRY_INTERVAL = 1000; // 每次重新尝试的时间间隔(毫秒)
private boolean isLoading = false; // 是否正在显示加载动画的状态标志位
private int remainingRetryTimes = REMAINING_RETRY_TIMES; // 每次失败后重新尝试的次数剩余值
private long startTime = System.currentTimeMillis(); // 最后一次请求开始的时间戳(毫秒)
private long currentDelayTime = SHOW_LOADING_DELAY; // 目前等待显示加载动画的时间间隔(毫秒)
private final Object lock = new Object(); // 用于同步的对象锁
private boolean isShowingLoadingAnimation = false; // 是否正在显示加载动画的状态标志位(内部使用)
private boolean hasFinishedLoading = false; // 是否已经完成加载的状态标志位(内部使用)
private AnimationDrawable loadingAnimationDrawable; // 用于显示加载动画的AnimationDrawable对象(内部使用)
private AnimationHandler animationHandler; // AnimationHandler对象,用于处理定时任务(内部使用)

接下来,定义一个AnimationHandler类,继承自Handler<Void>:

private class AnimationHandler extends Handler<Void> {
    private static final int SHOW_LOADING_ANIMATION = R.anim.show_loading_animation; // 显示加载动画的资源ID
    private static final int HIDE_LOADING_ANIMATION = R.anim.hide_loading_animation; // 隐藏加载动画的资源ID
    private static final long SHOW_LOADING_DELAY = SHOW_LOADING_DELAY * (remainingRetryTimes + (remainingRetryTimes % REMAINING_RETRY_TIMES == REMAINING_RETRY_TIMES && remainingRetryTimes > REMAINING_RETRY_TIMES)); // 根据剩余重试次数计算显示或隐藏加载动画的时间间隔(毫秒)
    private static final long HIDE_LOADING_DELAY = HIDE_LOADING_DELAY * (remainingRetryTimes + (remainingRetryTimes % REMAINING_RETRY_TIMES == REMAINING_RETRY_TIMES && remainingRetryTimes > REMAINING_RETRY_TIMES)); // 根据剩余重试次数计算显示或隐藏加载动画的时间间隔(毫秒)
    private static final int SHOW_LOADING_DURATION = SHOW_LOADING_DURATION * (remainingRetryTimes + (remainingRetryTimes % REMAINING_RETRY_TIMES == REMAINING_RETRY_TIMES && remainingRetryTimes > REMAINING_RETRY_TIMES)); // 根据剩余重试次数计算显示或隐藏加载动画的持续时间(毫秒)
    private static final int HIDE_LOADING_DURATION = HIDE_LOADING_DURATION * (remainingRetryTimes + (remainingRetryTimes % REMAINING_RETRY_TIMES == REMAINING_RETRY_TIMES && remainingRetryTimes > REMAINING_RETRY_TIMES)); // 根据剩余重试次数计算显示或隐藏加载动画的持续时间(毫秒)

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/159944.html

(0)
K-seoK-seoSEO优化员
上一篇 2023年12月23日 19:37
下一篇 2023年12月23日 19:39

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入