我有一个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/