自定义心型view,可自定义多种属性以及自动淡出动画效果

本文介绍如何在Android中自定义一个心型View,并实现淡出动画效果。作者通过分析难点——绘制心型和动画实现,详细讲解了整个过程。文章提供了完整代码及源码下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请标明出处:http://blog.csdn.net/scuyttyuuy123/article/details/51570898

最近一直在研究自定义View和属性动画,懂的多了感觉一些效果实现起来也满简单的,就自己造了一个轮子造福大家

这次要实现的是自定义❤型view,代码生成之后在一段时间内淡出且删除

效果是这样的:

这里写图片描述

那么怎么实现呢?难点其实就两个:

  1. 怎么画❤型
  2. 怎么实现动画效果

首先画❤型

    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.

完整代码可见

源码下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值