【问题标题】:Android animation reduce stutter/choppy/lagAndroid动画减少口吃/断断续续/滞后
【发布时间】:2012-10-04 11:51:59
【问题描述】:

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

我发现了一些有趣的建议:
1. 线程(ThreadPoolExecutor)
这里: How do I make my animation smoother Android
2. setDrawingCacheEnabled(true)
这里: How does Android's setDrawingCacheEnabled() work?
3. ViewGroup:animationCache = true
这里http://www.curious-creature.org/2010/12/02/android-graphics-animations-and-tips-tricks/

但是我找不到任何类型的示例来实现这些东西。有什么想法吗?

【问题讨论】:

  • AsyncTasks 也是实现后台线程的简单方法。如果你在主线程中进行大量计算,你肯定需要实现线程或异步任务,主线程是为 UI 来的,而不是繁重的工作。
  • 是的,我知道,我更多的是寻找与 Threads/AsyncTasks 一起使用的动画示例

标签: android multithreading caching animation


【解决方案1】:

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

  1. 不要在onCreateonStartonResume 中启动动画。
  2. 针对onClick 等用户事件启动动画并禁用触摸事件,直到动画完成。
  3. 不要同时启动超过 2 个动画。

【讨论】:

  • 我们如何才能“拖拽用户交互直到动画完成。??”
  • 当你开始动画时,设置一个像 animStart = 1 这样的变量,并在你要处理按钮按下等时检查该变量。例如,如果你正在移动一个层,你不要'不希望用户在图层重新定位时按下按钮。所以设置变量,动画结束时取消设置
  • 实现它的最佳方法是什么?如果我需要在加载 Activity 时制作动画怎么办?
  • 我不确定你所说的“实现它的最佳方式”是什么意思,这真的是你想做的。至于第二部分。 IMO 你不应该在加载活动时制作动画。相反,在活动加载后触发动画,并将布局初始设置为一些图片或图标,让用户知道“事情正在发生”。示例:最初,一旦活动加载触发一个函数,该函数会为您想要的任何内容设置动画并覆盖/删除“忙碌图标”,该活动最初会加载一个微调器(忙碌图标)
  • @Rawr 我如何知道活动已完成加载?有听众吗?
【解决方案2】:

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

在进入片段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;
                        });
                }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多