Android Animation 遇到的一些问题

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>
<span style="font-family:FangSong_GB2312;">
</span>
注意做颜色标记的代码。经过我验证发现: animationset 没有设置setfillAfter 那么即使TranslateAnimation 设置了setfillafter也没得什么用。而且我还发现 即使TranslateAnimation没有设置setfillafter ,而animationset设置了,那么也能保存最后一刻。在这里我测试手机是 魅蓝Metal 。
我在网上还看到 以为仁兄说之所以 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 具体代码如下:
<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>
Onclik方法执行如下代码:
<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>
最终通过自定义view 不断执行layout方法 解决了我上述的问题。这个方法 是潭州学院传授的,虽然很多人吐槽潭州但是我想想说,虽然他们上一次课的时间很长,只要静下来听,总会有收获的,这个自定义animation 我记得当初潭州讲 自定义下拉刷新时,提到的。对我而言 潭州还值得看看。
到此博客想表达的问题就结束了。哪位兄弟的博客 没有解决我的问题,但是我相信他的哪种方式可以的,估计是我那个地方错了。有眼熟的兄弟  留言指出下。我不胜感激。
再次希望这篇博客能帮助到大家。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值