If you came across a scenario where you need to slide out a view(Linear layout/Relative Layout) i.e. Slide animation while changing the visibility GONE to VISIBLE and vice versa, you may use this code snippet
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.LinearLayout;
public class CustomSlideAnimation extends Animation {
public final static int COLLAPSE = 1;
public final static int EXPAND = 0;
private View mView;
private int mEndHeight;
private int mType;
private LinearLayout.LayoutParams mLayoutParams;
public CustomSlideAnimation(View view, int duration, int type) {
setDuration(duration);
mView = view;
mEndHeight = mView.getHeight();
mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams());
mType = type;
if(mType == EXPAND) {
mLayoutParams.height = 0;
} else {
mLayoutParams.height = LayoutParams.WRAP_CONTENT;
}
view.setVisibility(View.VISIBLE);
}
public int getHeight(){
return mView.getHeight();
}
public void setHeight(int height){
mEndHeight = height;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
if (interpolatedTime < 1.0f) {
if(mType == EXPAND) {
mLayoutParams.height = (int)(mEndHeight * interpolatedTime);
} else {
mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime));
}
mView.requestLayout();
} else {
if(mType == EXPAND) {
mLayoutParams.height = LayoutParams.WRAP_CONTENT;
mView.requestLayout();
}else{
mView.setVisibility(View.GONE);
}
}
}
}
Provide animation to the layout in the button's Click Listener to provide the Custom Slide Animation as shown below.
button.setOnClickListener(new OnClickListener() {
int height;
@Override
public void onClick(View arg0) {
if (layout.getVisibility() == View.VISIBLE && status == 0) {
CustomSlideAnimation a = new CustomSlideAnimation(replyLayout,
1000, CustomSlideAnimation.COLLAPSE);
height = a.getHeight();
layout.startAnimation(a);
status = 1;
} else {
CustomSlideAnimation a = new CustomSlideAnimation(replyLayout,
1000, CustomSlideAnimation.EXPAND);
a.setHeight(height);
layout.startAnimation(a);
status = 0;
}
}
});
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.LinearLayout;
public class CustomSlideAnimation extends Animation {
public final static int COLLAPSE = 1;
public final static int EXPAND = 0;
private View mView;
private int mEndHeight;
private int mType;
private LinearLayout.LayoutParams mLayoutParams;
public CustomSlideAnimation(View view, int duration, int type) {
setDuration(duration);
mView = view;
mEndHeight = mView.getHeight();
mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams());
mType = type;
if(mType == EXPAND) {
mLayoutParams.height = 0;
} else {
mLayoutParams.height = LayoutParams.WRAP_CONTENT;
}
view.setVisibility(View.VISIBLE);
}
public int getHeight(){
return mView.getHeight();
}
public void setHeight(int height){
mEndHeight = height;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
if (interpolatedTime < 1.0f) {
if(mType == EXPAND) {
mLayoutParams.height = (int)(mEndHeight * interpolatedTime);
} else {
mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime));
}
mView.requestLayout();
} else {
if(mType == EXPAND) {
mLayoutParams.height = LayoutParams.WRAP_CONTENT;
mView.requestLayout();
}else{
mView.setVisibility(View.GONE);
}
}
}
}
Provide animation to the layout in the button's Click Listener to provide the Custom Slide Animation as shown below.
button.setOnClickListener(new OnClickListener() {
int height;
@Override
public void onClick(View arg0) {
if (layout.getVisibility() == View.VISIBLE && status == 0) {
CustomSlideAnimation a = new CustomSlideAnimation(replyLayout,
1000, CustomSlideAnimation.COLLAPSE);
height = a.getHeight();
layout.startAnimation(a);
status = 1;
} else {
CustomSlideAnimation a = new CustomSlideAnimation(replyLayout,
1000, CustomSlideAnimation.EXPAND);
a.setHeight(height);
layout.startAnimation(a);
status = 0;
}
}
});