Android属性动画从入门到精通

Android图表年度最强总结,一篇文章从入门到精通! 说到Android图表,不得不说一说MPAndroidChart这个强大的开源图表库,什么折线图、柱状图、饼图、气泡图、蜡烛图、混合图那是应有尽有! 阅读详情
安卓属性动画
        Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。
        自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。

***ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。


但是ValueAnimator的用法却一点都不复杂,我们先从最简单的功能开始,比如将一个值从0平滑过渡到1,时长300毫秒,就可以这样写:


    ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);

    anim.setDuration(300);

    anim.start();


调用ValueAnimator的ofFloat()方法就可以构建出一个ValueAnimator的实例,ofFloat()方法当中允许传入多个float类型的参数,这里传入0和1就表示将值从0平滑过渡到1,然后调用ValueAnimator的setDuration()方法来设置动画运行的时长,最后调用start()方法启动动画。


现在如果你运行一下上面的代码,动画就会执行了。可是这只是一个将值从0过渡到1的动画,又看不到任何界面效果,那么我们怎样才能知道这个动画是不是已经真正运行了呢?办法就是借助监听器实现了,代码如下:




     ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
     anim.setDuration(300);
     anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator animation) {
     float currentValue = (float) animation.getAnimatedValue();
     Log.d("TAG", "cuurent value is " + currentValue);
     }
     });
    anim.start();


可以看到,这里我们通过addUpdateListener()方法来添加一个动画的监听器,在动画执行的过程中会不断地进行回调,我们只需要在回调方法当中将当前的值取出并打印出来,就可以知道动画有没有真正运行了。运行上述代码,控制台打印如下所示:




从打印日志的值我们就可以看出,ValueAnimator确实已经在正常工作了,值在300毫秒的时间内从0平滑过渡到了1,而这个计算工作就是由ValueAnimator帮助我们完成的。另外ofFloat()方法当中是可以传入任意多个参数的,因此我们还可以构建出更加复杂的动画逻辑,比如说将一个值在5秒内从0过渡到5,再过渡到3,再过渡到10,就可以这样写:


  1. ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);  
  2. anim.setDuration(5000);  
  3. anim.start();  

当然也许你并不需要小数位数的动画过渡,可能你只是希望将一个整数值从0平滑地过渡到100,那么也很简单,只需要调用ValueAnimator的ofInt()方法就可以了,如下所示:

  1. ValueAnimator anim = ValueAnimator.ofInt(0, 100);  

ValueAnimator当中最常用的应该就是ofFloat()和ofInt()这两个方法了,另外还有一个ofObject()方法,我会在下篇文章进行讲解。


除此之外,我们还可以调用setStartDelay()方法来设置动画延迟播放的时间,调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思。此处不多做演示。


***ObjectAnimator


相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。


不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,这里如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:


  1. ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
  2. animator.setDuration(5000);  
  3. animator.start();  


可以看到,我们还是调用了ofFloat()方法来去创建一个ObjectAnimator的实例,只不过ofFloat()方法当中接收的参数有点变化了。这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个textview。第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变TextView的不透明度,因此这里传入"alpha"。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画,效果如下图所示:




学会了这一个用法之后,其它的用法我们就可以举一反三了,那比如说我们想要将TextView进行一次360度的旋转,就可以这样写:


  1. ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
  2. animator.setDuration(5000);  
  3. animator.start();  


可以看到,这里我们将第二个参数改成了"rotation",然后将动画的初始值和结束值分别设置成0和360,现在运行一下代码,效果如下图所示:




那么如果想要将TextView先向左移出屏幕,然后再移动回来,就可以这样写:


  1. float curTranslationX = textview.getTranslationX();  
  2. ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);  
  3. animator.setDuration(5000);  
  4. animator.start();  


这里我们先是调用了TextView的getTranslationX()方法来获取到当前TextView的translationX的位置,然后ofFloat()方法的第二个参数传入"translationX",紧接着后面三个参数用于告诉系统TextView应该怎么移动,现在运行一下代码,效果如下图所示:




然后我们还可以TextView进行缩放操作,比如说将TextView在垂直方向上放大3倍再还原,就可以这样写:


  1. ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
  2. animator.setDuration(5000);  
  3. animator.start();  


这里将ofFloat()方法的第二个参数改成了"scaleY",表示在垂直方向上进行缩放,现在重新运行一下程序,效果如下图所示:




到目前为止,ObjectAnimator的用法还算是相当简单吧,但是我相信肯定会有不少朋友现在心里都有同样一个疑问,就是ofFloat()方法的第二个参数到底可以传哪些值呢?目前我们使用过了alpha、rotation、translationX和scaleY这几个值,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画,那么还有哪些值是可以使用的呢?其实这个问题的答案非常玄乎,就是我们可以传入任意的值到ofFloat()方法的第二个参数当中。任意的值?相信这很出乎大家的意料吧,但事实就是如此。因为ObjectAnimator在设计的时候就没有针对于View来进行设计,而是针对于任意对象的,它所负责的工作就是不断地向某个对象中的某个属性进行赋值,然后对象根据属性值的改变再来决定如何展现出来。


那么比如说我们调用下面这样一段代码:


  1. ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);  


其实这段代码的意思就是ObjectAnimator会帮我们不断地改变textview对象中alpha属性的值,从1f变化到0f。然后textview对象需要根据alpha属性值的改变来不断刷新界面的显示,从而让用户可以看出淡入淡出的动画效果。


那么textview对象中是不是有alpha属性这个值呢?没有,不仅textview没有这个属性,连它所有的父类也是没有这个属性的!这就奇怪了,textview当中并没有alpha这个属性,ObjectAnimator是如何进行操作的呢?其实ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是:


  1. public void setAlpha(float value);  
  2. public float getAlpha();  


那么textview对象中是否有这两个方法呢?确实有,并且这两个方法是由View对象提供的,也就是说不仅TextView可以使用这个属性来进行淡入淡出动画操作,任何继承自View的对象都可以的。


既然alpha是这个样子,相信大家一定已经明白了,前面我们所用的所有属性都是这个工作原理,那么View当中一定也存在着setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()这些方法,不信的话你可以到View当中去找一下。


******组合动画


独立的动画能够实现的视觉效果毕竟是相当有限的,因此将多个动画组合到一起播放就显得尤为重要。幸运的是,Android团队在设计属性动画的时候也充分考虑到了组合动画的功能,因此提供了一套非常丰富的API来让我们将多个动画组合到一起。


实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • after(Animator anim)   将现有动画插入到传入的动画之后执行
  • after(long delay)   将现有动画延迟指定毫秒后执行
  • before(Animator anim)   将现有动画插入到传入的动画之前执行
  • with(Animator anim)   将现有动画和传入的动画同时执行

好的,有了这四个方法,我们就可以完成组合动画的逻辑了,那么比如说我们想要让TextView先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:


  1. ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
  2. ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
  3. ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
  4. AnimatorSet animSet = new AnimatorSet();  
  5. animSet.play(rotate).with(fadeInOut).after(moveIn);  
  6. animSet.setDuration(5000);  
  7. animSet.start();  

可以看到,这里我们先是把三个动画的对象全部创建出来,然后new出一个AnimatorSet对象之后将这三个动画对象进行播放排序,让旋转和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画。运行一下上述代码,效果如下图所示:




**Animator监听器


在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。


大家已经知道,ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAnimator还是ObjectAnimator都是可以使用addListener()这个方法的。另外AnimatorSet也是继承自Animator的,因此addListener()这个方法算是个通用的方法。


添加一个监听器的代码如下所示:


  1. anim.addListener(new AnimatorListener() {  
  2.     @Override  
  3.     public void onAnimationStart(Animator animation) {  
  4.     }  
  5.   
  6.     @Override  
  7.     public void onAnimationRepeat(Animator animation) {  
  8.     }  
  9.   
  10.     @Override  
  11.     public void onAnimationEnd(Animator animation) {  
  12.     }  
  13.   
  14.     @Override  
  15.     public void onAnimationCancel(Animator animation) {  
  16.     }  
  17. });  


可以看到,我们需要实现接口中的四个方法,onAnimationStart()方法会在动画开始的时候调用,onAnimationRepeat()方法会在动画重复执行的时候调用,onAnimationEnd()方法会在动画结束的时候调用,onAnimationCancel()方法会在动画被取消的时候调用。


但是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:


  1. anim.addListener(new AnimatorListenerAdapter() {  
  2. });  

这里我们向addListener()方法中传入这个适配器对象,由于AnimatorListenerAdapter中已经将每个接口都实现好了,所以这里不用实现任何一个方法也不会报错。那么如果我想监听动画结束这个事件,就只需要单独重写这一个方法就可以了,如下所示:


  1. anim.addListener(new AnimatorListenerAdapter() {  
  2.     @Override  
  3.     public void onAnimationEnd(Animator animation) {  
  4.     }  
  5. });  


**使用XML编写动画


我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法。不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能。


通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。


如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。然后在XML文件中我们一共可以使用如下三种标签:

  • <animator>  对应代码中的ValueAnimator
  • <objectAnimator>  对应代码中的ObjectAnimator
  • <set>  对应代码中的AnimatorSet

那么比如说我们想要实现一个从0到100平滑过渡的动画,在XML当中就可以这样写:


  1. <animator xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:valueFrom="0"  
  3.     android:valueTo="100"  
  4.     android:valueType="intType"/>  
而如果我们想将一个视图的alpha属性从1变成0,就可以这样写:

  1. <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:valueFrom="1"  
  3.     android:valueTo="0"  
  4.     android:valueType="floatType"  
  5.     android:propertyName="alpha"/>  
其实XML编写动画在可读性方面还是挺高的,上面的内容相信不用我做解释大家也都看得懂吧。


另外,我们也可以使用XML来完成复杂的组合动画操作,比如将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:


  1. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:ordering="sequentially" >  
  3.   
  4.     <objectAnimator  
  5.         android:duration="2000"  
  6.         android:propertyName="translationX"  
  7.         android:valueFrom="-500"  
  8.         android:valueTo="0"  
  9.         android:valueType="floatType" >  
  10.     </objectAnimator>  
  11.   
  12.     <set android:ordering="together" >  
  13.         <objectAnimator  
  14.             android:duration="3000"  
  15.             android:propertyName="rotation"  
  16.             android:valueFrom="0"  
  17.             android:valueTo="360"  
  18.             android:valueType="floatType" >  
  19.         </objectAnimator>  
  20.   
  21.         <set android:ordering="sequentially" >  
  22.             <objectAnimator  
  23.                 android:duration="1500"  
  24.                 android:propertyName="alpha"  
  25.                 android:valueFrom="1"  
  26.                 android:valueTo="0"  
  27.                 android:valueType="floatType" >  
  28.             </objectAnimator>  
  29.             <objectAnimator  
  30.                 android:duration="1500"  
  31.                 android:propertyName="alpha"  
  32.                 android:valueFrom="0"  
  33.                 android:valueTo="1"  
  34.                 android:valueType="floatType" >  
  35.             </objectAnimator>  
  36.         </set>  
  37.     </set>  
  38.   
  39. </set>  
这段XML实现的效果和我们刚才通过代码来实现的组合动画的效果是一模一样的,每个参数的含义都非常清楚,相信大家都是一看就懂,我就不再一一解释了。


最后XML文件是编写好了,那么我们如何在代码中把文件加载进来并将动画启动呢?只需调用如下代码即可:


  1. Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
  2. animator.setTarget(view);  
  3. animator.start();  
调用AnimatorInflater的loadAnimator来将XML动画文件加载进来,然后再调用setTarget()方法将这个动画设置到某一个对象上面,最后再调用start()方法启动动画就可以了。



精通Android界面跳转动画的实现技巧 在Android系统中,Activity Transition动画是指在应用程序中,Activity从一个界面跳转到另一个界面时所展现的过渡效果。这些动画可以是淡入淡出、滑动、缩放等视觉效果,为用户带来了流畅且直观的视觉体验。动画不仅仅为应用增添了美感,更重要的是,它能够在逻辑上引导用户理解界面之间的关系,增强用户体验。良好的动画设计可以提升用户操作的连贯性和直观性,使得应用程序使用起来更加顺畅。XML定义动画是一种常见的方法,开发者可以将动画效果定义在单独的XML文件中,以便于管理和复用。 阅读详情

相关推荐

这样设置过渡动画,让你的Android手机变得更丝滑

前言 通过合理的设置安卓中过渡动画的缩放速度,可以让安卓手机中窗口的切换更自然、更流畅,操作上感觉更加的丝滑。安卓手机上一般有窗口动画缩放(window_animation_scale)、过渡动画缩放(transition_animation_scale)和Animator时长缩放(animator_duration_scale)可做设置。 但是大多安卓系统对于动画缩放速度的设置大多只有几个档位,如0.5x、0.75x、1x、1.5x、2x、5x、10x,无法随心所欲的调节,而且档位不多,无论怎么做组合,要

Myles'Blog 2万+

半桥LLC谐振变换器及同步整流MATLAB仿真(一)

LLC工作原理详细解析,工作过程详细拆解

qq_55203246的博客 3万+

android动画流畅优化,这样优化安卓手机,起码增加流畅度30%

原标题:这样优化安卓手机,起码增加流畅度30%关于安卓手机,网友最关心的可能就是系统流畅性。经常有人我哪款手机用起来不卡,其实Android系统只需要进行简单的优化调整,也可以实现iOS那样的极速顺畅。搭配上强大的硬件配置,许多安卓机的运行速度可以赶超iPhone! 手机流畅度的标准是什么? 其实我们所谈论的手机流畅性,都是建立在滑屏操作基础上的。手指滑动屏幕时,系统会给出动画反应。如果触摸屏响应...

weixin_29471541的博客 1589

从0开始写Vue项目-环境和项目搭建

什么是VueVue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)2.介绍与描述动态构建用户界面的渐进式JavaScript框架作者:尤雨溪3.Vue的特点遵循MVVM模式编码简洁,体积小,运行效率高,适合移动/PC端开发它本身只关注UI,可以引入其它第三方库开发项目4.与其他JS框架的关联借鉴 Angular 的模板和数据绑定技术借鉴 React 的组件化和虚拟DOM技术5.Vue周边库vue-cli:vue脚手架axios。

不愧是暮言的博客 1483

Unity 工具 之 Natcorder 插件实现录频、拍照jpg、生成Gif动图功能(适用移动端)

Unity 工具 之 插件实现录频、拍照jpg、生成Gif动图功能(适用移动端) 目录 Unity 工具 之 插件实现录频、拍照jpg、生成Gif动图功能(适用移动端) 一、简单介绍 二、插件导入使用 三、几个 Demo 演示效果 四、关键代码 五、下载地址 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。 本节介绍,使用Unity插件,进行屏幕录制,生成图片,gif 动图,以及mp4文件等;能录制场景,也能录制摄像头,多功能录

仙魁XAN 7557

安卓动画系统 - 安卓R

1

SSSxCCC的博客 1714

3A之自动对焦(AF)算法:从Tenegrad到拉普拉斯的清晰度评价实战

本文深入解析自动对焦(AF)算法的核心——清晰度评价函数,通过实战对比Tenegrad、方差、能量梯度、Brenner和拉普拉斯五大经典算法的原理、代码实现与性能。文章详细阐述了各函数在计算速度、抗噪性和单峰性上的优劣,并提供了从仿真测试到硬件部署的优化策略,帮助开发者根据实际场景选择最合适的AF算法。

weixin_29281915的博客 312

安卓(Android)属性动画

安卓的属性动画分为四种类型:平移,旋转,缩放,渐显 四个动画对应四个不同的方法 但是操作的步骤都是一样的 唯一一个就是 渐显 比较简单点 平移:TranslateAnimationDuration代表的是运行一次的时间 RepeatMode代表的是以什么样的模式展示 参数很多 大家可以试试 ReoeatCont是你要运行多少次 TranslateAnimation translateAnimation = new TranslateAnimation(0,100,0,100); ...

zx_xzzx的博客 584

SAP与泛微OA集成(半导体行业)

本项目通过SAP PO中间件集成SAP与泛微OA在半导体行业的应用,由于行业特殊性,广泛深入应用了RSA加密等特性

集信通 1162

华为OD机试真题 新系统 2026-08-16 Python&JS【智能家居模式调度优化】

智能家居系统中有多个自动化联动模式,每个模式 modes[i]=[start_time,end_time,power],表示它在左闭右开区间 [start_time,end_time) 内持续消耗固定功率 power。

MISAYAONE的博客 82

android 属性动画适配,Android 属性动画原理与DataBinding

Android 属性动画原理与DataBinding看到这个标题的时候你可能会有疑问,属性动画和 DataBinding 之间有什么关系?我个人理解的是:它们内部的实现思想有相似之处。这篇文章主要对 Android 属性动画的知识通过文字进行整理记录,内容参考于《Android开发艺术探索》,在最后会给出我如此理解属性动画和 DataBinding 的原因。Android动画概述:Android ...

weixin_42506706的博客 293

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2306

Android 属性动画从入门到精通

属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可以通过属性动画实现。 属性动画入门 private void RotateAnimation() { ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f); anim.setDuration(1000); anim.start(); } private void Alpa...

BonnySoul的博客 283

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android自定义控件入门到精通--属性动画

文章目录属性动画ValueAnimatorValueAnimator.ofIntValueAnimator.ofArgb:EvaluatorValueAnimator.ofObjectValueAnimator.ofPropertyValuesHolderObjectAnimatorAnimatorSetanimatorSet.playTogether()animatorSet.playSequentially()animatorSet.play().with().before().after() 属性动画

Jhone_csdn的专栏 592

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android文字动画终极指南:TextPathView从入门到精通

你是否还在为Android应用中的文字动画效果繁琐实现而烦恼?是否希望找到一个轻量级库,既能实现丝滑的路径动画,又能高度自定义视觉效果?TextPathView正是为解决这些痛点而生的开源解决方案。作为一款专注于文字路径动画的Android自定义视图库,它提供了同步/异步两种绘制模式,支持10+种动画效果组合,以及全属性自定义能力,让开发者无需深入了解PathMeasure与ValueAnimat...

gitblog_00317的博客 837

Lottie-Android动画实战:从入门到精通的全方位指南

想要为你的Android应用添加令人惊艳的动画效果吗?Lottie-Android动画库是你的终极解决方案!🎉 这个强大的开源工具能够将Adobe After Effects动画直接渲染到Android应用中,让设计师和开发者实现完美的协作。无论你是动画新手还是经验丰富的开发者,这份完整指南都将带你掌握Lottie-Android的核心功能和最佳实践。 ## 🔥 为什么选择Lottie-An

gitblog_00658的博客 1043

Android属性动画深入分析:让你成为动画牛人

转载请注明出处:http://blog.youkuaiyun.com/singwhatiwanna/article/details/17841165 前言 感谢你阅读本文,我坚信读完本文肯定不会让你失望的。想要做动画牛人?想要精通动画?那么本文所讲的内容都是你必须要掌握的。关于动画,我已经写了两篇博文,但是还是没有将动画描述全面,于是我写了本文,另外,我后面还会再写一篇属性动画的源码分析,通过这四篇博文,

singwhatiwanna 4万+

Android弹簧动画实战:从入门到精通(SpringAnimation)

本文详细介绍了Android弹簧动画(SpringAnimation)的实战应用,从环境配置、基础创建到核心参数(阻尼比与刚度)的深入解析。通过结合手势拖拽、设置起始速度与动画范围等进阶技巧,帮助开发者实现自然流畅的物理动画效果,提升App交互质感。

x8y9z0的博客 1023

Android属性动画深入分析 让你成为动画牛人

Android属性动画深入分析 让你成为动画牛人

qq_44910624的博客 142

Android自定义控件入门到精通--补间动画

文章目录补间动画使用方法一:xmltranslate(平移动画)rotate(旋转动画)scale(缩放动画)alpha(透明度动画)set(组合动画)属性及含义实现方法二:java代码 补间动画 补间动画也称TweenAnimation/ViewAnimation,补间动画为View的两种状态间的过度动画,但只是视觉上的改变,并没有真正改变View本身的属性。 补间动画有以下几种 TranslateAnimation(平移动画) RotateAnimation(旋转动画) ScaleAnimation(

Jhone_csdn的专栏 530

如何为CircularFloatingActionMenu编写自定义动画:从入门到精通

CircularFloatingActionMenu是一个功能强大的Android圆形浮动操作菜单库,它提供了优雅的圆形菜单展开效果。默认的动画效果已经相当出色,但通过自定义动画,你可以为应用创建独特的用户体验。本文将带你从基础概念到高级技巧,全面掌握为CircularFloatingActionMenu编写自定义动画的方法。 ## 理解动画处理器的核心架构 CircularFloatingA

gitblog_00587的博客 668

如何使用Lottie实现Android复杂动画:从入门到精通的终极指南

在移动应用开发中,精美的动画效果是提升用户体验的关键因素。awesome-android-ui项目中集成的Lottie动画框架,让Android开发者能够轻松实现高质量、复杂的动画效果,而无需编写大量代码。本文将详细介绍如何在Android项目中使用Lottie框架,帮助你快速掌握这一强大工具。 ## Lottie动画框架简介:为什么它是Android开发的必备工具 Lottie是Airbnb

gitblog_01008的博客 440

Lottie-Android多色渐变动画终极指南:从入门到精通完整教程

Lottie-Android是一款能够在Android平台上原生渲染After Effects动画的强大工具,让开发者可以轻松实现高质量的多色渐变动画效果。本教程将带您从基础到进阶,全面掌握Lottie-Android多色渐变动画的制作与应用技巧。 ## 为什么选择Lottie-Android实现多色渐变动画? 在移动应用开发中,实现流畅精美的多色渐变动画一直是开发者面临的挑战。Lottie-

gitblog_01118的博客 883
上一篇: Android中按返回键退出应用程序
下一篇: Android中按两次返回键退出
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值