最新消息:

App Inventor插件开发(三)动画插件

App Inventor 少儿编程 1883浏览 0评论

已上传源码到GitHub,可能有所改变。
国内可以访问Gitee,来自开学后虚脱的我。。。
已上传aix文件到GitHub,重写已完成,增加了动画开始和结束监听。
aia和apk会放在github里aia-apk文件夹。本章是3_Anim
看了别人优秀的博客,发现自己写的博客就是一团糟。。。
写博客不是秀出代码来让大家看看我有多牛,也不是让大家跟着我一起编译出这个插件,而是我有什么问题,怎么解决的,说给大家听听可能会有所帮助。
趁着代码重构,也顺便重写一下博客,从问题的解决入手。之前的两个闹着玩一样的就算了。
大家还是用力的喷一喷我吧,我已经做好了心里准备。
顺便再说一下,现在的动画插件已经不能对那些ai原生控件进行操控了,只能对有id的view进行设置。

0.问题

App Inventor有个很严重的缺点,那就是不支持动画,我们可以考虑通过插件解决。
在Android下,有一个View.animate()的动画实现方式,超简洁。
比如我让textView在2000ms内旋转720°

textView.animate().rotation(720).setDuration(2000).start();

有没有惊叹到!!!就是这般简洁!
其实现原理就是View.animate()会获取动画对象ViewPropertyAnimator,其他的设置方法就是对这个对象设置并返回,所以可以连续使用,看看源码就懂了,最后一个start就开始动画。
但是ai里返回值没有人权,不能调用他的方法,只能再次被当作参数的分。
如果让方法都加上一个参数用来传递的话,可读性也完了,会变成这个惨样:
App Inventor插件开发(三)动画插件
有没有想杀人?我优化了一下,好看了不少。
App Inventor插件开发(三)动画插件
两个例子实现的功能差的远了,所以看起来后面的很多。
这个例子只是随手写的,实现的功能是点一下就转720°,并且转的时候会不能点,转完才能点。
例子里面有很多其他插件,本章并不会涉及,只是强迫症犯了不做的完美难受。
aia和apk会放在github里aia-apk文件夹,见最顶。
接下来我们将封装成一个类ViewPropertyAnimatorUtil来执行动画。

1.解决步骤

1.1设计模式

第一张图就是我第一次写的时候,发现ai返回值并不能再次调用函数,万不得已,在方法中增加了一个参数,用于返回值的再次调用,长的跟个铁塔似的,风格诡异。
所以在我码完OpenGL的平行投影来画那个控制杆时,又回来重构了一遍。
突然发现,这根本就不是什么代码风格,我简直想抽自己一巴掌。
这只不过是最基本的设计模式——工厂模式。
我学了那么久竟然连23种java的设计模式都不知道???
简直是个假人???
是我孤陋寡闻了。。。

public class ViewPropertyAnimatorUtil extends IDUtil

1.2源码讲解

源码在ViewPropertyAnimatorUtil.java。
getAnimator()返回动画类ViewPropertyAnimator

public ViewPropertyAnimator getAnimator(int id) {
	return findViewById(id).animate();
}

这里似乎那个yail type的限制没了?还是只作用在SimpleFunction方法上?
start()执行,cancel()取消。
剩下的方法就都是封装而已。
b的含义是加不加by。
如果你不加by,那么他会从0720,第二次是720720。
如果你加by,会从0720,7201440,一直增加下去。
比如这个rotation拉出来给大家看看就懂了。

@SimpleFunction(description = "rotation")
public void rotation(float f,boolean b) {
	if(b) getAnimator(id).rotationBy(f);
	else getAnimator(id).rotation(f);
}

至于什么WithStartAction,WithEndAction就是一个动画开始和结束时的回调,参数id时被执行动画的view的id。
###1.3对原生组件的支持
因为原生组件被创建时根本没有赋予id,只能铁塔样的风格,所以我放弃了支持。
如果你想支持,有以下的方法

public ViewPropertyAnimator getAnimator(Object avc) {
	return ((AndroidViewComponent)avc).getView().animate();
}

因为所有可见组件的父类是AndroidViewComponent,有一个getView的方法,可以获取到view,也就可以得到ViewPropertyAnimator。
但是显然这是不够的,要大改,可能跟我一样放个参数,也可能设个变量来把动画类得到后存进去,只用设置一次。反正总之要大改才能做到。

2.测试

测试图我就不再更新了,反正也差不多。
App Inventor插件开发(三)动画插件

3.未来计划

未来还有很多没有封装的动画等着我去封装(怎么有种正义的感觉)。。。
比如插值器还没设置过呢。
比如改变宽高的动画,这个在AS下也是一个比较烦的一个动画(相对而言),必须要获取布局再设置,要用ValueAnimation,而且效率也有点低,overdraw严重。
还有ObjectAnimator,可以做到背景色渐变动画,这个很有情调吧。
还有ValueAnimation,可以任意设置动画时执行的方法。
Activity间的切换动画。5.0之后又多了共享元素动画。
看来还任重道远啊~

您必须 登录 才能发表评论!