Animations的使用(3)
1 AnimationSet的使用方法
什么是AnimationSet
1 AnimationSet是Animation的子类
2 一个AnimationSet包含了一系列的Animation
3 针对AnimationSet设置一些Animation的常见属性(如StartOffset,duration等),可以被包含在AnimationSet当中的Animation继承
使用步骤:(类似1中的例子 只不过含有2个动画效果)
AnimationSet animationSet = new AnimationSet(ture); AlpahaAnimation alpha = new AlphaAnimation(...); RotateAnimation rotate = new RotateAnimation(...); animationSet.addAnimation(alpha); animationSet.addAnimaion(rotate); animationSet.setDuration(2000); animationSet.setStartOffset(500); imageView.startAnimation(animationSet);
2 Interpolator的使用方法
Interpolator定义了动画变化速率,在Animations框架中定义了以下几种Interpolator
AccelerateDecelerateInterpolator:在动画开始和结束的地方速率变化较慢,中间的时候加速
AccelerateInterpolator:在动画开始的地方速率改变较慢,然后加速
CycleInterpolator:动画循环播放特定次数,速率改变沿正弦曲线
DecelerateInterpolator:在动画开始的地方速率改变较慢,然后减速
LinearInterpolator:以均匀的速率改变
设置的地方就在set标签中的 android:interpolator="@android:anim/accelerate_interpolator"
而之后还有一个android:shareInterpolator="true" 从名字就可以看到这是为set中所有的动画设置Interpolator
如果要单独设置 则将shareInterpolator设为false 然后为每个动画中单独定义Interpolator
以上是在xml中设置,如果要在代码中设置
animationSet.setInterpolator(new AccelerateInterpolator());(也可以单独设置)
注意在AnimationSet的构造方法中有一个boolean参数,这个参数就是shareInterpolator的设定
3 Frame-By-Frame Animations的使用方法
1 在res/drawable中创建一个xml文件,定义Animation的动画播放序列 anim_nv.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/nv1" android:duration="500" /> <item android:drawable="@drawable/nv2" android:duration="500" /> <item android:drawable="@drawable/nv3" android:duration="500" /> <item android:drawable="@drawable/nv4" android:duration="500" /> </animation-list>
2 为ImageView设置背景资源
imageView.setBackgroundResource(R.drawable.anim_nv);
3 通过ImageView得到AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
3 执行动画
animationDrawable.start();
ANT通配符有三种:
通配符 说明
? 匹配任何单字符
* 匹配0或者任意数量的字符
** 匹配0或者更多的目录
例子:
URL路径 说明
/app/*.x 匹配(Matches)所有在app路径下的.x文件
/app/p?ttern 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
/**/example 匹配(Matches) /app/example, /app/foo/example, 和 /example
/app/**/dir/file. 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java
/**/*.jsp 匹配(Matches)任何的.jsp 文件
属性:
最长匹配原则(has more characters)
说明,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/*.jsp和/app/dir/*.jsp,那么会根据模式/app/dir/*.jsp来匹配
最近研究UIView动画,对比分在线客户端使用了很多UIView动画效果。
一直以来都是使用UIView animateWithDuration实现UIView动画,但是这种模式无法实现连续动,每个UIView只能同步播放,由于刚接触iOS开发,一直找不到解决方法,网上找了许多都是使用CAKeyframeAnimation来实现,虽然CAKeyframeAnimation网上实现起来更简单,但我觉得还是有点麻烦。于是自己扩展了UIView实现连续动画,就是一段动画运行完毕后调用另一段动画,保证两段动画没有重叠。
大概有两种方法可以选择:
1.增加延迟以便在第一段动画结束之后在启动第二段动画([performSelector:withObject:afterDelay:])
2.指定动画委托回调(animationDidStop:finished:context:)
从编程的角度来说就更容易,下面我们将扩展类UIView的方法,通过类别引入一个新的方法----commitModalAnimations.调用此方法而不是调用commitAnimations方法,它会建立一个新的runloop,该循环只有在动画结束的时候才会停止。这样确保了commitModalAnimations方法只有在动画结束才将控制权返还给调用方法,利用此扩展方法可以将动画块按顺序放进代码中,不必做任何其他的修改就能避免动画的重叠现象。
@interface UIView (ModalAnimationHelper) + (void) commitModalAnimations; @end @interface UIViewDelegate : NSObject { CFRunLoopRef currentLoop; } @end
@implementation UIViewDelegate -(id) initWithRunLoop: (CFRunLoopRef)runLoop { if (self = [super init]) currentLoop = runLoop; return self; } -(void) animationFinished: (id) sender { CFRunLoopStop(currentLoop); } @end @implementation UIView (ModalAnimationHelper) + (void) commitModalAnimations { CFRunLoopRef currentLoop = CFRunLoopGetCurrent(); UIViewDelegate *uivdelegate = [[UIViewDelegate alloc] initWithRunLoop:currentLoop]; [UIView setAnimationDelegate:uivdelegate]; [UIView setAnimationDidStopSelector:@selector(animationFinished:)]; [UIView commitAnimations]; CFRunLoopRun(); [uivdelegate release]; } @end
以后这样调用就可以了:
-(void) displayAnimate{ self.alpha = 1; CGRect _frame = self.frame; _frame.origin.x = -100; self.frame = _frame; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.15]; _frame.origin.x = x+100; self.frame = _frame; self.alpha = 0; [UIView commitModalAnimations]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.15]; _frame.origin.x = x; self.frame = _frame; self.alpha = 1; [UIView commitModalAnimations]; }