之前看了一款有点黄的17app底角的爱心各种乱飞,好奇这种效果的实现方式,恰巧看到这篇文章:程序亦非猿:一步一步教你实现Periscope点赞效果,遂按照其思路实现了一个落叶飘零的效果,如下动图:
实现的要点如下:
- 值动画的使用
- 贝塞尔公式估值器的设置
- 落叶的起点、途径点、终点处理
- Activity退出时动画和子线程的处理,防止内存泄露
实现步骤:
① 控件初始化添加叶子集合和补间器集合
public FloatLeafLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mLeafs = new Drawable[]{getResources().getDrawable(R.mipmap.leaf_1),
getResources().getDrawable(R.mipmap.leaf_2),
getResources().getDrawable(R.mipmap.leaf_3),
getResources().getDrawable(R.mipmap.leaf_4)};
mInterpolator = new Interpolator[]{
new AccelerateDecelerateInterpolator(),
new AccelerateInterpolator(),
new DecelerateInterpolator(),
new LinearInterpolator()};
}
② onMeasure()测出宽高,并且添加树,树的图片做了缩放处理
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(mWidthSize = measure(widthMeasureSpec), mHeightSize = measure(heightMeasureSpec));
if (getChildCount() == 0) {
addTree(mWidthSize, mHeightSize);
}
}
private int measure(int measureSpec) {
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = dip2px(getContext(), 300);
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
private void