效果图有点赖,大家凑合看。
废话不多说,下面说一下我实现这个效果的步奏:
图片出现的时候有一个效果就是由小变大,为了使效果看起来更自然,我又加上了一个alpha的渐变。透明值 0-1.
2.在 1中的效果执行完之后,接下来就是一个自由落体的运动了。 自由落体运动速度是越来越快的,这个大家都知道,我也不多说了。要实现这个就得实时的改变 图片的 Y值,这里就要用 中学时 学的 物理公式了 h=1/2gt^2 ,忘了的百度去,为了使动画看起来自然我又加上了透明度的渐变动画
DropDownShitLayout
这个是整体的布局
DropDownTypeEvaluator
这个是属性动画里面的自定义的属性值,主要就是这个实现的自由落体的功能
下面上代码:
package com.dropdown.shit;
import java.util.Random;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.example.cicleprogrossbar.R;
public class DropDownShitLayout extends RelativeLayout{
int width,height;
public DropDownShitLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
Random random=new Random();
@SuppressLint("NewApi")
public void addShit(){
int shit[]={R.drawable.shit1,R.drawable.shit2,R.drawable.shit3,R.drawable.shit4,R.drawable.shit5};
final ImageView image=new ImageView(getContext());
image.setImageResource(shit[random.nextInt(shit.length)]);
addView(image);
AnimatorSet set=getAnimatorSet(image);
set.start();
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// TODO Auto-generated method stub
super.onAnimationEnd(animation);
removeView(image);
}
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
height = getMeasuredHeight();
width = getMeasuredWidth();
}
@SuppressLint("NewApi")
private AnimatorSet getAnimatorSet(final View view){
PointF start=new PointF(random.nextInt(width),random.nextInt(height/7));
view.setX(start.x);
view.setY(start.y);
PointF end=new PointF(start.x,height);
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(view,"alpha",0.2f,1f);
ObjectAnimator scaleX=ObjectAnimator.ofFloat(view, "scaleX",0.2f,1f);
ObjectAnimator scaleY=ObjectAnimator.ofFloat(view, "scaleY",0.2f,1f);
AnimatorSet startAnim=new AnimatorSet();
startAnim.playTogether(objectAnimator,scaleX,scaleY);
startAnim.setDuration(1000);
startAnim.setTarget(view);
//图片放大 透明度渐变
DropDownTypeEvaluator dropdown=new DropDownTypeEvaluator();
ObjectAnimator dropdownAnimator=ObjectAnimator.ofObject(view, "y", dropdown, start,end);
dropdownAnimator.setDuration(2000);
//dropdownAnimator.setInterpolator(new AccelerateInterpolator());
dropdownAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
// TODO Auto-generated method stub
PointF p=(PointF) arg0.getAnimatedValue();
view.setY(p.y);
}
});
//自由落体
AnimatorSet endAnim=new AnimatorSet();
endAnim.playSequentially(startAnim,dropdownAnimator);
//playSequentially 这句话是让 变大和 自由落体 串行执行
return endAnim;
}
}
package com.dropdown.shit;
import android.animation.TypeEvaluator;
import android.annotation.SuppressLint;
import android.graphics.PointF;
@SuppressLint("NewApi")
public class DropDownTypeEvaluator implements TypeEvaluator<PointF> {
@Override
public PointF evaluate(float t, PointF start, PointF end) {
// TODO Auto-generated method stub
PointF pointF = new PointF();
pointF.x=start.x;
//1/2gt^2
int g=10;
pointF.y=end.y*g*t*t+start.y;
return pointF;
}
}
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<com.dropdown.shit.DropDownShitLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1"
android:id="@+id/layout"
>
</com.dropdown.shit.DropDownShitLayout>
</RelativeLayout>
setContentView(R.layout.dropdownshit);
final Handler handler=new Handler();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
add();
}
});
}
}, 1000,200);
}
private void add(){
// TODO Auto-generated method stub
DropDownShitLayout add=(DropDownShitLayout) findViewById(R.id.layout);
add.addShit();
}