转载请标明出处:http://blog.csdn.net/scuyttyuuy123/article/details/51570898
最近一直在研究自定义View和属性动画,懂的多了感觉一些效果实现起来也满简单的,就自己造了一个轮子造福大家
这次要实现的是自定义❤型view,代码生成之后在一段时间内淡出且删除
效果是这样的:
那么怎么实现呢?难点其实就两个:
- 怎么画❤型
- 怎么实现动画效果
首先画❤型
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 重置画板
path.reset();
// 路径的起始点
path.moveTo(px, py - 5 * rate);
// 根据心形函数画图
for (double i = 0; i <= 2 * Math.PI; i += 0.001) {
float x = (float) (16 * Math.sin(i) * Math.sin(i) * Math.sin(i));
float y = (float) (13 * Math.cos(i) - 5 * Math.cos(2 * i) - 2 * Math.cos(3 * i) - Math.cos(4 * i));
x *= rate;
y *= rate;
x = px - x;
y = py - y;
path.lineTo(x, y);
}
canvas.drawPath(path, paint);
}
动画效果的实现
PropertyValuesHolder fadeAnim = PropertyValuesHolder.ofFloat("alpha", fromAlpha,
toAlpha);
PropertyValuesHolder transAnim = PropertyValuesHolder.ofFloat("y", -mDistance);
PropertyValuesHolder scaleXAnim = PropertyValuesHolder.ofFloat("scaleX", fromScale,toScale);
PropertyValuesHolder scaleYAnim = PropertyValuesHolder.ofFloat("scaleY", fromScale,toScale);
ValueAnimator animator=ObjectAnimator.ofPropertyValuesHolder(this,fadeAnim,transAnim,scaleXAnim,scaleYAnim);
animator.setDuration(mDuration);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
//remove heartView form parent
ViewGroup group= (ViewGroup) getParent();
if (group!=null)
group.removeView((View) ((ObjectAnimator)animation).getTarget());
}
});
从代码可以看到只有四个简单的属性动画,使用的是PropertyValuesHolder,其实这样写动画还更简单。在动画结束时使用parent.remove(childView)
方法对view进行移除,这样就能达到我们想要的效果而且不会造成OOM.