矢量图 – SVG
SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。
矢量图像用点和线来描述物体,所以文件会比较小,同时也能提供高清晰的画面。而位图图像的存储单位是图像上每一点的像素值,因此一般的图像文件都很大,会占用大量的网络带宽。
除此之外,对于矢量图像,用户可以任意缩放图像显示,而不会破坏图像的清晰度、细节等,且不论缩放到多少倍,SVG图像在屏幕上总是边缘清晰,它的清晰度适合任何屏幕分辨率和打印分辨率。
Android中对于矢量图片的支持:
http://developer.android.com/intl/zh-cn/training/material/animations.html#AnimVector
矢量图绘制网站:
http://editor.method.ac/
svg转换工具(.svg转换为Android中的xml文件):
http://inloop.github.io/svg2android/
向下兼容:
https://github.com/japgolly/svg-android
Android中的矢量图xml范例:
注意:
path 使用的画布的大小需要和 vector 中的 viewportWidth、viewportHeight 属性匹配。
至于一个形状的 path 的值应该是多少,这个不需要我们关心,UI设计师设计出图的时候,会知道这些值的。
vector 标签下有android:width和android:height属性,这两个属性是必填的,定义矢量图形的绝对大小,虽然说是矢量图形随意缩放,但是不能说这里不定义宽高,直接到目标控件上定义控件的宽高,这样是不允许的,一定要设置这个绝对宽高,要不然会报错。
波纹动画
http://developer.android.com/intl/zh-cn/reference/android/graphics/drawable/RippleDrawable.html
当用户与用户界面进行交互时,Material Design中的触摸反馈在触摸点上提供了一种瞬时视觉确认。按钮的默认触摸反馈动画使用涟漪(波纹)效应在不同状态间转换。
要更改默认的触摸反馈颜色,需要自定义主题的android:colorControlHighlight属性。
在布局XML中直接使用
使用了Material Design相关主题的控件,本身在点击的时候就自带这种涟漪动画。如果希望自己来指定动画,可以通过修改控件的background属性来实现。Android 5.0提供了2种视图背景:
有界波纹 : ?android:attr/selectableItemBackground
无界波纹 : ?android:attr/selectableItemBackgroundBorderless
定义ripple资源实现波纹动画
在drawable文件夹下定义一个ripple资源,范例如下:
如果没有在ripple添加item,仅定义一个ripple标签,并指定涟漪动画颜色,则这个ripple资源对应得就是一个无界波纹效果;如果在ripple标签内部添加了一个item,指定其id为“@android:id/mask”,或者Item是一个selector,则此ripple资源对应得是一个有界波纹。
波纹动画的向下兼容
RippleEffect是一个Android类库,为运行在Android API 9+中的应用实现来自Material Design的点击波纹效果。
类库托管地址:
https://github.com/traex/RippleEffect
自定义波纹动画(揭示动画)
Circular Reveal是一个Android 5.0新增的动画效果,使用揭示动画,我们需要借助ViewAnimationUtils.createCircularReveal方法来获取一个Animator对象。
ViewAnimationUtils.createCircularReveal参数解释:
view 要操作的视图
centerX 动画开始的中心点X
centerY 动画开始的中心点Y
startRadius 动画开始半径
startRadius 动画结束半径
路径动画
使View遵循指定的路线进行动画:
状态动画
状态动画实际上就是Selector + 属性动画,然后通过设置控件的“android:stateListAnimator”属性,将状态动画赋值给控件。
定义一个状态动画state_anim.xml
将状态动画赋值给控件:
动画选择器
Android 5.0新增了一个animated-selector标签,可以定义状态选择器,通过设置状态选择器,可以为控件的按下、抬起等事件设置一系列的中间动画。
在drawable文件夹下定义一个state_list.xml:
使用方式:直接将xml赋值给控件的background就可以
矢量图动画
Android 5.0新增了一个animated-vector标签,可以定义矢量图动画。
创建animator文件夹,而不是anim文件夹(定义属性动画在anim文件夹下可能会无效),在animator文件夹下创建属性动画集合vector_anim.xml:
在animator文件夹下创建属性动画vector_rotation.xml:
在drawable文件夹下创建矢量图动画vector_animation.xml:
将定义好的矢量图动画作为背景赋值给控件:
播放矢量图动画:
Activity转场动画
Activity Transition提供了三种Transition类型:
进入:一个进入的过渡(动画)决定activity中的所有的视图怎么进入屏幕。
- 退出:一个退出的过渡(动画)决定一个activity中的所有视图怎么退出屏幕。
- 共享元素:一个共享元素过渡(动画)决定两个activities之间的过渡,怎么共享(它们)的视图。
进入、进出过度动画
Android 5.0 支持以下3种进入和退出的过渡动画:
- explode(分解) - 从屏幕中间,进或出的移动视图,
- slide(滑动) - 从屏幕边缘,进或出地移动视图
- fade(淡出) - 通过改变屏幕上视图的不透明度达到添加或者移除视图的效果
Activity转场动画的实现步骤:
对于当前Activity:
1. 开启功能(必须在setContentView之前完成)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2. 指定动画效果
getWindow().setExitTransition() 和 getWindow().setEnterTransition ()等
3. 开启目标Activity
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
对于目标Activity:
1. 开启功能(必须在setContentView之前完成)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2. 指定动画效果
getWindow().setExitTransition() 和 getWindow().setEnterTransition ()
可选操作:
1. 在目标Activity中,尽早调用getWindow().setAllowEnterTransitionOverlap()
2. 在目标Activity结束时,调用finishAfterTransition()替代finish()
创建一个TranslationAnimationActivity,在页面添加三个按钮,点击三个按钮,执行不同的进入进出动画,跳转到对应的Activity。
TranslationAnimationActivity.java
跳转到的目标Activity的写法基本一致,以Explode动画为例。
ExplodeActivity.java
共享元素动画
Android 5.0提供了共享两个acitivity中共同的元素的动画,在Android 5.0下支持如下效果:
1 changeBounds - 改变目标视图的布局边界
2 changeClipBounds - 裁剪目标视图边界
3 changeTransform - 改变目标视图的缩放比例和旋转角度
4 changeImageTransform - 改变目标图片的大小和缩放比例
共享元素动画的大体流程基本与普通的进入/进出转场动画类似,但是也存在一些差别。
Activity共享元素转场动画的实现步骤:
对于当前Activity:
1. 开启功能(必须在setContentView之前完成)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2. 指定动画效果
getWindow().setSharedElementExitTransition(transition);
getWindow().setSharedElementEnterTransition(transition);
3. 开启目标Activity
// 指定单个共享元素(最后一个参数,即跳转页面所需的transitionName)
ActivityOptions options =
ActivityOptions.makeSceneTransitionAnimation(this,mIvShareElement1, “SE”);
// 指定多个共享元素
Pair
对于目标Activity:
1. 开启功能(必须在setContentView之前完成)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
2. 指定动画效果
getWindow().setSharedElementExitTransition(transition);
getWindow().setSharedElementEnterTransition(transition);
3. 给两个布局中的共享元素指定一个相同的名字
View.setTransitionName(“SE”);
或者布局xml中指定:android:transitionName=”SE2”
可选操作:
1. 在目标Activity中,尽早调用getWindow().setAllowEnterTransitionOverlap()
2. 在目标Activity结束时,调用finishAfterTransition()替代finish()
注意:必须给两个布局中的共享元素指定一个相同的名字,可以直接调用View上的setTransitionName方法来指定,也可以在xml文件中通过android:transitionName属性来指定。这个目标页面中设定的TransitionName,必须与跳转页面时候,传递给ActivityOptions中的那个TransitionName必须一致。