Android: slideUp y slideDown de views
Este código lo usé hace un par de años y lo tenía como borrador en el panel de WordPress porque supongo que en su día quería escribir algo, acabo de darme cuenta y por eso lo publico.
Con él se pueden preparar acordeones o zonas de información adicional que en primera instancia estén ocultas, por ejemplo. Me gustaría poder escribir algo más sobre esto, pero en realidad es suficientemente sencillo, tanto el código como el concepto, así que no puedo decir gran cosa : )
public static void slideDown(final View v) {
v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int targetHeight = v.getMeasuredHeight();
// En versiones anteriores a la 21, si el alto es < 1 se detiene la animación:
v.getLayoutParams().height = 1;
v.setVisibility(View.VISIBLE);
Animation a = new Animation(){
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1 ? ViewGroup.LayoutParams.WRAP_CONTENT : (int)(targetHeight * interpolatedTime);
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
int dps = (int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density);
a.setInterpolator(new AccelerateDecelerateInterpolator());
a.setDuration(4 * dps);
v.startAnimation(a);
}
public static void slideUp(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation a = new Animation(){
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
int dps = (int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density);
a.setInterpolator(new AccelerateDecelerateInterpolator());
a.setDuration(4 * dps);
v.startAnimation(a);
}