所以我一直遇到动画问题,尤其是当两个动画同时发生或加载活动时。我知道这可能是资源问题,主线程中发生了很多事情,导致动画卡顿。
我发现了几个有趣的建议:
1. 线程(线程池执行器)
这里:如何让我的动画更流畅 安卓
2. 设置绘图缓存启用(真)
这里:Android 的 setDrawingCacheEnabled() 是如何工作的?
3. 视图组:动画缓存 = 真
在这里: http://www.curious-creature.org/2010/12/02/android-graphics-animations-and-tips-tricks/
但是,我无法找到任何示例来实现这些事情。有什么想法吗?
在减少卡顿时,我遵循按重要性顺序列出的这些规则,减少了动画中的卡顿量:
- 不要在
onCreate
、onStart
或onResume
中启动动画。 - 在用户事件(如
onClick
)上启动动画,并禁用触摸事件,直到动画完成。 - 不要同时启动超过 2 个动画。
如果您使用的是动画,则应遵循 android 文档; 事实上,在某些情况下,您可能需要将片段过渡推迟一小段时间。例如,在我的情况下,我需要推迟我的动画,直到我的视图模型返回一些数据:
在输入片段onViewCreated()
方法中使用postponeEnterTransition()
:
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;
});
}
});
}
}