Android 圆形显示动画太快
Android circular reveal animation too fast
我在我的项目中使用了圆形显示动画,但它现在可以正常工作了。问题是显示发生得很快,你几乎看不到显示,因为它会立即扩展。我尝试设置 anim.setDuration()
但这并没有改变任何东西。我使用了 google 示例中的代码。
这是我的代码:
查看 myView = getActivity().findViewById(R.id.view_to_expand);
int cx = myView.getRight();
int cy = myView.getBottom();
int finalRadius = Math.max(myView.getWidth(), myView.getHeight());
Animator anim = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
myView.setVisibility(View.VISIBLE);
anim.start();
view_to_expand
是一个简单的相对布局,不要以为问题就在那里。另外,如何将圆形显示应用于动画过渡?
瞬时扩展是因为除了你的动画之外,主线程还有一些其他繁重的工作(数据更新,其他views/fragments隐藏,渲染刷新等)。
最好的办法是将它包装成一个可运行的并将其添加到堆栈中。当有可用的 CPU 循环时将调用它并显示您的动画。
下面是正确创建和使用可运行对象的方法。尽量不要 post 一个匿名的,因为有可能用户 return 和你的 runnable 挂起并暴露内存泄漏 and/or 抛出运行时异常。
我在这里假设你的 class 你的视图所在的地方是一个 activity 而你的 myView
是你的 activity
中的一个实例引用
public final ApplicationActivity extends Activity {
private View myView;
private final Runnable revealAnimationRunnable = new Runnable() {
@Override
public void run() {
int cx = myView.getRight();
int cy = myView.getBottom();
int finalRadius = Math.max(myView.getWidth(), myView.getHeight());
Animator animator = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
animator.start();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
myView = findViewById(R.id.view_to_expand);
myView.setVisibility(View.VISIBLE);
myView.post(revealAnimationRunnable);
// alternatively, in case load is way too big, you can post with delay
// i.e. comment above line and uncomment the one below
// myView.postDelayed(revealAnimationRunnable, 200);
}
@Override
protected void onDestroy() {
...
myView.removeCallbacks(revealAnimationRunnable);
}
}
我在我的项目中使用了圆形显示动画,但它现在可以正常工作了。问题是显示发生得很快,你几乎看不到显示,因为它会立即扩展。我尝试设置 anim.setDuration()
但这并没有改变任何东西。我使用了 google 示例中的代码。
这是我的代码: 查看 myView = getActivity().findViewById(R.id.view_to_expand);
int cx = myView.getRight();
int cy = myView.getBottom();
int finalRadius = Math.max(myView.getWidth(), myView.getHeight());
Animator anim = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
myView.setVisibility(View.VISIBLE);
anim.start();
view_to_expand
是一个简单的相对布局,不要以为问题就在那里。另外,如何将圆形显示应用于动画过渡?
瞬时扩展是因为除了你的动画之外,主线程还有一些其他繁重的工作(数据更新,其他views/fragments隐藏,渲染刷新等)。
最好的办法是将它包装成一个可运行的并将其添加到堆栈中。当有可用的 CPU 循环时将调用它并显示您的动画。
下面是正确创建和使用可运行对象的方法。尽量不要 post 一个匿名的,因为有可能用户 return 和你的 runnable 挂起并暴露内存泄漏 and/or 抛出运行时异常。
我在这里假设你的 class 你的视图所在的地方是一个 activity 而你的 myView
是你的 activity
public final ApplicationActivity extends Activity {
private View myView;
private final Runnable revealAnimationRunnable = new Runnable() {
@Override
public void run() {
int cx = myView.getRight();
int cy = myView.getBottom();
int finalRadius = Math.max(myView.getWidth(), myView.getHeight());
Animator animator = ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
animator.start();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
...
myView = findViewById(R.id.view_to_expand);
myView.setVisibility(View.VISIBLE);
myView.post(revealAnimationRunnable);
// alternatively, in case load is way too big, you can post with delay
// i.e. comment above line and uncomment the one below
// myView.postDelayed(revealAnimationRunnable, 200);
}
@Override
protected void onDestroy() {
...
myView.removeCallbacks(revealAnimationRunnable);
}
}