【问题标题】:Looping an image frame in android在android中循环图像帧
【发布时间】:2012-05-20 18:00:26
【问题描述】:

我想做一个动画,一个从右到左移动的波浪。 我做了一个波浪的图像,它的开始与结束重合

我想做一个波浪移动的动画,animationlist 我需要超过 400 帧,并且应用程序的大小会增长...

我需要一种方法来将这个唯一的框架从右向左移动,有什么帮助吗?

【问题讨论】:

    标签: android image animation loops wave


    【解决方案1】:

    您可以创建自己的Drawable 来实现Animatable,并让图像从右向左移动。拥有它实际上是一件非常有用的事情。但是,您无法从 XML 中指定它,您必须以编程方式构建和设置它。

    【讨论】:

    • No he entendido muy bien a lo que te refieres k-ballo
    • 请坚持英文。您可以通过创建一个扩展Drawable 的类来创建自己的自定义drawable,并让它实现Animatable。然后,您将自己绘制,每次都在不同的位置,从单个输入图像生成选取框动画。
    • 我怎样才能让我移动图像的位置时,它从另一侧开始?
    • 你可能不能,你必须画两个子图像。首先绘制从 position 到 end 的子图像,然后绘制从 begin 到 position 的子图像.可能有一种方法可以在重复模式下绘制位图,并使用矩阵使其“移动”。
    【解决方案2】:

    您甚至可以创建一个 GIF 并播放这个 GIF: 下面是代码:

    类 MainActivity:

    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(new MYGIFView(MainActivity.this));
        }
    
    }
    

    类MYGIFView:

    import java.io.InputStream;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Movie;
    import android.view.View;
    
    class MYGIFView extends View {
    
        Movie movie, movie1;
        InputStream is = null, is1 = null;
        long moviestart;
    
        public MYGIFView(Context context) {
            super(context);
    
            // Provide your own gif animation file
    
            is = context.getResources().openRawResource(R.drawable.animation);
            movie = Movie.decodeStream(is);
    
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
    
            canvas.drawColor(Color.WHITE);
            super.onDraw(canvas);
            long now = android.os.SystemClock.uptimeMillis();
            System.out.println("now=" + now);
            if (moviestart == 0) { // first time
                moviestart = now;
    
            }
            System.out.println("\tmoviestart=" + moviestart);
            int relTime = (int) ((now - moviestart) % movie.duration());
            System.out.println("time=" + relTime + "\treltime=" + movie.duration());
            movie.setTime(relTime);
            movie.draw(canvas, this.getWidth() / 2 - 20, this.getHeight() / 2 - 40);
            this.invalidate();
        }
    }
    

    drawable 文件夹内将是您的 GIF 图像。

    【讨论】:

      【解决方案3】:

      首先,您必须将图像 src 的大小加倍,有 2 个波浪而不是一个。 接下来,您必须使用 imageview 的框架边界,您必须适合 仅 ONE 波。这就是线索。

      注意你的图片尺寸,尤其是宽度。

      对于动画,使用这个:

      <?xml version="1.0" encoding="utf-8"?>
      <translate
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:fromXDelta="0%"
          android:toXDelta="-50%"
          android:fromYDelta="0%"
          android:toYDelta="0%"
          android:duration="500"
          android:repeatCount="1000"
          android:interpolator="@android:anim/linear_interpolator"
          android:zAdjustment="top" />
      

      例如,您可以将其命名为 res/anim/wave.xml

      班级(活动?):

          ...
          Animation anim = AnimationUtils.loadAnimation( this, R.anim.wave);
          anim.setRepeatMode(Animation.Infinite);
          animatedIm = (ImageView) findviewbyid(<your-id>)
          animatedIm.setAnimation(anim); 
      

      您可能需要调整 imageview 的大小,以获得连续的波浪移动

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        相关资源
        最近更新 更多