Циркулярная анимация не срабатывает при первой попытке
В 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();
}
});
}
}}
Ответы
Ответ 1
Я не пробовал ваш код, но думаю, что у вас небольшая проблема с заказом. Я думаю, вам просто нужно установить cardType
видимым перед началом анимации.
Отредактировано для добавления:
... и вы должны установить свою кнопку View.INVISIBLE, а не View.GONE.
Здесь: Этот код работает.
Отредактировано еще раз, чтобы добавить:
Да. Ваша проблема в том, что вы сначала установили представление GONE. Это означает, что он имеет размер 0. Затем используйте cardType.getHeight
и cardType.getWidth
в качестве раскрывающих координат. Они равны 0. Сначала вы хотите установить вид INVISIBLE, а затем использовать ширину /2 и высоту /2 как центр раскрытия.
Ответ 2
В основном, что говорят другие, это правильно, но проблема в том, что вы хотите видеть GONE (потому что ваш макет требует GONE!) вам нужно установить видимость INVIVIBLE в xml с высотой 0dp (и/или шириной 0dp, а также ) и программно установить правильные 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();
}
Если вы установите только GONE в xml, первый раз никогда не будет работать, потому что height/width/x/y/etc.. равны 0. Кроме того, если вы просто установите INVISIBLE перед вызовом анимации, он не будет работать также, но если вы начнете с видимости INVISIBLE, он инициализирует параметры макета.
Ответ 3
что я сделал, например, у меня есть два вида с одинаковой высотой. Поскольку мы теперь видимость ушла, возвращает 0 (высота и ширина), чем я каждый раз даю видимую высоту обзора и свою работу для меня.
Ответ 4
Решение не получает значения непосредственно в код
Либо поставить код анимации на клик, либо значения вне onclick
или получить значения от другой деятельности
По значениям я означает cardType.getWidth()
и cardType.getHeight()