什么是加载动画效果
加载动画效果,顾名思义,就是在程序加载数据或者页面时,给用户一个视觉上的反馈,让用户知道当前操作正在进行中,从而提高用户体验,在Android开发中,实现加载动画效果可以帮助我们提升应用的交互体验,让用户在使用过程中感受到更加流畅的操作。
如何实现加载动画效果
1、使用ViewPager2和Fragment实现翻页动画
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:
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对象:
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