Имам LinearLayout
, който искам да покажа или скрия с помощта на Animation
, която избутва макета нагоре или надолу, когато променям видимостта му.
Видях няколко примера, но нито един от тях не отговаря на моите нужди.
Създадох два xml файла за анимациите, но не знам как да ги стартирам, когато променям видимостта на LinearLayout
.
С новия API за анимации, въведен в Android 3.0 (Honeycomb), е много лесно да се създават такива анимации.
Плъзгане на View
надолу на определено разстояние:
view.animate().translationY(distance);
По-късно можете да плъзнете View
обратно до първоначалната му позиция по следния начин:
view.animate().translationY(0);
Можете също така лесно да комбинирате няколко анимации. Следващата анимация ще плъзне View
надолу по височината му и едновременно с това ще го избледнее:
// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);
// Start the animation
view.animate()
.translationY(view.getHeight())
.alpha(1.0f)
.setListener(null);
След това можете да избледнеете отново и да плъзнете View
обратно до първоначалната му позиция. Също така задаваме AnimatorListener
, за да можем да зададем видимостта на View
обратно на GONE
, след като анимацията приключи:
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Можете да стартирате правилната Анимация
, когато видимостта на LinearLayout
се промени, като създадете нов подклас на LinearLayout
и наложите setVisibility()
, за да стартирате Анимациите
. Помислете за нещо подобно:
public class SimpleViewAnimator extends LinearLayout
{
private Animation inAnimation;
private Animation outAnimation;
public SimpleViewAnimator(Context context)
{
super(context);
}
public void setInAnimation(Animation inAnimation)
{
this.inAnimation = inAnimation;
}
public void setOutAnimation(Animation outAnimation)
{
this.outAnimation = outAnimation;
}
@Override
public void setVisibility(int visibility)
{
if (getVisibility() != visibility)
{
if (visibility == VISIBLE)
{
if (inAnimation != null) startAnimation(inAnimation);
}
else if ((visibility == INVISIBLE) || (visibility == GONE))
{
if (outAnimation != null) startAnimation(outAnimation);
}
}
super.setVisibility(visibility);
}
}
if (filter_section.getVisibility() == View.GONE) {
filter_section.animate()
.translationY(filter_section.getHeight()).alpha(1.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
filter_section.setVisibility(View.VISIBLE);
filter_section.setAlpha(0.0f);
}
});
} else {
filter_section.animate()
.translationY(0).alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
filter_section.setVisibility(View.GONE);
}
});
}