绘制点在爱心的图片
package com.example.administrator.testbeisaier.view;
import android.content.Context;}
添加爱心然后让其执行动画
package com.example.administrator.testbeisaier.view;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.example.administrator.testbeisaier.R;
import java.util.Random;
/**
* Created by Administrator on 2017/8/29 0029.
*/
public class FavourLayout extends RelativeLayout {
int mWidth,mHeight;
private LayoutParams layoutParams;
public FavourLayout(Context context) {
super(context);
}
public FavourLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.e("zjun,","onSizeChanged...");
mHeight=h;
mWidth=w;
Log.e("zjun","w:"+w+" h:"+h);
layoutParams =new LayoutParams(w,h);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
setLayoutParams(layoutParams);
}
public void addView(){ //在外面的触发事件,例如点赞
Log.e("zjun","addV");
final FavourHeartView favourHeartView= new FavourHeartView(getContext());
favourHeartView.setOnDrawFinishListenr(new FavourHeartView.IsDrawFinishListenr() {
@Override
public void isDrawFinish(boolean isDrawFinish) {
if(isDrawFinish){
addBSEAnimator(favourHeartView);
}
}
});
addView(favourHeartView);
addAlpaAnimator(favourHeartView);
}
private void addAlpaAnimator(final View favourHeartView){
ObjectAnimator animator=ObjectAnimator.ofFloat(favourHeartView,"alpha",1.0f,0.1f).setDuration(2000);
animator.start();
}
private void addBSEAnimator(final View favourHeartView) {
ValueAnimator animator = getBezierValueAnimator(favourHeartView);
animator.start();
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
//因为不停的add 导致子view数量只增不减,所以在view动画结束后remove掉
removeView(favourHeartView);
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
}
private ValueAnimator getBezierValueAnimator(View favourHeartView) {
//初始化一个贝塞尔计算器- - 传入两个控制点
BezierEvaluator evaluator = new BezierEvaluator(getPointF(2), getPointF(1));
//这里最好画个图 理解一下 传入了起点 和 终点
ValueAnimator animator = ValueAnimator.ofObject(evaluator, new PointF((mWidth - favourHeartView.getWidth()) / 2, mHeight - favourHeartView.getHeight()), new PointF((mWidth - favourHeartView.getWidth()) / 2, 0));
animator.addUpdateListener(new BezierListener(favourHeartView));
animator.setDuration(2000);
return animator;
}
/**
* 获取中间的两个 点
*
* @param scale
*/
private PointF getPointF(int scale) {
Random random = new Random();
PointF pointF = new PointF();
pointF.x = random.nextInt((mWidth - 100));//减去100 是为了控制 x轴活动范围,看效果 随意~~
//再Y轴上 为了确保第二个点 在第一个点之上,我把Y分成了上下两半 这样动画效果好一些 也可以用其他方法
pointF.y = random.nextInt((mHeight - 100)) / scale;
return pointF;
}
/**
*三杰曲线获取点
*/
public class BezierEvaluator implements TypeEvaluator
private PointF pointF1;
private PointF pointF2;
public BezierEvaluator(PointF pointF1,PointF pointF2){
this.pointF1 = pointF1;
this.pointF2 = pointF2;
}
@Override
public PointF evaluate(float time, PointF startValue,
PointF endValue) {
float timeLeft = 1.0f - time;
PointF point = new PointF();//结果
point.x = timeLeft * timeLeft * timeLeft * (startValue.x)
+ 3 * timeLeft * timeLeft * time * (pointF1.x)
+ 3 * timeLeft * time * time * (pointF2.x)
+ time * time * time * (endValue.x);
point.y = timeLeft * timeLeft * timeLeft * (startValue.y)
+ 3 * timeLeft * timeLeft * time * (pointF1.y)
+ 3 * timeLeft * time * time * (pointF2.y)
+ time * time * time * (endValue.y);
return point;
}
}
private class BezierListener implements ValueAnimator.AnimatorUpdateListener {
private View target;
public BezierListener(View target) {
this.target = target;
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//这里获取到贝塞尔曲线计算出来的的x y值 赋值给view 这样就能让爱心随着曲线走啦
PointF pointF = (PointF) animation.getAnimatedValue();
Log.e("zjun","pointF.x:"+pointF.x+" pointF.y"+pointF.y);
target.setX(pointF.x);
target.setY(pointF.y);
// 这里顺便做一个alpha动画
// target.setAlpha(1 - animation.getAnimatedFraction());
}
}
}