下弹动画的实现
下弹动画在很多应用都有使用,比如豌豆荚中的应用介绍界面,百度手机助手的应用介绍界面等。
只要熟悉android动画的使用接口,制作动画并不困难。 这里使用开源库nineoldandroids,其实和android3.0 以上直接使用动画接口是一样的。
实现效果
具体可以看youku动画:http://v.youku.com/v_show/id_XNjYyODgzNjQ4.html
PS, 搞了半天GIF 才能播放。原来是最大边不能太大了。原来图片尺寸太大,被默认转成jpg了。现在总算能看到效果了。
DropDownExample.java
package com.buptfarmer.devapp;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;
import com.nineoldandroids.animation.ValueAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
public class DropDownExample extends Activity implements OnClickListener {
private View mHolder;
private View mHolder2;
// private static final int DURATION = 2000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
}
private void initView() {
setContentView(R.layout.drop_down_example);
mHolder = findViewById(R.id.holder);
mHolder2 = findViewById(R.id.holder2);
mHolder.setOnClickListener(this);
mHolder2.setOnClickListener(this);
}
public static ValueAnimator createHeightAnimator(final View view, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height = value;
view.setLayoutParams(layoutParams);
}
});
// animator.setDuration(DURATION);
return animator;
}
public static void animateExpanding(final View view) {
view.setVisibility(View.VISIBLE);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthSpec, heightSpec);
ValueAnimator animator = createHeightAnimator(view, 0, view.getMeasuredHeight());
animator.start();
}
public static void animateCollapsing(final View view) {
int origHeight = view.getHeight();
ValueAnimator animator = createHeightAnimator(view, origHeight, 0);
animator.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
};
});
animator.start();
}
@Override
public void onClick(View v) {
if (v == mHolder) {
if (View.GONE == mHolder.findViewById(R.id.hiddenview).getVisibility()) {
animateExpanding(mHolder.findViewById(R.id.hiddenview));
} else {
animateCollapsing(mHolder.findViewById(R.id.hiddenview));
}
} else if (v == mHolder2) {
if (View.GONE == mHolder2.findViewById(R.id.hiddenview).getVisibility()) {
animateExpanding(mHolder2.findViewById(R.id.hiddenview));
} else {
animateCollapsing(mHolder2.findViewById(R.id.hiddenview));
}
}
}
}
drop_down_example.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="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/holder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/greenyellow"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="1dp" >
<ImageView
android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="picture"
android:minWidth="32dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/app_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:ellipsize="end"
android:gravity="left"
android:singleLine="true"
android:text="what's your dream?"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/hiddenview"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="1dp"
android:visibility="gone" >
<TextView
android:id="@+id/hidden_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="过个好年,马上有房" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/holder2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/blueviolet"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="1dp" >
<ImageView
android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="picture"
android:minWidth="32dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/app_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:ellipsize="end"
android:gravity="left"
android:singleLine="true"
android:text="Self introduction"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/hiddenview"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="1dp"
android:visibility="gone" >
<ImageView
android:contentDescription="avatar"
android:src="@drawable/avatar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<TextView
android:id="@+id/hidden_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="乐山好事,积极乐观" />
</LinearLayout>
</LinearLayout>
</LinearLayout>