当前位置: 首页 > news >正文

自定义Property属性动画

同步发表于 http://avenwu.net/customlayout/2015/04/06/custom_property_animation/

代码获取
git clone https://github.com/avenwu/support.git 

在Android中动画的实现有许多不同选择,本文将扩展FrameLayout为其添加背景动画;

针对某个view做动画比较方便,这里通过自定义的属性来为一个容器类布局添加背景动画;

Property动画

思路

  1. 动画的原理本质就是修改属性值,然后根据新的值进行绘制;
  2. 采用ObjectAnimator,其内部实现了对值再给定时间内的变化处理;
  3. 定义代表缩放圆圈的半径属性,刷新视图;

实战

根据需要,先定义float型半径mRippleRadius,并提供相应地setter、getter

    private float mRippleRadius;
    private float getRadius() {
        return mRippleRadius;
    }

    private void setRadius(float radius) {
        this.mRippleRadius = radius;
    }

添加Property

    Property<BreathingDelegate, Float> mRadiusProperty = new Property<BreathingDelegate, Float>(Float.class, "mRippleRadius") {
        @Override
        public Float get(BreathingDelegate object) {
            return object.getRadius();
        }

        @Override
        public void set(BreathingDelegate object, Float value) {
            object.setRadius(value);
        }
    };

现在利用ObjectAnimator,实现mRippleRadius的变化,需要注意的是再每次值变化后,这里手动调用的invalidate保证视图会刷新;


            ObjectAnimator animator = ObjectAnimator.ofFloat(this, mRadiusProperty, mRippleRadius, mEndRadius);
        animator.setDuration(mDuration);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mTarget.invalidate();
            }
        });        

最后重载绘制方法,为容器绘制我们希望看到的背景

    public void onDraw(Canvas canvas) {
        mRippleRect.set(mBorderRect.centerX() - mRippleRadius, mBorderRect.centerY() - mRippleRadius,
                mBorderRect.centerX() + mRippleRadius, mBorderRect.centerY() + mRippleRadius);
        canvas.drawOval(mRippleRect, mPaint);
        Log.d("BreathingLayout", "onDraw=" + mRippleRect.toString());
    }

结语

ObjectAnimator/ValueAnimator不单单可以用在常规缩放,位移动画中,也可于再自定义的属性,以及在很多需要线性变化的地方。

转载于:https://www.cnblogs.com/avenwu/p/4812228.html

相关文章:

  • 阿里iconfont图标ttf转换为base64【非常详细】
  • 浏览器输入url以后所经历的过程
  • linux中DNS原理详解
  • 原型链的简单理解【关系到结论】
  • Qt中实现渐变动画效果
  • DOM树的理解【面试常问】
  • h5适配的解决方案【1】
  • class命名及前端部分规范【解决命名的疑问】
  • 小程序中使用彩色图标(阿里iconfont)
  • 前端新手引导的简单实现【Intro.js插件】
  • javascript闭包的理解及应用场景
  • 数组、链表、Hash(转)
  • 【微信小程序】小程序授权登录偶发性的解密失败原因及解决方案
  • 第一种感想
  • 【支付】uniapp之app中的支付宝、微信支付的实现及orderInfo的说明
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【Linux系统编程】快速查找errno错误码信息
  • Bootstrap JS插件Alert源码分析
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker容器管理
  • echarts花样作死的坑
  • gf框架之分页模块(五) - 自定义分页
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java方法详解
  • Java教程_软件开发基础
  • Meteor的表单提交:Form
  • mysql innodb 索引使用指南
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • rabbitmq延迟消息示例
  • Redis中的lru算法实现
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue中实现单选
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • windows下mongoDB的环境配置
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 大整数乘法-表格法
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 目录与文件属性:编写ls
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 说说我为什么看好Spring Cloud Alibaba
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #includecmath
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (done) 两个矩阵 “相似” 是什么意思?
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (SpringBoot)第七章:SpringBoot日志文件
  • (WSI分类)WSI分类文献小综述 2024
  • (zt)最盛行的警世狂言(爆笑)
  • (七)Java对象在Hibernate持久化层的状态
  • (转)程序员疫苗:代码注入