26

所以我一直遇到动画问题,特别是当两个动画同时发生或在活动加载时发生。我知道这可能是一个资源问题,并且主线程中发生了很多事情,导致动画卡顿。

我发现了一些有趣的建议:
1. Threads (ThreadPoolExecutor)
此处: 如何使我的动画更流畅 Android
2. setDrawingCacheEnabled(true)
此处: Android 的 setDrawingCacheEnabled() 是如何工作的?
3. ViewGroup:animationCache = true
这里http ://www.curious-creature.org/2010/12/02/android-graphics-animations-and-tips-tricks/

但是我还没有找到任何类型的例子来实现这些东西。有任何想法吗?

4

2 回答 2

9

在减少口吃时,遵循按重要性顺序列出的这些规则,我已经减少了动画的口吃量:

  1. 不要在onCreate,onStart或中启动动画onResume
  2. 在用户事件上启动动画,例如onClick并禁用触摸事件,直到动画完成。
  3. 不要同时启动超过 2 个动画。
于 2012-10-18T18:39:33.753 回答
1

如果您使用动画,则应遵循 android文档;事实上,在某些情况下,您可能需要将片段转换推迟一小段时间。例如,在我的情况下,我需要推迟我的动画,直到我的视图模型返回一些数据:

postponeEnterTransition()在进入片段onViewCreated()方法中使用:

public class A extends Fragment {

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        ...
        postponeEnterTransition();
    }
}

一旦数据准备好开始转换,调用startPostponedEnterTransition()

public class A extends Fragment {

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        postponeEnterTransition();

        final ViewGroup parentView = (ViewGroup) view.getParent();
        // Wait for the data to load
        viewModel.getData()
            .observe(getViewLifecycleOwner(), new Observer<List<String>>() {
                @Override
                public void onChanged(List<String> list) {
                    // Set the data on the RecyclerView adapter
                    adapter.setData(list);
                    // Start the transition once all views have been
                    // measured and laid out
                    parentView.getViewTreeObserver()
                        .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                            parentView.getViewTreeObserver()
                                .removeOnPreDrawListener(this);
                            startPostponedEnterTransition();
                            return true;
                        });
                }
        });
    }
}
于 2020-11-21T15:11:33.273 回答