【问题标题】:Why are .gif animated images not animating in my Android app?为什么 .gif 动画图像在我的 Android 应用程序中没有动画效果?
【发布时间】:2011-07-20 10:22:00
【问题描述】:

我正在尝试在我的应用程序中使用 .gif 动画图像,但该图像没有动画。在 iPhone 上它可以工作......为什么 Android 会阻止动画?有什么解决办法吗?

【问题讨论】:

    标签: android image animation animated-gif


    【解决方案1】:

    看起来很多人都希望动画 GIF 仅在 Android 上运行,但他们目前不希望 - 请参阅 Issue 3422 on the Android bug tracker

    根据http://androidosbeginning.blogspot.com/2010/09/gif-animation-in-android.html,您可以通过将动画 GIF 视为电影来做到这一点

    类似的问题,有一个可以帮助你的答案:Android: How do a display a large animated gif given a url?

    【讨论】:

      【解决方案2】:

      你可以这样做

      这里是示例代码。

      GIFDemo1.java

      import java.io.InputStream;
      
      import android.content.Context;
      import android.graphics.BitmapFactory;
      import android.graphics.Canvas;
      import android.graphics.Movie;
      import android.os.Bundle;
      import android.view.View;
      
      public class GIFDemo1 extends GraphicsActivity {
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(new GIFView(this));
          }
          private static class GIFView extends View{
      
              Movie movie,movie1;
              InputStream is=null,is1=null;
              long moviestart;
              long moviestart1;
              public GIFView(Context context) {
                  super(context);
                  is=context.getResources().openRawResource(R.drawable.cartoon);
                  is1=context.getResources().openRawResource(R.drawable.animated_gif);
                  movie=Movie.decodeStream(is);
                  movie1=Movie.decodeStream(is1);
                  BitmapFactory.Options opts = new BitmapFactory.Options();
                  opts.inJustDecodeBounds = true;    // this will request the bm
                  opts.inSampleSize = 10;   
                  //movie=Movie.decodeFile("C:\\cartoon.gif");
              }
      
              @Override
              protected void onDraw(Canvas canvas) {
                  canvas.drawColor(0xFFCCCCCC);
                  super.onDraw(canvas);
                  long now=android.os.SystemClock.uptimeMillis();
                  System.out.println("now="+now);
                   if (moviestart == 0) {   // first time
                       moviestart = now;
      
                   }
                   if(moviestart1==0)
                   {
                       moviestart1=now;
                   }
                   System.out.println("\tmoviestart="+moviestart);
                   int relTime = (int)((now - moviestart) % movie.duration()) ;
                   int relTime1=(int)((now - moviestart1)% movie1.duration());
                   System.out.println("time="+relTime+"\treltime="+movie.duration());
                   movie.setTime(relTime);
                   movie1.setTime(relTime1);
                   movie.draw(canvas,10,10);
                   movie1.draw(canvas,10,100);
                   this.invalidate();
              }
          }
      }
      

      GraphicsActivity.java

      import android.app.Activity;
      import android.os.Bundle;
      import android.view.View;
      import android.view.ViewGroup;
      
      public class GraphicsActivity extends Activity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
          }
      
          @Override
          public void setContentView(View view) {
              if (false) { 
                  // set to true to test Picture
                  ViewGroup vg = new PictureLayout(this);
                  vg.addView(view);
                  view = vg;
              }
      
              super.setContentView(view);
          }
      }
      

      PictureLayout.java

      import android.content.Context;
      import android.graphics.Canvas;
      import android.graphics.Picture;
      import android.graphics.Rect;
      import android.graphics.drawable.Drawable;
      import android.util.AttributeSet;
      import android.view.View;
      import android.view.ViewGroup;
      import android.view.ViewParent;
      
      public class PictureLayout extends ViewGroup {
          private final Picture mPicture = new Picture();
      
          public PictureLayout(Context context) {
              super(context);
          }
      
          public PictureLayout(Context context, AttributeSet attrs) {
              super(context, attrs);
          }    
      
          @Override
          public void addView(View child) {
              if (getChildCount() > 1) {
                  throw new IllegalStateException("PictureLayout can host only one direct child");
              }
      
              super.addView(child);
          }
      
          @Override
          public void addView(View child, int index) {
              if (getChildCount() > 1) {
                  throw new IllegalStateException("PictureLayout can host only one direct child");
              }
      
              super.addView(child, index);
          }
      
          @Override
          public void addView(View child, LayoutParams params) {
              if (getChildCount() > 1) {
                  throw new IllegalStateException("PictureLayout can host only one direct child");
              }
      
              super.addView(child, params);
          }
      
          @Override
          public void addView(View child, int index, LayoutParams params) {
              if (getChildCount() > 1) {
                  throw new IllegalStateException("PictureLayout can host only one direct child");
              }
      
              super.addView(child, index, params);
          }
      
          @Override
          protected LayoutParams generateDefaultLayoutParams() {
              return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
          }
      
          @Override
          protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
              final int count = getChildCount();
      
              int maxHeight = 0;
              int maxWidth = 0;
      
              for (int i = 0; i < count; i++) {
                  final View child = getChildAt(i);
                  if (child.getVisibility() != GONE) {
                      measureChild(child, widthMeasureSpec, heightMeasureSpec);
                  }
              }
      
              maxWidth += getPaddingLeft() + getPaddingRight();
              maxHeight += getPaddingTop() + getPaddingBottom();
      
              Drawable drawable = getBackground();
              if (drawable != null) {
                  maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
                  maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
              }
      
              setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
                      resolveSize(maxHeight, heightMeasureSpec));
          }
      
          private void drawPict(Canvas canvas, int x, int y, int w, int h,
                                float sx, float sy) {
              canvas.save();
              canvas.translate(x, y);
              canvas.clipRect(0, 0, w, h);
              canvas.scale(0.5f, 0.5f);
              canvas.scale(sx, sy, w, h);
              canvas.drawPicture(mPicture);
              canvas.restore();
          }
      
          @Override
          protected void dispatchDraw(Canvas canvas) {
              super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
              mPicture.endRecording();
      
              int x = getWidth()/2;
              int y = getHeight()/2;
      
              if (false) {
                  canvas.drawPicture(mPicture);
              } else {
                  drawPict(canvas, 0, 0, x, y,  1,  1);
                  drawPict(canvas, x, 0, x, y, -1,  1);
                  drawPict(canvas, 0, y, x, y,  1, -1);
                  drawPict(canvas, x, y, x, y, -1, -1);
              }
          }
      
          @Override
          public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
              location[0] = getLeft();
              location[1] = getTop();
              dirty.set(0, 0, getWidth(), getHeight());
              return getParent();
          }
      
          @Override
          protected void onLayout(boolean changed, int l, int t, int r, int b) {
              final int count = super.getChildCount();
      
              for (int i = 0; i < count; i++) {
                  final View child = getChildAt(i);
                  if (child.getVisibility() != GONE) {
                      final int childLeft = getPaddingLeft();
                      final int childTop = getPaddingTop();
                      child.layout(childLeft, childTop,
                              childLeft + child.getMeasuredWidth(),
                              childTop + child.getMeasuredHeight());
      
                  }
              }
          }
      }
      

      希望这对您有所帮助。 它不适用于非常复杂的 gif。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 2012-07-23
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多