Material Designer的低版本兼容实现——View & Animation

Material Designer 宗旨:让不同大小不同用途的设备上拥有同一种设计风格 1.纸张 这种设计模式大量参考了纸墨的模式,将空间变得像纸张一样,而用户的手指就是毛笔。用户按到控件上就会产生墨晕效果。这样的好处是明确的告诉用户是否点击了控件,而且还能让用户一下子明白控件的布局思路。毕竟一张一张的纸叠加起来的控件是很容易让人接受的。这里还有一个词“引喻”,虽然控件像纸张,但是它具有变大变小,改变颜色等能力,所以完全可以不用拘泥于现实纸张。 2.深度 新的设计中希望所有的控件都是现实世界中的隐喻,比如你按下按钮,按钮就应该有被按下的状态,这里就要用到了涟漪(Ripple)效果了。其实涟漪效果是来表示你手指按上去后墨晕扩散的效果的,下面的图能很明白的说明这点。 3.动画 动画贯穿于Material Designer之中,官方文档中用了很大的篇幅来讲解动画效果,希望让设计的动画效果很美观。但我个人认为为了动画而动画是完全不可取的,比如下面的例子 这里的动画看起来十分自然和美观,但是在实际中用户切换activity是很常见的,如果经常出现这个动画用户会觉得“很腻”,十分不友好。动画其实是一个画龙点睛的东西,万不可变为画蛇添足。那么,上图的这个动画应该在什么时候使用呢?用在第一次用户进入一个新的界面的时候,我们为了凸显这个界面的某种特定功能,就可以让这个功能的图标动起来,表现出一个点我试试的效果。 4.排版 新的设计里面很在意排版,里面列出了很多详细的数据来支持我们的设计。对于留白也有了详细的说明。优秀的排班会让你的应用看起来干净,优雅,这点十分重要。在之后的文章中我也会多少说到这方面的知识。 设计文档(不用FQ) http://design.1sters.com/ http://www.ui.cn/Material/ 目录 Material Designer的低版本兼容实现(二)—— Theme{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(三)——Color{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(四)—— ToolBar{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(六)—— Ripple Layout{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(七)—— Rectange Button{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(八)—— Flat Button{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(九)—— Float Button & Small Float Button{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(十)—— CheckBox & RadioButton{#cb_post_title_url.postTitle2} Material Designer的低版本兼容实现(十一)—— Switch{#cb_post_title_url.postTitle2} ...

2016年1月5日 · 1 分钟 · 天边的星星

Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS

由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动画的Android视图切换动画特效库!SwitchLayout!可以说是目前Android上第一个,也是唯一的一个强大的视图切换动画库引擎! 作者:谭东 QQ:852041173 项目开源!推荐使用jar包形式! 没有经过作者允许,不可修改项目库源码自行发布。 如果你的项目中使用了SwtichLayout,建议你在您的APP关于页面注明SwitchLayout库提供支持!非常感谢!如果您觉得SwitchLayout强大,欢迎推荐给你们的朋友。 如果有什么建议,也可以反馈给我,会及时升级SwitchLayout库。 SwitchLayout 的1.0jar包下载地址和Demo下载地址:http://pan.baidu.com/s/1dD6baLV 源码和demo在github地址:https://github.com/jaychou2012/SwitchLayout 好了,先看下主要的界面支持的视图切换特效吧!(此为Demo截图) 、 效果引擎足够媲美IOS了。 里面的列表中,每个特效暴露的自定义扩展特效引擎接口大概可以扩充8个特效。所以一共大概可以扩充105种特效!足够强大! 好了,下面说下大致的用法: 1.导入SwitchLayout1.0.jar或者下载开源库。 2.每个Activity实现接口implements SwichLayoutInterFace。推荐这种用法;接口里分别实现2个方法:setEnterSwichLayout();和setExitSwichLayout();这两个方法分别是设置进入Activity动画和离开Activity的动画的。 在onCreate()里调用setEnterSwichLayout(); 在关闭Activity操作里调用setExitSwichLayout(); 如果需要的话在onKeyDown里拦截返回按键,调用setExitSwichLayout(); 3.具体特效调用(举一个例子): SwitchLayout.getSlideFromBottom(this, false,BaseEffects.getMoreSlowEffect()); // 三个参数分别为(Activity/View,是否关闭Activity,特效(可为空));每个特效支持8种扩种,也可以不填特效。 4.注意,在项目注册清单里,每个Activity要设置主题为透明主题。 android:theme=”@android:style/Theme.Translucent”,API在11以上即可。 下面贴下SwitchLayoutDemo里的代码: **[java]** [view plain](http://blog.csdn.net/jay100500/article/details/42227365#)[copy](http://blog.csdn.net/jay100500/article/details/42227365#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/565636)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/565636/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="keyword">package</span> com.tandong.swichlayoutdemo; - - <span class="keyword">import</span> android.app.Activity; - <span class="keyword">import</span> android.content.Intent; - <span class="keyword">import</span> android.os.Bundle; - <span class="keyword">import</span> android.view.View; - <span class="keyword">import</span> android.view.View.OnClickListener; - <span class="keyword">import</span> android.view.Window; - <span class="keyword">import</span> android.widget.Button; - - <span class="keyword">import</span> com.tandong.swichlayout.BaseEffects; - <span class="keyword">import</span> com.tandong.swichlayout.SwitchLayout; - - <span class="comment">/**</span> - <span class="comment"> * SwitchLayout</span> - <span class="comment"> * </span> - <span class="comment"> * QQ 852041173</span> - <span class="comment"> * </span> - <span class="comment"> * 为Android提供IOS平台自有的界面视图切换动画而开发此库,工作量也不小,感谢支持SwitchLayout</span> - <span class="comment"> * </span> - <span class="comment"> * 如果想自定义特效动画时长的话,请在此四个变量对应设置 SwitchLayout.animDuration = 1000;</span> - <span class="comment"> * SwitchLayout.longAnimDuration = 2000; BaseAnimViewS.animDuration = 1000;</span> - <span class="comment"> * BaseAnimViewS.longAnimDuration = 2000;即可。单位毫秒。</span> - <span class="comment"> * </span> - <span class="comment"> * 以后SwitchLayout将会划分入我的SmartUI库下面</span> - <span class="comment"> * </span> - <span class="comment"> * @author Tan Dong(谭东) 2014.12.28</span> - <span class="comment"> * </span> - <span class="comment"> */</span> - <span class="keyword">public</span> <span class="keyword">class</span> MainActivity <span class="keyword">extends</span> Activity { - <span class="keyword">private</span> Button btn_ok, btn_1, btn_2, btn_3, btn_4, btn_5, btn_6, btn_7, - btn_8, btn_9, btn_10, btn_11, btn_12, btn_13, btn_14; - - <span class="annotation">@Override</span> - <span class="keyword">protected</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) { - requestWindowFeature(Window.FEATURE_NO_TITLE); - <span class="keyword">super</span>.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - initView(); - - <span class="comment">// 设置进入Activity的Activity特效动画,同理可拓展为布局动画</span> - SwitchLayout.getSlideFromBottom(<span class="keyword">this</span>, <span class="keyword">false</span>, - BaseEffects.getQuickToSlowEffect()); - <span class="comment">// 三个参数分别为(Activity/View,是否关闭Activity,特效(可为空))</span> - initListener(); - - } - - <span class="keyword">private</span> <span class="keyword">void</span> initListener() { - btn_ok.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number"></span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - - btn_1.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">1</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_2.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">2</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_3.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">3</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_4.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">4</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_5.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">5</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_6.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">6</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - - btn_7.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">7</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_8.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">8</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_9.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">9</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_10.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">10</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_11.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">11</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_12.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">12</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_13.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">13</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - btn_14.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View arg0) { - <span class="comment">// TODO Auto-generated method stub</span> - Intent in = <span class="keyword">new</span> Intent(MainActivity.<span class="keyword">this</span>, SecondActivity.<span class="keyword">class</span>); - in.putExtra(<span class="string">&#8220;key&#8221;</span>, <span class="number">14</span>); - MainActivity.<span class="keyword">this</span>.startActivity(in); - } - }); - } - - <span class="keyword">private</span> <span class="keyword">void</span> initView() { - btn_ok = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_ok); - btn_1 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_1); - btn_2 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_2); - btn_3 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_3); - btn_4 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_4); - btn_5 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_5); - btn_6 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_6); - btn_7 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_7); - btn_8 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_8); - btn_9 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_9); - btn_10 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_10); - btn_11 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_11); - btn_12 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_12); - btn_13 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_13); - btn_14 = (Button) <span class="keyword">this</span>.findViewById(R.id.btn_14); - - } - } ...

2015年8月15日 · 10 分钟 · 天边的星星

Android应用开发之所有动画使用详解

1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如下几类: View Animation: 视图动画在古老的Android版本系统中就已经提供了,只能被用来设置View的动画。 Drawable Animation: 这种动画(也叫Frame动画、帧动画)其实可以划分到视图动画的类别,专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。 Property Animation: 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。 可以看见,当前应用程序开发涉及的主要动画也就这三大类,我们接下来以类别为基础来慢慢展开说明。 【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流】 2 View Animation(视图动画)使用详解 2-1 视图动画概述 视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。譬如,如果你有一个TextView对象,您可以移动、旋转、缩放、透明度设置其文本,当然,如果它有一个背景图像,背景图像会随着文本变化。 补间动画通过XML或Android代码定义,建议使用XML文件定义,因为它更具可读性、可重用性。 如下是视图动画相关的类继承关系: java类名 xml关键字 描述信息 AlphaAnimation <alpha> 放置在res/anim/目录下 渐变透明度动画效果 RotateAnimation <rotate> 放置在res/anim/目录下 画面转移旋转动画效果 ScaleAnimation <scale> 放置在res/anim/目录下 渐变尺寸伸缩动画效果 TranslateAnimation <translate> 放置在res/anim/目录下 画面转换位置移动动画效果 AnimationSet <set> 放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器 通过上图和上表可以直观的看出来补间动画的关系及种类了吧,接下来我们就详细一个一个的介绍一下各种补间动画。 2-2 视图动画详细说明 可以看出来Animation抽象类是所有补间动画类的基类,所以基类会提供一些通用的动画属性方法,如下我们就来详细看看这些属性,关于这些属性详细官方解释翻墙点击我或者翻墙点击我。 2-2-1 Animation属性详解 xml属性 java方法 解释 android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行 android:duration setDuration(long) 动画持续时间,毫秒为单位 android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态 android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态 android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同 android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等) android:repeatCount setRepeatCount(int) 重复次数 android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放 android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间,单位为毫秒 android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal 也就是说,无论我们补间动画的哪一种都已经具备了这种属性,也都可以设置使用这些属性中的一个或多个。 ...

2015年8月13日 · 8 分钟 · 天边的星星

Android动画机制全解析

导论 本文着重讲解Android3.0后推出的属性动画框架Property Animation——Animator。 产生原因 3.0之前已有的动画框架——Animation存在一些局限性, Animation框架定义了透明度,旋转,缩放和位移几种常见的动画,而且控制的是整个View,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧,如果动画没有完成,继续调用invalidate()函数,启动下次绘制来驱动动画,动画过程中的帧之间间隙时间是绘制函数所消耗的时间,可能会导致动画消耗比较多的CPU资源,最重要的是,动画改变的只是显示,并不能相应事件。 而在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更精细化控制,只控制一个对象的一个属性值,多个ObjectAnimator组合到AnimatorSet形成一个动画。而且ObjectAnimator能够自动驱动,可以调用setFrameDelay(longframeDelay)设置动画帧之间的间隙时间,调整帧率,减少动画过程中频繁绘制界面,而在不影响动画效果的前提下减少CPU资源消耗。因此,Anroid推出的强大的属性动画框架,基本可以实现所有的动画效果。 强大的原因 因为属性动画框架操作的是真实的属性值,直接变化了对象的属性,因此可以很灵活的实现各种效果,而不局限于以前的4种动画效果。 ObjectAnimator ObjectAnimator是属性动画框架中最重要的实行类,创建一个ObjectAnimator只需通过他的静态工厂类直接返回一个ObjectAnimator对象。传的参数包括一个对象和对象的属性名字,但这个属性必须有get和set函数,内部会通过java反射机制来调用set函数修改对象属性值。还包括属性的初始值,最终值,还可以调用setInterpolator设置曲线函数。 ObjectAnimator实例 [view plain](http://www.netfoucs.com/article/x359981514/92198.html#)[copy to clipboard](http://www.netfoucs.com/article/x359981514/92198.html#)[print](http://www.netfoucs.com/article/x359981514/92198.html#)[?](http://www.netfoucs.com/article/x359981514/92198.html#) - ObjectAnimator.ofFloat(view, <span class="string">&#8220;rotationX&#8221;</span>, <span class="number"></span>.0F, <span class="number">360</span>.0F).setDuration(<span class="number">1000</span>).start(); 这个例子很简单,针对view的属性rotationX进行持续时间为1000ms的0到360的角度变换。 PS:可操纵的属性参数:x/y;scaleX/scaleY;rotationX/ rotationY;transitionX/ transitionY等等。 PS:X是View最终的位置、translationX为最终位置与布局时初始位置的差。所以若就用translationX即为在原来基础上移动多少,X为最终多少。getX()的值为getLeft()与getTranslationX()的和。 动画绘制过程的监听 [view plain](http://www.netfoucs.com/article/x359981514/92198.html#)[copy to clipboard](http://www.netfoucs.com/article/x359981514/92198.html#)[print](http://www.netfoucs.com/article/x359981514/92198.html#)[?](http://www.netfoucs.com/article/x359981514/92198.html#) - animator.addUpdateListener(<span class="keyword">new</span> AnimatorUpdateListener() { <span class="annotation">@Override</span> <span class="keyword">public</span> <span class="keyword">void</span> onAnimationUpdate(ValueAnimator arg0) { } }); 该方法用来监听动画绘制过程中的每一帧的改变,通过这个方法,我们可以在动画重绘的过程中,实现自己的逻辑。 同时修改多个属性值 当然这个可以使用Animationset来实现,这里我们使用一种取巧的方法来实现: [view plain](http://www.netfoucs.com/article/x359981514/92198.html#)[copy to clipboard](http://www.netfoucs.com/article/x359981514/92198.html#)[print](http://www.netfoucs.com/article/x359981514/92198.html#)[?](http://www.netfoucs.com/article/x359981514/92198.html#) - ObjectAnimator anim = ObjectAnimator.ofFloat(view, <span class="string">&#8220;xxx&#8221;</span>, <span class="number">1</span>.0F, <span class="number"></span>.0F) .setDuration(<span class="number">500</span>); anim.start(); anim.addUpdateListener(<span class="keyword">new</span> AnimatorUpdateListener() { <span class="annotation">@Override</span> <span class="keyword">public</span> <span class="keyword">void</span> onAnimationUpdate(ValueAnimator animation) { floatcVal = (Float) animation.getAnimatedValue(); view.setAlpha(cVal); view.setScaleX(cVal); view.setScaleY(cVal); } }); 我们可以监听一个并不存在的属性,而在监听动画更新的方法中,去修改view的属性,监听一个不存在的属性的原因就是,我们只需要动画的变化值,通过这个值,我们自己来实现要修改的效果,实际上,更直接的方法,就是使用ValueAnimator来实现,其实ObjectAnimator就是ValueAnimator的子类,这个在下面会具体讲到。 ...

2015年6月11日 · 8 分钟 · 天边的星星

设置Viewpager的viewPager.setCurrentItem有一个动画滑动效果

设置Viewpager的viewPager.setCurrentItem(currentIndex+1);有一个动画滑动效果 ViewPagerScroller scroller = new ViewPagerScroller(this); scroller.initViewPagerScroll(viewPager); /** ViewPager 滚动速度设置 */ public class ViewPagerScroller extends Scroller { private int mScrollDuration = 2000; // 滑动速度 /** 设置速度速度 @param duration */ public void setScrollDuration(int duration) { this.mScrollDuration = duration; } public ViewPagerScroller(Context context) { super(context); } public ViewPagerScroller(Context context, Interpolator interpolator) { super(context, interpolator); } @SuppressLint(“NewApi”) public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) { super(context, interpolator, flywheel); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, mScrollDuration); } ...

2015年5月8日 · 1 分钟 · 天边的星星

android ViewPage动画实现

实现思路 1.使用http://nineoldandroids.com/动画库 https://github.com/JakeWharton/NineOldAndroids https://github.com/jfeinstein10/JazzyViewPager 2.使用3.0以上直接使用 3.自定义Viewpage

2015年3月7日 · 1 分钟 · 天边的星星

Android中用Matrix实现ImageView里的图片平移和缩放动画

注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求。 **功能点**: 1、一开始可以像centerCrop一样显示图片(觉得scaleType为centerCrop时显示效果比较好,图片会铺满整个View,而且图片本身的分辨率不变) 2、对ImageView里的图片平移或放大 3、将这个平移或放大做成一个动画效果 **一、在ScaleType为matrix的情况下实现centerCrop的显示效果** 要充分利用Android的源码,看ImageView的源代码就可以简单很多,在configureBounds()方法中: ![Android中用Matrix实现ImageView里的图片平移和缩放动画 - Johnny - Lucky Johnnys blog](http://img1.ph.126.net/0bRpjujvQhurl7HNuYa99g==/4826169950781049609.png) 不过为了之后的平移,要保证图片的宽度比View的宽度大 <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setImage </span><span class="pun">(</span> <span class="typ">Drawable</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">if</span> <span class="pun">(</span> <span class="kwd">null</span> <span class="pun">==</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="kwd">return</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> dwidth </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicWidth </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> dheight </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicHeight </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> vwidth </span><span class="pun">=</span><span class="pln"> mWidth</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> vheight </span><span class="pun">=</span><span class="pln"> mHeight</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="lit">1.0f</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> dx </span><span class="pun">=</span> <span class="lit"></span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">=</span> <span class="lit"></span><span class="pun">;</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> vheight </span><span class="pun">></span><span class="pln"> vwidth </span><span class="pun">*</span><span class="pln"> dheight </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vheight </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dheight</span><span class="pun">;</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vwidth </span><span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dwidth</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun"><</span> <span class="lit">2</span> <span class="pun">*</span><span class="pln"> vwidth </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="lit">2.0f</span> <span class="pun">*</span><span class="pln"> dwidth </span><span class="pun">);</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">();</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">setScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageDrawable </span><span class="pun">(</span><span class="pln"> drawable </span><span class="pun">);</span> <span class="pun">}</span> <span class="com">// vwidth和vheight使用确定的值,因为如果在应用初始化时view.getWidth()可能为0</span> **二、利用Matrix实现平移和放大** 平移和放大都是在当前图片的基础上,先用mImage.getImageMatrix()得到当前的matrix,再用Matrix的postTranslate或postScale方法就可以了。 需要注意的是: 如果用Matrix matrix = mImage.getImageMatrix (); //matrix只是得到一个对象的引用 应该用Matrix matrix = new Matrix ( mImage.getImageMatrix () );//这样才是得到一个克隆对象 **三、用ValueAnimator实现动画效果** 1、平移 dx为负是向左平移,为正是向右平移 因为图片的宽度设置为至少是view的2倍,所以向左和向右平移的最大距离都是vwidth / 2。 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyTransXAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">int</span><span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Integer</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span> <span class="lit"></span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setTranslateAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofInt </span><span class="pun">(</span> <span class="lit"></span><span class="pun">,</span> <span class="pun">&#8211;</span> <span class="lit">60</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix</span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 2、放大 放大要设置中心点为ImageView的中心 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyScaleAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span><span class="pln"> matrix</span><span class="pun">;</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Float</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> mWidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">,</span><span class="pln"> mHeight </span><span class="pun">/</span> <span class="lit">2</span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setScaleAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofFloat </span><span class="pun">(</span> <span class="lit">1.0f</span><span class="pun">,</span> <span class="lit">1.2f</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix </span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 转自:http://xie2010.blog.163.com/blog/static/2113173652014221240951/

2014年12月18日 · 5 分钟 · 天边的星星

Android开发实践:自定义带动画的View

对于一个自定义View来说,onMeasure只是用来计算View尺寸,onDraw()才是真正执行View的绘制,所以一般我们都需要重写 onDraw()函数来绘制我们期望的UI界面。下面我以一个具体的例子探索自定义View的onDraw()的实现过程和关键点。 我们的目标是制作一个柱状图动画,View的动画启动后,会显示一排柱状图增长的画面,这种动画多用于财务类或者统计类的APP中,效果如图所示(截屏的格式转换过程导致有些变形,还好不影响演示,图中设置了反复播放,真机上只会播放一次): 1. 首先,自定义View的派生类 ** ** 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> <div class="line number15 index14 alt2"> 15 </div> <div class="line number16 index15 alt1"> 16 </div> <div class="line number17 index16 alt2"> 17 </div> <div class="line number18 index17 alt1"> 18 </div> <div class="line number19 index18 alt2"> 19 </div> <div class="line number20 index19 alt1"> 20 </div> <div class="line number21 index20 alt2"> 21 </div> <div class="line number22 index21 alt1"> 22 </div> <div class="line number23 index22 alt2"> 23 </div> <div class="line number24 index23 alt1"> 24 </div> <div class="line number25 index24 alt2"> 25 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `AnimatorView ``extends` `View {` </div> <div class="line number2 index1 alt1"> </div> <div class="line number3 index2 alt2"> ` ``private` `Paint mPaint; ` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> ` ``public` `AnimatorView(Context context) {` </div> <div class="line number6 index5 alt1"> ` ``super``(context); ` </div> <div class="line number7 index6 alt2"> ` ``initialize();` </div> <div class="line number8 index7 alt1"> ` ``}` </div> <div class="line number9 index8 alt2"> </div> <div class="line number10 index9 alt1"> ` ``public` `AnimatorView(Context context, AttributeSet attrs) {` </div> <div class="line number11 index10 alt2"> ` ``super``(context, attrs);` </div> <div class="line number12 index11 alt1"> ` ``initialize();` </div> <div class="line number13 index12 alt2"> ` ``}` </div> <div class="line number14 index13 alt1"> ` ` </div> <div class="line number15 index14 alt2"> ` ``public` `AnimatorView(Context context, AttributeSet attrs, ``int` `defStyle) {` </div> <div class="line number16 index15 alt1"> ` ``super``(context, attrs, defStyle);` </div> <div class="line number17 index16 alt2"> ` ``initialize();` </div> <div class="line number18 index17 alt1"> ` ``}` </div> <div class="line number19 index18 alt2"> ` ` </div> <div class="line number20 index19 alt1"> ` ``protected` `void` `initialize() {` </div> <div class="line number21 index20 alt2"> ` ``mPaint = ``new` `Paint(); ` </div> <div class="line number22 index21 alt1"> ` ``mPaint.setAntiAlias(``true``);` </div> <div class="line number23 index22 alt2"> ` ``mPaint.setStyle(Style.FILL); ` </div> <div class="line number24 index23 alt1"> ` ``} ` </div> <div class="line number25 index24 alt2"> `}` </div> </div> </td> </tr> </table> 注: Paint是用来绘图的画笔,可以设置其样式、画面的粗细、填充模式、颜色等等。 ...

2014年11月17日 · 7 分钟 · 天边的星星

Android代码实现长按显示波纹外扩动画

项目两张图片: wave btn 代码: package com.example.waveanimation; import Android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.AlphaAnimation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class MainActivity extends Activity { private static final int ANIMATIONEACHOFFSET = 600; // 每个动画的播放时间间隔 private AnimationSet aniSet, aniSet2, aniSet3; private ImageView btn, wave1, wave2, wave3; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x222) { wave2.startAnimation(aniSet2); } else if (msg.what == 0x333) { wave3.startAnimation(aniSet3); } super.handleMessage(msg); } ...

2014年6月27日 · 2 分钟 · 天边的星星

Android 两Activity之间动画效果———翻页效果

用Android rotate动画实现翻页效果,效果如图: ![](http://img.blog.csdn.net/20130826221333046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 要实现上面动画,首先搞明白rotate动画原理; (1)Degrees坐标: 0度(360度) 270度![](http://img.blog.csdn.net/20130826214747859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVhemFpOTYzMTg0NzA5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 90度 顺时针旋转 180 (2)rotate 关键属性 fromDegrees 开始旋转时角度 toDegrees 结束时的角度 pivotX,pivotY 旋转时的中心点 他们范围是 0—100%p (0,0)代表左上角,(100%p, 100%p)右下角 duration 动画持续时间 毫秒为单位 知道了这两点就可以实现了 在res新建 anim 文件夹 新建 离开Activity时的xml **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">新建 进入Activity时的xml</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">rotate</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:duration</span>=<span class="attribute-value" style="color: blue;">&#8220;500&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:fromDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;90&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotX</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:pivotY</span>=<span class="attribute-value" style="color: blue;">&#8220;100%p&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:toDegrees</span>=<span class="attribute-value" style="color: blue;">&#8220;0&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">set</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <span style="color: #000000;">最后就是代码调用了</span> **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">Intent <span class="attribute" style="color: red;">intent</span> = <span class="attribute-value" style="color: blue;">new</span> Intent(ActivityAnimationDemo.this, activtyanimationdemo2.class); </span> - <span style="color: black;">startActivity(intent); </span> - <span style="color: black;">overridePendingTransition(R.anim.rotate_left, R.anim.rotate_right); </span> 解释一下应放入的参数 **[html]** [view plain](http://blog.csdn.net/huazai963184709/article/details/10364243#)[copy](http://blog.csdn.net/huazai963184709/article/details/10364243#)[print](http://blog.csdn.net/huazai963184709/article/details/10364243#)[?](http://blog.csdn.net/huazai963184709/article/details/10364243#) - <span style="color: black;">overridePendingTransition(进入时的动画,离开时的动画) </span> &nbsp; [源码下载](http://download.csdn.net/detail/huazai963184709/6016175)(为了方便,把移动和 旋转动画代码写一块了)

2014年6月23日 · 3 分钟 · 天边的星星