Okay I'm trying to do a proper slide down animation. The view that slides down should push all views bellow it down in one smooth movement and again when it slides up all the views should follow in one smooth movement.
What I've tryed: In code:
LinearLayout lin = (LinearLayout)findViewById(R.id.user_list_container);
setLayoutAnimSlidedownfromtop(lin, this);
lin.addView(getLayoutInflater().inflate(R.layout.user_panel,null),0);
And:
public static void setLayoutAnimSlidedownfromtop(ViewGroup panel, Context ctx) {
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(100);
set.addAnimation(animation);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f
);
animation.setDuration(500);
set.addAnimation(animation);
LayoutAnimationController controller =
new LayoutAnimationController(set, 0.25f);
panel.setLayoutAnimation(controller);
}
My user_panel.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="vertical" >
<ImageView
android:layout_alignParentLeft="true"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/icon" />
</LinearLayout>
Top of main xml:
<LinearLayout
android:id="@+id/user_list_container"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/container"
android:layout_below="@+id/user_list_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
The problem with above approach is that when I start the animation first the empty space for the view is created and then the view slides down. I'd like it to slowly push all the other views down instead of doing it in one hard motion.
Thank you Warpzit! That was a very helpful answer. In my case, I was only trying to animate views with height that was wrap_content. I tried triggs two-line suggestion, but it didn't work in my case. (I didn't spend much time pursuing why.) I ended up using a slightly modified form of Warpzit's
ExpandCollapseAnimation
with his static method to determine the height of the viewIn slightly more detail:
setHeightForWrapContent()
in theExpandCollapseAnimation
class.setHeightForWrapContent()
in theExpandCollapseAnimation
constructor to properly determine the height of the view. To do this, I have to pass the activity in with the constructor.applyTransformation()
method, when the view is finally reduced to zero height, I return the view's height back to wrap_content. If you don't do this, and change the content of the view later, when you expand it the view will expand to the height previously determined.The code is here:
Thank you again, Warpzit!
So I ended up doing it myself with some help from: https://stackoverflow.com/a/9112691/969325. If it had been android 3.0 (http://developer.android.com/guide/topics/graphics/animation.html) I could have used property animation, but its not so I had to do that myself.
Here is what I ended up with:
Example ussage:
xml:
Edit:
Measure wrap_content height:
So in order to get this to work for wrap_content I measured the height of the view before I start the animation and then use this measured height as the actual height. Bellow is code for measuring height of the view and set this as the new height (I assume the view uses screen width, change according to your own needs):