jycolorcolorkey粉底液怎么样好用吗

这是一个肌球蛋白拖着一个内啡肽,走在一个单纤维上然后大摇大摆的走过你的大脑皮层,这是让你产生快乐的物质它为了让你开心每天辛苦的拖着这个大东西,伱还有什么理由难过呢


一套Category类型的库,附带很多自定义控件 功能不错~
一些Cocoa的扩展 2年前的工程
一系列扩展和一些自定组件
一套Category类型的库,附帶很多自定义控件 功能不错~
一些Cocoa的扩展 2年前的工程
一系列扩展和一些自定组件
一系列扩展 和功能增强
一系列宏定义 挺有意思
常见的哈希、加密解密算法
一个缓存网络内容等的Cache
加密解密相关 貌似更上流, note:去看一下他博客
快速、线程安全的I/O存储操作
日期的解析,格式化等支持哆语言
一个Cocos2D的物理小游戏 貌似内容挺丰富~
一些Xcode代码片段
一个git的图形客户端
一个Ruby程序,用来管理Cocoa库依赖
Mac上的代码编辑,Chrome风格,小巧快速
一个包装,鼡nu语言来写东西?
用来生成Apple格式的文档和网页
包装以可以用类似js的写法来调用函数
这个..Mac上知名的快速启动
管理桌面窗口 状态栏插件
这个不鼡说了。~~~
不知道什么好想是与数据和网络连接的
Xcode的插件 支持绑定VIM快捷键
SSH快捷方式 菜单栏插件
系统QuickLook的插件,查看无扩展名的文本文件
自控。禁止上网一段时间
在状态栏弹出的Popup
一个小巧的 挺棒的音乐播放器
Xcode5插件的开发模板
原生iOS/Mac粒子效果设计
创建OSX的文件系统~
Google大神开发嘚KV存储,高性能,低内存
著名的ObjC 正则表达式

注:自己根据大神博客整理!!

  • //联系人:石虎QQ: 昵称:嗡嘛呢叭咪哄 文章转自:...

  • 眼前一面光滑的镜子 不染纖尘,照出世态万千 有落花的幽静细雨在缠绵 你想照出最精致的容颜 阳光下,如桃花的惊鸿一...

  • 关键字: 驾驶证、生活、出走、懂事 在怨氣中愁醒想想昨晚的交流,想想这段时间的为人处事气不打一处来,看着手机中...

  • 《雪儿》 转眼间照片已翻了三遍,那泛黄的印记还昰把记忆拉的好长其实,我没有很想念只是在我的脑海,瞬间浮现出那...

Android提供了一系列强大的API来把动画加箌UI元素中以及绘制自定义的2D和3D图像中去。下面的几节将综述这些可用的API以及系统的功能同时帮你做出最优的选择

Android框架提供了两种动画系统:属性动画(在Android3.0中加入)以及View动画。这两种动画系统都有可行的选择但是总的来说,属性动画系统是更好的选择因为它更加灵活,并提供了更多的特性在这两种系统之外,你可以使用Drawable动画(帧动画)就是你可以加载画图资源,并一帧接一帧的显示它们

在Android3.0中加叺 (API level 11), 属性动画系统可以使任何对象的属性成为动画,包括那些不会在屏幕上显示的对象这个系统是可扩展的,而且也适用于自定义类型

View動画则是比较旧的系统,只能用于View类它相对属性动画来说更容易设置,而且足够满足许多应用的需求

Drawable动画即一个接一个的显示Drawable资源,僦像放一部电影如果你想要的动画可以简单的用资源来表示,比如一系列的位图那就可以用这种方法

当你写一个应用时,首先确定你嘚图形需求十分的重要不同的图形任务最好用不同的技术来实现。举例来说一个稳定的应用软件和一个互动性比较多的游戏相比,它們的图形和动画是有很大不同的在这里,我们要讨论在Android上绘图的一些方式以及它们分别适用于哪些任务。

Android 提供了一系列的View控件来为大量的用户界面提供常规的支持你也可以继承这些控件来修改它们的外表或行为方式。除此以外你可以你可以用Canvas类里的各种绘图方法自萣义2D渲染,或创建如帧动画那样的Drawable对象

从Android 3.0开始, 你可以通过Canvas API来硬件加速大多数的绘画工作,从而进一步提高它们的性能

API不支持的图像增強时,或是你希望平台独立而不需要高性能时,你可以使用框架API相比框架API,使用NDK时性能会有明显的突破,所以对于许多关注图形的應用比如游戏,使用NDK是更有利的选择如果你有很多的本地代码想转到Android平台上,也可以使用NDK上的OpenGL

属性动画系统是一个强大的框架,它尣许你让几乎所有的东西变成动画无论是否它绘制到屏幕上或没有,伴随时间的推移你可以定义一个动画改变任何对象的属性。在指萣的时间长度内属性动画改变了属性(对象的一个域)的值。对应某些动画内容如指定你想要某个对象的属性变成动画,例如一个对潒在屏幕中的位置动画的时间,动画之间的值它都可以搞定。

属性动画系统可让你定义以下特性的动画:

◆Duration(时间):你可以指定动画的持续時间默认长度是300毫秒。

◆Repeat count and behavior(重复计数和行为):您可以指定是否有一个动画的重复当它到达时间结束,如何多次重复的动画您还可以指定昰否要反向播放动画。把它设置为reverse动画向前然后向后反复直到重复次数达到。

◆Animator sets(动画设置):你能按照一定的逻辑设置来组织动画一起播放或顺序播放或指定延迟后播放。

◆Frame refresh delay(帧刷新延迟):您可以指定多长时间一次刷新你的动画帧默认设置每10毫秒刷新,但在你的应用程序可以指定刷新帧的速度最终取决于系统整体的状态和依据底层的定时器提供多快的速度。

1.4 属性动画如何工作

首先让我们去如何动画一个简單的例子。图1-1描绘了一个假想的动画对象的x属性代表其在屏幕上的水平位置。动画的持续时间设置为40毫秒和旅行的距离是40像素每隔10毫秒,这是默认的帧刷新速率物体水平移动10个像素。在40ms的结束动画停止,对象在水平位置40结束这是一个线性插值动画的例子,这意味著对象在一个恒定的速度移动

图1-1 一个线性动画的例子

你还可以指定动画有一个非线性加速器。图1-2说明了一个假想的对象在开头动画加速,在动画结束时减速对象仍然在40毫秒移动40个像素,但非线性在开始的时候,这个动画加速的中间点然后从中间点减速,直到动画結束如图1-2所示,动画的开始和结束移动距离小于中间

图1-2 一个非线性动画的例子

让我们看在属性动画系统的重要组成部分,如何计算像仩面显示的动画的详细介绍图1-3描述了主要类是怎么工作的。

图1-3 动画是如何计算的

ValueAnimator对象保持动画的实时跟踪如动画已经运行的时间,和當前动画的属性值

启动动画,创建一个ValueAnimator设定给你想要的动画开始和结束值,定义动画的持续时间当你调用的start()动画开始。在整个动画ValueAnimator计算基于动画的持续时间和多少时间已过,介于0和1经过的部分代表,动画已完成的时间百分比0表示0%和100%表示1的含义。例如在图1Φ,在t 40毫秒计算经过部分ValueAnimator时,它调用TimeInterpolator当前设置计算插值分数。一个插值分数经过部分映射到一个新的考虑到设置的时间内插的分数。例如在图1-2中,因为动画慢慢加速插约0.15分数,是比过去0.25部分少在t = 10毫秒内。在图1-1中插值分数始终是经过分数相同。

当插值分数计算ValueAnimator的的调用适当的TypeEvaluator,计算你的动画属性值基于内插的分数,起始值结束值和动画。例如在图1-2中,插值部分是在t=0.15在10毫秒内所以当时時间属性值为0.15 x(40 - 0)=6。

1.5 属性动画和View动画的不同

View动画系统提供的功能只针对View对象所以如果你想要没View对象也能有动画,你就必须自己写代码了View动画也拘泥于只能让View对象暴露出来的一些方面形成动画,比如缩放旋转。如果你想要一个背景色改变的动画呢View动画不提供。另一个View動画的缺点就是它只是修改了View绘制的位置并没有实际修改View本身。例如如果你想要一个按钮横穿一个屏幕的动画,按钮会正确的绘制泹实际上你点击按钮可能没有任何反应。所以你必须实现自己的逻辑用属性动画的话,就完全没有这些约束了并且你能针对任意对象嘚属性来做动画,并且实际上它也真正的被修改属性动画系统也能以更健壮的方式进行动画。在3.0以上系统中你分配给动画师一些你想偠的动画属性,比如颜色位置,大小并且能定义动画的各方面如加速器,多动画的同步对于View动画系统则只需要很少的代码和一些简單的设置即可,如果View动画能完成一切你想要做的事情就不用考虑属性动画了。当然你可以结合两种动画系统一起使用

你可以在android.animation里面找箌属性动画系统大部分API。因为视图的动画系统已经定义了许多加速器在android.view.animation你可以使用属性动画系统的加速器。下表描述的属性动画系统的主要组成部分Animator 类提供了用于创建动画的基本结构。你通常不使用这个类因为它直接提供最基本的功能,必须扩展到完全支持动画值鉯下子类扩展Animator:如下表1-1所示

属性动画主要的计时器引擎,也为属性动画计算相关的值它有所有的核心功能,计算动画值和包含的每个动画時间的细节,动画是否重复的信息***接受更新事件,并且能自定义类型评估动画属性有两个部分: 计算动画的值并且设置那些值到动畫的对象和属性中。ValueAnimator不执行第二部分所以你必须***值的更新并修改对象的逻辑。

ValueAnimator的子类允许你设置一个目标对象并让对象属性成为动畫当它为动画计算一个新值时,这个类更新相应的属性你想要使用ObjectAnimator是因为它让动画赋值的过程更容易。然而有时候你想要直接的使鼡 ValueAnimator,因为ObjectAnimator有一些更多的限制比如要需要具体的访问方法出现在目标对象。

提供一个机制来让动画组合到一起你可以让他们同时播放,串联播放或在指定延迟后播放。

求值程序会告诉属性动画系统如何给一个给定的属性计算值他们花的时间数据,是由一个动画师类提供,动画的起始和结束值,并基于此数据计算动画属性的值属性动画系统提供了一下评估者:

默认的求值程序为int属性计算值

默认的求值程序为float屬性计算值

默认的求值程序为颜色属性计算值,显示为十六进制格式

一个接口,允许你创建你自己的求值程序如果你动画对象属性不是int,float戓color你就必须实现TypeEvaluator接口来指定如何计算对象动画属性的值。如果你想要处理这些类型又不同于默认的行为当然,你可以为intfloat或color自定义。

┅个时间加速器在一个动画中定义了特定的值用于作为时间的函数来参与计算。例如你能指定动画是线性穿越整个动画的,其实就是峩们数学中的匀速运动或者你能指定动画是非线性的,例如加速或减速运动。表1-3描述了各种加速器它们都包含在android.view.animation中,如果没有加速器提供适合您的需求,实现TimeInterpolator接口和创建自己的加速器

开始和结束变慢,中间加速

开始向后然后在飞速的向前

开始向后,然后飞速的向前並越过目标值然后在返回最终的值

根据指定数量的周期重复

快速向前然后超过最后的值,然后返回

一个借口,允许你实现自己的加速器

在这段代码中当start()方法运行时,在持续时间1秒钟内在0到1之间ValueAnimator开始计算动画值。你也可以指定一个自定义类型的动画通过执行下列操作如代码清单1-2所示:

然而,前面的代码片段有没有真正影响一个对象,因为在ValueAnimator不直接操作对象或属性最有可能的事情,你想要做的是修改这些计算值要进行动画的对象你可以在ValueAnimator定义***适当的处理动画的寿命期间的重要事件,如帧更新实现***时,你可以通过调用特定的帧刷新计算值getAnimatedValue()

和ValueAnimator是相似的,但你也指定对象和对象名称的属性(一个字符串)连同值动画,如代码清单1-3所示:

为了让ObjectAnimator正确得更新属性你必须这样做:

1. 你想要对象属性成为动画,就必须有一个setter函数因为ObjectAnimator自动更新动画属性,它必须能使用setter方法访问这些属性例如,如果属性的洺字是foo你必须有一个setFoo()方法。如果这个setter方法不存在你有三种选择

◆如果你有权利这样做,你可以添加setter方法在类中

◆使用你又权利改变嘚包装类并且包装程序用一个有效的setter方法接收值,并转发到原始对象。

2. 如果你在一个ObjectAnimator工厂方法中只指定一个值那么它将被认为是动画的结束值。因此对象属性是动态的,你必须有一个getter函数,用来获得动画的起始值。例如如果属性的名字是foo,你必须有一个getFoo()方法

这取决于你动畫是什么属性或对象,你可能需要调用invalidate()方法在视图使屏幕重绘本身与更新的动画值,你可以在onAnimationUpdate()回调方法中这样做例如Drawable对象的color属性想变成一個动画,只需要更新屏幕重绘它自己。在View上所有属性设置器如setAlpha()和setTranslationX()都会刷新View的属性,所以你不需要在额外的调用刷新方法去刷新View了。

茬很多情况下你想要播放一个动画取决于另一个动画开始时或者完成后。Android系统让你吧动画捆绑到一个AnimatorSet中,所以你可以指定动画同时播放依次播放,或延迟后播放你也可以嵌套AnimatorSet对象,应对更复杂的情况以下代码片段Bouncing Balls中的例子,下面这些对象是这样播放的:

想要这样的播放順序就如下面代码清单1-5所示:

你能在动画持续时间内***重要的事件

getAnimatedValue()方法获得当前的动画值。如果你使用ValueAnimator就必须实现这个***这取决于伱的动画师什么样的属性或对象,你可能需要调用invalidate()来强制View刷新它所在的屏幕区域的动画值例如颜色属性的Drawable动画仅仅只有重绘的时候才更噺。所有View上的属性设置器,如setAlpha()和()setTranslationX都会适当的刷新所以你不需要手动调用invalidate()方法来刷新新值。并且在这些set方法中已经包含了invalidate()

属性动画系统提供一种能力来动画改变ViewGroup对象以及提供一个简单的方法来激活View对象本身。你能使用LayoutTransition类在一个ViewGroup中动画改变布局在一个ViewGroup里的View,能有出现和消失嘚动画比如当从ViewGroup中添加它们或移除它们或者当你调用setVisibility()时。当你添加或删除View时剩余的View在ViewGroup也可以通过动画的形式进入他们的新位置。你能萣义以下动画在LayoutTransition对象中调用setAnimator()和以下常量来实现:

◆APPEARING:一个标志,指示动画上运行的item出现在容器中。

◆CHANGE_APPEARING:一个标志,指示动画运行在由于新item出现在嫆器中发生改变的item上

◆DISAPPEARING:一个标志,指示动画上运行的item从容器中消失。

你可以为这四个类型的事件定制的外观布局转换来自定义动画或者只昰告诉动画系统使用默认的动画ApiDemo中有一个LayoutAnimations 例子,告诉你怎样为布局过渡定义动画并且设置你想要的View对象动画LayoutAnimationsByDefault及其对应的layout_animations_by_default.xml布局资源文件說明如何启用默认布局过渡动画。唯一一件你需要做的就是将android:animateLayoutchanges属性设为true如代码清单1-7所示:

将这个属性设置为true会在ViewGroup添加或移除View时自动的产生動画。

注意:当ValueAnimator(或ObjectAnimator)运行时,它计算当前运行部分的动画(值在0和1之间),然后计算一个你正在使用的加速器版本加速器的分数是你TypeEvaluator通过fraction参数接受到嘚,所以当计算动画值时你不需要考虑加速器

一个加速器定义了如何在一个动画中作为时间函数来指定其值,例如你能指定动画是匀速戓非匀速贯穿整个动画这取决于你使用什么样的加速器。Android系统系统一套常见的加速器在android.view.animation package包中如果没有你想要的加速器,你可以通过TimeInterpolator自巳实现作为一个例子,我们看下如下加速器的实现代码:

其实这就好比我们在使用物理和数学的知识来套用公式了以下表格就是毫秒间隔时间内的值,如表1-4所示:

表1-4 匀速和变速的数值比较

一个KeyFrame(关键帧)对象由时间和具体值组成让你在指定的时间内,定义一个指定的状态每个关键帧能有她自己的加速器来控制动画的行为,它的区间为前面的关键帧的时间与目前关键帧时间的间隔时间为了实例化一个Keyframe对潒,你必须使用工厂方法如ofInt(), ofFloat(),

属性动画允许一些合理的View对象拥有动画并提供一些比View动画系统更有力的特性。View动画系统通过View对象的变形来形荿动画View依然在那绘制。这会处理容器中的每一个View因为View它自己没有属性来操作。这造成View动画并没有改变View对象本身这导致一些很不愉快嘚开发体验。在Android3.0和之后的版本中新属性和相应的getter和setter方法的添加以消除这个缺点。

属性动画系统可以设置动画视图在屏幕上通过改变实际嘚属性视图对象此外, 每当其属性被更改时,View还自动调用invalidate()方法来刷新屏幕View类中的新属性会使属性动画更容易实现:

scaleXscaleY:这些属性控制了2D围繞它的中心点的缩放

pivotXpivotY:这些属性控制中心点的位置,因为旋转缩放,位移都是根据中心点进行的默认情况下,中心点在对象的中间(非左上哦请注意!)

xy:这些都是简单的实用属性来描述View在它的容器中的最终位置,是左边顶部translationX 和translationY的总和

alpha:表示View上alpha的透明度。默认徝为1表示不透明0表示完全透明。

让一个View对象动起来如颜色和旋转值,所有你需要做的就是创建一个animator并指定你想要他动起来的View中的某个屬性例如代码清单1-10所示:

ViewPropertyAnimator提供一个简单的方法来让几个View属性同时动起来,它的行为就像一个ObjectAnimator因为他修改View属性的实际值,但当许多属性動画运行时它更高效。此外,使用ViewPropertyAnimator的代码更简洁、更容易阅读下面代码片段展示了它与ObjectAnimator的差异,如代码片段所示:

属性动画系统也可以让伱在XML中声明动画属性通过在XML定义你的动画,你可以很容易的在多个activity重用你的动画并更容易编辑动画序列。为了区分你使用新的属性动画系統API还是以前老的view动画系统你应该分别保存XML文件,如res/animator/目录保存的是新的属性动画文件res/anim/为旧的View动画系统文件。虽然你不一定非要使用res/animator/目录但如果你需要在Eclipse中使用布局编辑工具的话,你就必须使用res/animator/目录因为ADT只会搜索这个名字的文件夹。

以下属性动画类有XML声明支持以下XML标记:

讓我们看下代码清单1-11的例子:

为了执行这个动画你必须在代码中inflate XML资源到对象中,然后为所有的动画设置目标对象。具体请看代码清单1-12所示:

参考资料

 

随机推荐