代码之家  ›  专栏  ›  技术社区  ›  Hayk Mkrtchyan

如何优化动画?

  •  0
  • Hayk Mkrtchyan  · 技术社区  · 5 年前

    我有一个 collapsingToolbarLayout 我想在用户展开/折叠视图时制作一些动画。我在中添加了一些动画 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);
        });
    

    如何优化它以使其更平滑?当我更快地折叠视图时,图像无法及时设置动画。

    0 回复  |  直到 5 年前
        1
  •  0
  •   JACOPO BERAGNOLI    5 年前

    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) 语句调用动画方法。

        2
  •  0
  •   ashakirov    5 年前

    你为什么不换衣服 alpha scale 规模 变量取决于偏移量,它从0变为1,所以我认为一切看起来都很顺利。

    binding.appbar.addOnOffsetChangedListener((abLayout, offset) -> {
        float scale = 1 - ((float) Math.abs(offset)/abLayout.getTotalScrollRange());
        binding.image.setTranslationY(Math.abs(offset));
        binding.image.setScaleX(scale)
        binding.image.setScaleY(scale)
        binding.image.setSAlpha(scale);
        ....
    }