java - 如何优化动画?

标签 java android android-animation smoothing

我有一个collapsingToolbarLayout,我想在用户展开/折叠 View 时制作一些动画。我在addOnOffsetChangedListener中添加了一些动画,但问题是动画不流畅。例如。折叠时 imageview 必须先横向扩展,然后再横向扩展 alpha。而且它也不必改变它的位置,所以为此我使用了 translationY。好吧,让我展示我的代码。我正在使用dataBinding

binding.appbar.addOnOffsetChangedListener((abLayout, offset) -> {
        // Scale out the image and alpha.
        float scale = 1 - ((float) Math.abs(offset)/abLayout.getTotalScrollRange());
        binding.image.setTranslationY(Math.abs(offset));
        binding.image.animate().scaleX(scale).scaleY(scale).alpha(scale);

        if (Math.abs(offset) == abLayout.getTotalScrollRange()) {
            binding.labelNewsTitleToolbar.setVisibility(View.VISIBLE);
            binding.labelNewsTitle.setVisibility(View.INVISIBLE);
        } else if (Math.abs(offset) < abLayout.getTotalScrollRange()) {
            binding.labelNewsTitle.setVisibility(View.VISIBLE);
            binding.labelNewsTitleToolbar.setVisibility(View.INVISIBLE);
        }
        if (offset == 0)
            binding.image.animate().scaleX(1.0f).scaleY(1.0f).alpha(1.0f);
    });

如何优化使其更流畅?当我更快地折叠 View 时,图像无法及时动画。

最佳答案

您尝试过使用线程吗?在重写的 run() 方法上尝试每秒调用它 60 次。我使用了下面的代码:

@Override
public void run() {
    double firstTime;
    double lastTime = System.nanoTime() / 1000000000d;
    double passedTime;
    double unprocessedTime = 0;
    deltaT = 0;
    while (running) {
        render = false;
        firstTime = System.nanoTime() / 1000000000d;
        passedTime = firstTime - lastTime;
        lastTime = firstTime;

        unprocessedTime += passedTime;
        frameTime += passedTime;
        //Frame time must be around 0.0166667
        if (frameTime <= 0.016667 && frameTime >= 0.01666) {
            deltaT = frameTime;
        }

        while (unprocessedTime >= UPDATE_CAP) {
            unprocessedTime -= UPDATE_CAP;
            render = true;

            if (frameTime >= 1d) {
                frameTime = 0;
                fps = frames;
                frames = 0;
            }
        }

        if (render) {
            //Render 
            //Call here the animation
            panel.repaint();
            frames++;
        }
    }
}

if(render) 语句内调用您的动画方法。 这对我来说效果很好,希望对你也有同样的效果。

关于java - 如何优化动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61267312/

相关文章:

Android 动画仅在 AsyncTask 完成后开始

java - 为什么我在 libGDX 中的纹理上出现黑色轮廓/边缘?

Java:在 Apache Commons Lang 3.3.2 中找不到 IntRange

java - 将 objective-c 代码转换为 java 会出现编译错误

android - 如何将 GLSurfaceView 渲染保存到文件?

android - 布局展开动画

java - 在php中从父类访问子属性

java - 具有正确端点的 Android BulkTransfer 没有响应

安卓定时器问题

android - 可以像在导航组件中一样在 android 中的首选项上添加动画