1:引言 最新在总结android Animation的知识点,在这个过程中我发现一些问题,想通过这个博客和大家分享下。
在这里我想跟大家分享一句话:“我们不做代码的搬运工”。
2.代码的核心部分主要玩成,点击button,imageview执行TranslateAnimation动画。代码如下:
<span style="font-family:Microsoft YaHei;font-size:14px;"> </span><span style="font-family:FangSong_GB2312;font-size:14px;">ImageView imageView;
Button but1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView) findViewById(R.id.image);
but1=(Button) findViewById(R.id.button1);
but1.setOnClickListener(this);
}
@Override
public void onClick(final View v) {
TranslateAnimation ani=new TranslateAnimation(0,100,0,100);
ani.setDuration(2000);
ani.setInterpolator(new LinearInterpolator());
imageView.startAnimation(ani);
}</span>
上图代码运行没得什么问题但是,发现一个问题 执行完动画之后,imageview又回到原位置,无法保留动画最后一刻的位置。
接下来在代码中加入:
ani.setFillAfter(true);之后运行效果
看到没 imageview 最后一刻停留在那个位置不动。但是当再次点击按钮的时候,imageview会恢复到初始位置。
我百度搜索如何解决再次点击按钮 imageview不回到初始位置的时候,发现很多人说setFillAfter没得效果,imageview不保留最后一刻的状态。在我解决我那个问题的时候,我发现一个问题 就是用AnimationSet 来执行动画。具体代码如下:
<span style="font-family:SimSun;"> </span><span style="font-family:FangSong_GB2312;">ImageView imageView; Button but1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=(ImageView) findViewById(R.id.image); but1=(Button) findViewById(R.id.button1); but1.setOnClickListener(this); } @Override public void onClick(final View v) { <span style="color:#6666cc;"> AnimationSet set=new AnimationSet(true)</span><span style="color:#ffff33;">;</span> TranslateAnimation ani=new TranslateAnimation(0,100,0,100); ani.setFillAfter(true); ani.setInterpolator(new LinearInterpolator()); ani.setDuration(2000); set.addAnimation(ani); imageView.startAnimation(set);</span>
注意做颜色标记的代码。经过我验证发现: animationset 没有设置setfillAfter 那么即使TranslateAnimation 设置了setfillafter也没得什么用。而且我还发现 即使TranslateAnimation没有设置setfillafter ,而animationset设置了,那么也能保存最后一刻。在这里我测试手机是 魅蓝Metal 。<span style="font-family:FangSong_GB2312;"> </span>
我在网上还看到 以为仁兄说之所以 setfillafter没得用 是因为 没得setfillable 这条代码。当然我在测试的时候,设置和不设置都一样,或许是因为手机的原因。
至于setfillafter不显示这个问题 就到此为止,我们还是回到主干问题上来。在百度的过程中 发现了很多人引用这篇博客,来解决我上述说到的问题。他的博客地址http://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html。我参考了他写的代码,于是修改了我自己的代码:如下
<span style="font-family:SimSun;"> </span><span style="font-family:FangSong_GB2312;"> @Override public void onClick(final View v) { TranslateAnimation ani=new TranslateAnimation(0,100,0,100); ani.setFillAfter(true); ani.setInterpolator(new LinearInterpolator()); ani.setDuration(2000); ani.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { imageView.clearAnimation(); int l=imageView.getLeft();//imageview离左边的距离 int t=imageView.getTop();//imageview离上边的距离 imageView.layout(l,t,l+imageView.getWidth(),t+imageView.getHeight()); } @Override public void onAnimationRepeat(Animation animation) { } }); imageView.startAnimation(ani); }</span>
就是因为加了一个 anim的监听,发现此刻 imageview在动画执行完毕之后不能保存 最后一刻的状态。经过我再三的确认 看了又看发现: animation加了监听 会影响 anim.setfillafter的效果。这真的是bug 我觉得,第一次见到监听能影响到方法效果的。小弟本身就是菜鸟 源码看不懂,也就不探究下去了。当然还有可能是手机原因。
再次提示下:我用的测试机器俩台都是魅蓝。一个note2 一个metal。
因此 我根据哪位兄弟的博客,没有解决我说到的那个问题,真是不爽,在网上找了半天为什么没找到。难道真的是因为博客的原因???
最后我自己的解决办法是:自定义Animation 具体代码如下:
Onclik方法执行如下代码:<span style="font-family:FangSong_GB2312;">public class MyAnimation extends Animation{ int x; int y; int top; int left; public MyAnimation(int x,int y) { this.x=x;//移动的x距离 this.y=y;//移动的y距离 left=imageView.getLeft(); top=imageView.getTop(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); setDuration(2000); setInterpolator(new LinearInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); int l=(int)(left+interpolatedTime*100); int r=(int)(top+interpolatedTime*100); imageView.layout(l,r,l+imageView.getWidth(),r+imageView.getHeight()); } }</span>
最终通过自定义view 不断执行layout方法 解决了我上述的问题。这个方法 是潭州学院传授的,虽然很多人吐槽潭州但是我想想说,虽然他们上一次课的时间很长,只要静下来听,总会有收获的,这个自定义animation 我记得当初潭州讲 自定义下拉刷新时,提到的。对我而言 潭州还值得看看。<span style="font-family:SimSun;"> </span><span style="font-family:FangSong_GB2312;">@Override public void onClick(final View v) { MyAnimation ani=new MyAnimation(100,100); imageView.startAnimation(ani); }</span>
到此博客想表达的问题就结束了。哪位兄弟的博客 没有解决我的问题,但是我相信他的哪种方式可以的,估计是我那个地方错了。有眼熟的兄弟 留言指出下。我不胜感激。
再次希望这篇博客能帮助到大家。