CircularReveal 动画在第一次尝试时不起作用
CircularReveal animation doesn't work on first attempt
在 android 5.0 中,我正在尝试使用圆形显示动画
问题
当我点击按钮开始展示动画时,第一次点击动画没有开始
第二次点击后正常
我的代码
public class MainActivity extends ActionBarActivity {
Animator a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View cardType = findViewById(R.id.cardtype);
cardType.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
a = ViewAnimationUtils.createCircularReveal(cardType,
cardType.getWidth(),
cardType.getHeight(),
0,
cardType.getHeight() * 2)
.setDuration(2500);
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
cardType.setVisibility(View.VISIBLE);
}
});
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
cardType.setVisibility(View.GONE);
}
});
findViewById(R.id.icon_first_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
a.start();
}
});
}
}}
我没有试过你的代码,但我认为你有一个小的订购问题。我想你只需要在 开始动画之前设置 cardType
可见 。
编辑添加:
...您应该设置按钮 View.INVISIBLE,而不是 View.GONE。
此处:This code works.
再次编辑添加:
是的。您的问题是您最初设置了 GONE 视图。这意味着它的大小为 0。然后使用 cardType.getHeight
和 cardType.getWidth
作为显示坐标。它们是 0。您将要首先将视图设置为 INVISIBLE,然后使用 width/2 和 height/2 作为显示的中心。
解决方案是不要直接将值获取到代码中
将动画代码放在点击上并将值放在 onclick 之外
或者从其他 activity
获取值
我所说的值是指 cardType.getWidth()
和 cardType.getHeight()
基本上其他人的回答是正确的,但问题是如果你想要可见性消失(因为你的布局要求它消失!)你必须在 xml 中设置可见性 INVISIBLE,高度为 0dp(and/or width 0dp as well) 并以编程方式设置正确的 LayoutParams 即使在点击事件中它也会起作用。例如我的代码:
...
expandButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//To not have empty scroll, the container is INVISIBLE with 0dp height.
//Otherwise the Reveal effect will not work at the first click.
//Here I set the parameters programmatically.
viewContainer.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
if (viewContainer.getVisibility() == View.VISIBLE) {
expandButton.animate().rotation(0f).setDuration(duration).start();
Utils.unReveal(viewContainer, 0, 0);
} else {
expandButton.animate().rotation(180f).setDuration(duration).start();
Utils.reveal(viewContainer, viewContainer.getWidth(), 0);
}
}
});
...
@TargetApi(VERSION_CODES.LOLLIPOP)
public static void reveal(final View view, int cx, int cy) {
if (!hasLollipop()) {
view.setVisibility(View.VISIBLE);
return;
}
//Get the final radius for the clipping circle
int finalRadius = Math.max(view.getWidth(), view.getHeight());
//Create the animator for this view (the start radius is zero)
Animator animator =
ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
//Make the view VISIBLE and start the animation
view.setVisibility(View.VISIBLE);
animator.start();
}
@TargetApi(VERSION_CODES.LOLLIPOP)
public static void unReveal(final View view, int cx, int cy) {
if (!hasLollipop()) {
view.setVisibility(View.GONE);
return;
}
//Get the initial radius for the clipping circle
int initialRadius = view.getWidth();
//Create the animation (the final radius is zero)
Animator animator =
ViewAnimationUtils.createCircularReveal(view, cx, cy, initialRadius, 0);
//Make the view GONE when the animation is done
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
//Start the animation
animator.start();
}
如果你在xml中只设置GONE,第一次将永远不会工作,因为height/width/x/y/etc..都是0。另外,如果你只是在调用动画之前设置INVISIBLE,它将not 也能正常工作,但如果您以可见性 INVISIBLE 开始,它将初始化布局参数。
我所做的是,就像我有两个高度相同的视图,因为我们现在可见性消失了 returns 0 {高度和宽度} 比我每次都提供可见视图高度及其对我的工作。
在 android 5.0 中,我正在尝试使用圆形显示动画
问题
当我点击按钮开始展示动画时,第一次点击动画没有开始
第二次点击后正常
我的代码
public class MainActivity extends ActionBarActivity {
Animator a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View cardType = findViewById(R.id.cardtype);
cardType.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
a = ViewAnimationUtils.createCircularReveal(cardType,
cardType.getWidth(),
cardType.getHeight(),
0,
cardType.getHeight() * 2)
.setDuration(2500);
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
cardType.setVisibility(View.VISIBLE);
}
});
a.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
cardType.setVisibility(View.GONE);
}
});
findViewById(R.id.icon_first_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
a.start();
}
});
}
}}
我没有试过你的代码,但我认为你有一个小的订购问题。我想你只需要在 开始动画之前设置 cardType
可见 。
编辑添加:
...您应该设置按钮 View.INVISIBLE,而不是 View.GONE。
此处:This code works.
再次编辑添加:
是的。您的问题是您最初设置了 GONE 视图。这意味着它的大小为 0。然后使用 cardType.getHeight
和 cardType.getWidth
作为显示坐标。它们是 0。您将要首先将视图设置为 INVISIBLE,然后使用 width/2 和 height/2 作为显示的中心。
解决方案是不要直接将值获取到代码中
将动画代码放在点击上并将值放在 onclick 之外
或者从其他 activity
获取值
我所说的值是指 cardType.getWidth()
和 cardType.getHeight()
基本上其他人的回答是正确的,但问题是如果你想要可见性消失(因为你的布局要求它消失!)你必须在 xml 中设置可见性 INVISIBLE,高度为 0dp(and/or width 0dp as well) 并以编程方式设置正确的 LayoutParams 即使在点击事件中它也会起作用。例如我的代码:
...
expandButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//To not have empty scroll, the container is INVISIBLE with 0dp height.
//Otherwise the Reveal effect will not work at the first click.
//Here I set the parameters programmatically.
viewContainer.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
if (viewContainer.getVisibility() == View.VISIBLE) {
expandButton.animate().rotation(0f).setDuration(duration).start();
Utils.unReveal(viewContainer, 0, 0);
} else {
expandButton.animate().rotation(180f).setDuration(duration).start();
Utils.reveal(viewContainer, viewContainer.getWidth(), 0);
}
}
});
...
@TargetApi(VERSION_CODES.LOLLIPOP)
public static void reveal(final View view, int cx, int cy) {
if (!hasLollipop()) {
view.setVisibility(View.VISIBLE);
return;
}
//Get the final radius for the clipping circle
int finalRadius = Math.max(view.getWidth(), view.getHeight());
//Create the animator for this view (the start radius is zero)
Animator animator =
ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);
//Make the view VISIBLE and start the animation
view.setVisibility(View.VISIBLE);
animator.start();
}
@TargetApi(VERSION_CODES.LOLLIPOP)
public static void unReveal(final View view, int cx, int cy) {
if (!hasLollipop()) {
view.setVisibility(View.GONE);
return;
}
//Get the initial radius for the clipping circle
int initialRadius = view.getWidth();
//Create the animation (the final radius is zero)
Animator animator =
ViewAnimationUtils.createCircularReveal(view, cx, cy, initialRadius, 0);
//Make the view GONE when the animation is done
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
//Start the animation
animator.start();
}
如果你在xml中只设置GONE,第一次将永远不会工作,因为height/width/x/y/etc..都是0。另外,如果你只是在调用动画之前设置INVISIBLE,它将not 也能正常工作,但如果您以可见性 INVISIBLE 开始,它将初始化布局参数。
我所做的是,就像我有两个高度相同的视图,因为我们现在可见性消失了 returns 0 {高度和宽度} 比我每次都提供可见视图高度及其对我的工作。