Android의 ImageView에서 gif 이미지 추가


135

imageView에 애니메이션 GIF 이미지를 추가했습니다. GIF 이미지로 볼 수 없습니다. 애니메이션이 없습니다. 정지 이미지처럼 나타납니다. GIF 이미지로 어떻게 표시 할 수 있는지 알고 싶습니다.


1
아래 링크를 확인하면 도움이 될 수 있습니다 stackoverflow.com/questions/3660209/… stackoverflow.com/questions/3691726/…
Nikhil

이 링크는 간단하고 사용하기 쉽고 최고입니다. http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html
Muhammad Aamir Ali

정확히 만 사용하지 않는 것보다 웹보기에서 이미지 뷰에 GIF 이미지를 추가하려는 경우 나이 그 작업 벌금 stackoverflow.com/a/29488519/3514144
아제 디야을

귀하의 질문에 대한 답변 링크는 다음과 같습니다 stackoverflow.com/questions/35147375/…
Venkatesh Somu

답변:


79

먼저 GIF 이미지를 앱의 Asset Folder에 복사하여 다음 클래스를 만들고 AnimationActivity 코드를 붙여 넣습니다 .-

public class AnimationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    InputStream stream = null;
    try {
        stream = getAssets().open("piggy.gif");
    } catch (IOException e) {
        e.printStackTrace();
    }
          GifWebView view = new GifWebView(this, "file:///android_asset    /piggy.gif");                 

    setContentView(view);
}
}

GifDecoder :-

public class GifDecoder {

    public static final int STATUS_OK = 0;

    public static final int STATUS_FORMAT_ERROR = 1;

    public static final int STATUS_OPEN_ERROR = 2;

    protected static final int MAX_STACK_SIZE = 4096;
    protected InputStream in;
    protected int status;
    protected int width; // full image width
    protected int height; // full image height
    protected boolean gctFlag; // global color table used
    protected int gctSize; // size of global color table
    protected int loopCount = 1; // iterations; 0 = repeat forever
    protected int[] gct; // global color table
    protected int[] lct; // local color table
    protected int[] act; // active color table
    protected int bgIndex; // background color index
    protected int bgColor; // background color
    protected int lastBgColor; // previous bg color
    protected int pixelAspect; // pixel aspect ratio
    protected boolean lctFlag; // local color table flag
    protected boolean interlace; // interlace flag
    protected int lctSize; // local color table size
    protected int ix, iy, iw, ih; // current image rectangle
    protected int lrx, lry, lrw, lrh;
    protected Bitmap image; // current frame
    protected Bitmap lastBitmap; // previous frame
    protected byte[] block = new byte[256]; // current data block
    protected int blockSize = 0; // block size last graphic control extension info
    protected int dispose = 0; // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
    protected int lastDispose = 0;
    protected boolean transparency = false; // use transparent color
    protected int delay = 0; // delay in milliseconds
    protected int transIndex; // transparent color index
    // LZW decoder working arrays
    protected short[] prefix;
    protected byte[] suffix;
    protected byte[] pixelStack;
    protected byte[] pixels;
    protected Vector<GifFrame> frames; // frames read from current file
    protected int frameCount;

    private static class GifFrame {
            public GifFrame(Bitmap im, int del) {
                    image = im;
                    delay = del;
            }

            public Bitmap image;
            public int delay;
    }


    public int getDelay(int n) {
            delay = -1;
            if ((n >= 0) && (n < frameCount)) {
                    delay = frames.elementAt(n).delay;
            }
            return delay;
    }


    public int getFrameCount() {
            return frameCount;
    }


    public Bitmap getBitmap() {
            return getFrame(0);
    }


    public int getLoopCount() {
            return loopCount;
    }
    protected void setPixels() {

            int[] dest = new int[width * height];

            if (lastDispose > 0) {
                    if (lastDispose == 3) {
                            // use image before last
                            int n = frameCount - 2;
                            if (n > 0) {
                                    lastBitmap = getFrame(n - 1);
                            } else {
                                    lastBitmap = null;
                            }
                    }
                    if (lastBitmap != null) {
                            lastBitmap.getPixels(dest, 0, width, 0, 0, width, height);
                            if (lastDispose == 2) {
                                    // fill last image rect area with background color
                                    int c = 0;
                                    if (!transparency) {
                                            c = lastBgColor;
                                    }
                                    for (int i = 0; i < lrh; i++) {
                                            int n1 = (lry + i) * width + lrx;
                                            int n2 = n1 + lrw;
                                            for (int k = n1; k < n2; k++) {
                                                    dest[k] = c;
                                            }
                                    }
                            }
                    }
            }
            int pass = 1;
            int inc = 8;
            int iline = 0;
            for (int i = 0; i < ih; i++) {
                    int line = i;
                    if (interlace) {
                            if (iline >= ih) {
                                    pass++;
                                    switch (pass) {
                                    case 2:
                                            iline = 4;
                                            break;
                                    case 3:
                                            iline = 2;
                                            inc = 4;
                                            break;
                                    case 4:
                                            iline = 1;
                                            inc = 2;
                                            break;
                                    default:
                                            break;
                                    }
                            }
                            line = iline;
                            iline += inc;
                    }
                    line += iy;
                    if (line < height) {
                            int k = line * width;
                            int dx = k + ix; // start of line in dest
                            int dlim = dx + iw; // end of dest line
                            if ((k + width) < dlim) {
                                    dlim = k + width; // past dest edge
                            }
                            int sx = i * iw; // start of line in source
                            while (dx < dlim) {
                                    // map color and insert in destination
                                    int index = ((int) pixels[sx++]) & 0xff;
                                    int c = act[index];
                                    if (c != 0) {
                                            dest[dx] = c;
                                    }
                                    dx++;
                            }
                    }
            }
            image = Bitmap.createBitmap(dest, width, height, Config.ARGB_4444);
    }
    public Bitmap getFrame(int n) {
            if (frameCount <= 0)
                    return null;
            n = n % frameCount;
            return ((GifFrame) frames.elementAt(n)).image;
    }
    public int read(InputStream is) {
            init();
            if (is != null) {
                    in = is;
                    readHeader();
                    if (!err()) {
                            readContents();
                            if (frameCount < 0) {
                                    status = STATUS_FORMAT_ERROR;
                            }
                    }
            } else {
                    status = STATUS_OPEN_ERROR;
            }
            try {
                    is.close();
            } catch (Exception e) {
            }
            return status;
    }      
    protected void decodeBitmapData() {
            int nullCode = -1;
            int npix = iw * ih;
            int available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, count, i, datum, data_size, first, top, bi, pi;
            if ((pixels == null) || (pixels.length < npix)) {
                    pixels = new byte[npix]; // allocate new pixel array
            }
            if (prefix == null) {
                    prefix = new short[MAX_STACK_SIZE];
            }
            if (suffix == null) {
                    suffix = new byte[MAX_STACK_SIZE];
            }
            if (pixelStack == null) {
                    pixelStack = new byte[MAX_STACK_SIZE + 1];
            }                
            data_size = read();
            clear = 1 << data_size;
            end_of_information = clear + 1;
            available = clear + 2;
            old_code = nullCode;
            code_size = data_size + 1;
            code_mask = (1 << code_size) - 1;
            for (code = 0; code < clear; code++) {
                    prefix[code] = 0; // XXX ArrayIndexOutOfBoundsException
                    suffix[code] = (byte) code;
            }               
            datum = bits = count = first = top = pi = bi = 0;
            for (i = 0; i < npix;) {
                    if (top == 0) {
                            if (bits < code_size) {
                                    // Load bytes until there are enough bits for a code.
                                    if (count == 0) {
                                            // Read a new data block.
                                            count = readBlock();
                                            if (count <= 0) {
                                                    break;
                                            }
                                            bi = 0;
                                    }
                                    datum += (((int) block[bi]) & 0xff) << bits;
                                    bits += 8;
                                    bi++;
                                    count--;
                                    continue;
                            }                               
                            code = datum & code_mask;
                            datum >>= code_size;
                            bits -= code_size;                               
                            if ((code > available) || (code == end_of_information)) {
                                    break;
                            }
                            if (code == clear) {
                                    // Reset decoder.
                                    code_size = data_size + 1;
                                    code_mask = (1 << code_size) - 1;
                                    available = clear + 2;
                                    old_code = nullCode;
                                    continue;
                            }
                            if (old_code == nullCode) {
                                    pixelStack[top++] = suffix[code];
                                    old_code = code;
                                    first = code;
                                    continue;
                            }
                            in_code = code;
                            if (code == available) {
                                    pixelStack[top++] = (byte) first;
                                    code = old_code;
                            }
                            while (code > clear) {
                                    pixelStack[top++] = suffix[code];
                                    code = prefix[code];
                            }
                            first = ((int) suffix[code]) & 0xff;
                            if (available >= MAX_STACK_SIZE) {
                                    break;
                            }
                            pixelStack[top++] = (byte) first;
                            prefix[available] = (short) old_code;
                            suffix[available] = (byte) first;
                            available++;
                            if (((available & code_mask) == 0) && (available < MAX_STACK_SIZE)) {
                                    code_size++;
                                    code_mask += available;
                            }
                            old_code = in_code;
                    }
                    // Pop a pixel off the pixel stack.
                    top--;
                    pixels[pi++] = pixelStack[top];
                    i++;
            }
            for (i = pi; i < npix; i++) {
                    pixels[i] = 0; // clear missing pixels
            }
    }        
    protected boolean err() {
            return status != STATUS_OK;
    }       
    protected void init() {
            status = STATUS_OK;
            frameCount = 0;
            frames = new Vector<GifFrame>();
            gct = null;
            lct = null;
    }        
    protected int read() {
            int curByte = 0;
            try {
                    curByte = in.read();
            } catch (Exception e) {
                    status = STATUS_FORMAT_ERROR;
            }
            return curByte;
    }       
    protected int readBlock() {
            blockSize = read();
            int n = 0;
            if (blockSize > 0) {
                    try {
                            int count = 0;
                            while (n < blockSize) {
                                    count = in.read(block, n, blockSize - n);
                                    if (count == -1) {
                                            break;
                                    }
                                    n += count;
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    if (n < blockSize) {
                            status = STATUS_FORMAT_ERROR;
                    }
            }
            return n;
    }        
    protected int[] readColorTable(int ncolors) {
            int nbytes = 3 * ncolors;
            int[] tab = null;
            byte[] c = new byte[nbytes];
            int n = 0;
            try {
                    n = in.read(c);
            } catch (Exception e) {
                    e.printStackTrace();
            }
            if (n < nbytes) {
                    status = STATUS_FORMAT_ERROR;
            } else {
                    tab = new int[256]; // max size to avoid bounds checks
                    int i = 0;
                    int j = 0;
                    while (i < ncolors) {
                            int r = ((int) c[j++]) & 0xff;
                            int g = ((int) c[j++]) & 0xff;
                            int b = ((int) c[j++]) & 0xff;
                            tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b;
                    }
            }
            return tab;
    }       
    protected void readContents() {
            // read GIF file content blocks
            boolean done = false;
            while (!(done || err())) {
                    int code = read();
                    switch (code) {
                    case 0x2C: // image separator
                            readBitmap();
                            break;
                    case 0x21: // extension
                            code = read();
                            switch (code) {
                            case 0xf9: // graphics control extension
                                    readGraphicControlExt();
                                    break;
                            case 0xff: // application extension
                                    readBlock();
                                    String app = "";
                                    for (int i = 0; i < 11; i++) {
                                            app += (char) block[i];
                                    }
                                    if (app.equals("NETSCAPE2.0")) {
                                            readNetscapeExt();
                                    } else {
                                            skip(); // don't care
                                    }
                                    break;
                            case 0xfe:// comment extension
                                    skip();
                                    break;
                            case 0x01:// plain text extension
                                    skip();
                                    break;
                            default: // uninteresting extension
                                    skip();
                            }
                            break;
                    case 0x3b: // terminator
                            done = true;
                            break;
                    case 0x00: // bad byte, but keep going and see what happens break;
                    default:
                            status = STATUS_FORMAT_ERROR;
                    }
            }
    }      
    protected void readGraphicControlExt() {
            read(); // block size
            int packed = read(); // packed fields
            dispose = (packed & 0x1c) >> 2; // disposal method
            if (dispose == 0) {
                    dispose = 1; // elect to keep old image if discretionary
            }
            transparency = (packed & 1) != 0;
            delay = readShort() * 10; // delay in milliseconds
            transIndex = read(); // transparent color index
            read(); // block terminator
    }       
    protected void readHeader() {
            String id = "";
            for (int i = 0; i < 6; i++) {
                    id += (char) read();
            }
            if (!id.startsWith("GIF")) {
                    status = STATUS_FORMAT_ERROR;
                    return;
            }
            readLSD();
            if (gctFlag && !err()) {
                    gct = readColorTable(gctSize);
                    bgColor = gct[bgIndex];
            }
    }        
    protected void readBitmap() {
            ix = readShort(); // (sub)image position & size
            iy = readShort();
            iw = readShort();
            ih = readShort();
            int packed = read();
            lctFlag = (packed & 0x80) != 0; // 1 - local color table flag interlace
            lctSize = (int) Math.pow(2, (packed & 0x07) + 1);
            interlace = (packed & 0x40) != 0;
            if (lctFlag) {
                    lct = readColorTable(lctSize); // read table
                    act = lct; // make local table active
            } else {
                    act = gct; // make global table active
                    if (bgIndex == transIndex) {
                            bgColor = 0;
                    }
            }
            int save = 0;
            if (transparency) {
                    save = act[transIndex];
                    act[transIndex] = 0; // set transparent color if specified
            }
            if (act == null) {
                    status = STATUS_FORMAT_ERROR; // no color table defined
            }
            if (err()) {
                    return;
            }
            decodeBitmapData(); // decode pixel data
            skip();
            if (err()) {
                    return;
            }
            frameCount++;
            // create new image to receive frame data
            image = Bitmap.createBitmap(width, height, Config.ARGB_4444);
            setPixels(); // transfer pixel data to image
            frames.addElement(new GifFrame(image, delay)); // add image to frame
            // list
            if (transparency) {
                    act[transIndex] = save;
            }
            resetFrame();
    }
    protected void readLSD() {
            // logical screen size
            width = readShort();
            height = readShort();
            // packed fields
            int packed = read();
            gctFlag = (packed & 0x80) != 0; // 1 : global color table flag
            // 2-4 : color resolution
            // 5 : gct sort flag
            gctSize = 2 << (packed & 7); // 6-8 : gct size
            bgIndex = read(); // background color index
            pixelAspect = read(); // pixel aspect ratio
    }       
    protected void readNetscapeExt() {
            do {
                    readBlock();
                    if (block[0] == 1) {
                            // loop count sub-block
                            int b1 = ((int) block[1]) & 0xff;
                            int b2 = ((int) block[2]) & 0xff;
                            loopCount = (b2 << 8) | b1;
                    }
            } while ((blockSize > 0) && !err());
    }       
    protected int readShort() {
            // read 16-bit value, LSB first
            return read() | (read() << 8);
    }
    protected void resetFrame() {
            lastDispose = dispose;
            lrx = ix;
            lry = iy;
            lrw = iw;
            lrh = ih;
            lastBitmap = image;
            lastBgColor = bgColor;
            dispose = 0;
            transparency = false;
            delay = 0;
            lct = null;
    }
    protected void skip() {
            do {
                    readBlock();
            } while ((blockSize > 0) && !err());
    }
}

GifDecoderView :-

public class GifDecoderView extends ImageView {

private boolean mIsPlayingGif = false;

private GifDecoder mGifDecoder;

private Bitmap mTmpBitmap;

final Handler mHandler = new Handler();

final Runnable mUpdateResults = new Runnable() {
    public void run() {
        if (mTmpBitmap != null && !mTmpBitmap.isRecycled()) {
            GifDecoderView.this.setImageBitmap(mTmpBitmap);
        }
    }
};

public GifDecoderView(Context context, InputStream stream) {
    super(context);
    playGif(stream);
}

private void playGif(InputStream stream) {
    mGifDecoder = new GifDecoder();
    mGifDecoder.read(stream);

    mIsPlayingGif = true;

    new Thread(new Runnable() {
        public void run() {
            final int n = mGifDecoder.getFrameCount();
            final int ntimes = mGifDecoder.getLoopCount();
            int repetitionCounter = 0;
            do {
                for (int i = 0; i < n; i++) {
                    mTmpBitmap = mGifDecoder.getFrame(i);
                    int t = mGifDecoder.getDelay(i);
                    mHandler.post(mUpdateResults);
                    try {
                        Thread.sleep(t);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if(ntimes != 0) {
                    repetitionCounter ++;
                }
            } while (mIsPlayingGif && (repetitionCounter <= ntimes));
        }
    }).start();
}

public void stopRendering() {
    mIsPlayingGif = true;
}
}

GifMovieView :-

public class GifMovieView extends View {

private Movie mMovie;

private long mMoviestart;

public GifMovieView(Context context, InputStream stream) {
    super(context);

    mMovie = Movie.decodeStream(stream);        
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.TRANSPARENT);
    super.onDraw(canvas);
    final long now = SystemClock.uptimeMillis();

    if (mMoviestart == 0) { 
        mMoviestart = now;
    }

    final int relTime = (int)((now - mMoviestart) % mMovie.duration());
    mMovie.setTime(relTime);
    mMovie.draw(canvas, 10, 10);
    this.invalidate();
}
}

GifWebView :-

public class GifWebView extends WebView {

public GifWebView(Context context, String path) {
    super(context);        

    loadUrl(path);
}
}

나는 그것이 당신을 도울 수 있다고 생각합니다 ... :)


72
기본적으로 디코더와 복잡한 코드를 만들고 절대 사용하지 않기 때문에이 모든 것이 필요하지 않습니다! GifWebView view = new GifWebView (this, "file : /// android_asset /piggy.gif")를 사용하고 있습니다. webview에 대한 사용자 정의가없는 webview의 서브 클래스를 호출하면이 전체 코드를 3 줄로 바꿀 수 있습니다. webView wView = new webView (this); wView.loadUrl ( "file : ///android_asset/piggy.gif"); setContentView (view);
Ahmad Dwaik 'Warlock'10

2
답장 주셔서 감사합니다 .. :) 잘 작동합니다 !! 그러나 webview (GifWebView 클래스)에 장치 화면보다 큰 gif 파일이 표시되는 문제가 있습니다. 그래서 그보기에 대한 사용자 정의 너비와 높이를 제공하는 방법 또는 다른보기를 사용할 수 있습니까 ???
안드로이드 학습자

이것은 내 GIF를 한 번만 재생합니까? gif를 통해 계속 순환하지 않습니까 ??? 어쨌든 메소드를 다시 실행하여 다시 표시 할 수 있습니까?
James111


이것은 4.4에서 실행되는 장치에서 작동하지만 Lollipop 장치 (5.1)에서 실행하면 Gif가 애니메이션되지 않습니다.
vikzilla

217

build.gradle (Module : app) android-gif-drawable에서 다음 코드를 추가하여 종속성으로 추가하십시오.

allprojects {
    repositories {
       mavenCentral()
    }
}

dependencies {
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'
}


업데이트 : Android Gradle Plugin 3.0.0 부터 컴파일을위한 새로운 명령은입니다 implementation. 위의 행을 다음과 같이 변경해야 할 수도 있습니다.

dependencies {
    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17'
}

그런 다음 프로젝트를 동기화하십시오. 동기화가 끝나면 레이아웃 파일로 이동하여 다음 코드를 추가하십시오.

<pl.droidsonroids.gif.GifImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/gif_file"
/>

그게 전부입니다. 간단한 ImageView로 관리 할 수 ​​있습니다.


9
이 답변은 가장 좋은 답변이며 매우 원활하게 작동합니다. 다른 것을 시도해 본 후 클래스를 만들고 믿을 수
없었습니다

부드럽고 더 나은 다음 GIF를 위해 활공
Himanshu Shekher Jha

1
10 초만에 구현 된 나에게도 최고
Diogo Garcia

간단한 단계. 이것이 답이되어야합니다. 몇 분 안에
sunil

3
pl.droidsonroids.gif.GifImageView대신 사용 해서는 안 됩니까?
Flimm

23

VideoView를 사용하십시오 .

기본적으로 ImageView는 애니메이션 이미지를 지원하지 않습니다. 애니메이션 GIF 파일을 표시하는 두 가지 옵션이 있습니다

  1. 사용하다 VideoView
  2. 사용 ImageView후 및 분할 여러 부분에 GIF 파일과은에 애니메이션을 적용

8
VideoView를 사용하는 방법 VideoView에서 특정 gif 이미지를 보여줄 수 있습니까
Kamalone

VideoView를 어떻게 사용할 수 있습니까? 경로를 Gif로 설정하면 단순히 작동하지 않습니다.
entropid

또한 VideoView애니메이션 GIF를 표시하는 데 어떻게 사용할 수 있습니까?
Ajay S

GIF를 잊어 버리고 애니메이션 비디오를 사용하십시오. 그렇게 생각합니다. 그래도 질문에 대한 대답인지 확실하지 않습니다.
Krishnabhadra

@Sunil Kumar Sahoo 사용자의 의견에 답변하지 않았습니다!
user25

16

최신 글라이드 라이브러리

Gradle을 사용하십시오.

repositories {
  mavenCentral()
  google()
}

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.8.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

활동 또는 조각에서 :

ImageView imageView = findViewById(R.id.imageView);

/* from internet*/
Glide.with(this)
        .load("https://media.giphy.com/media/98uBZTzlXMhkk/giphy.gif")
        .into(imageView);

/*from raw folder*/
Glide.with(this)
        .load(R.raw.giphy)
        .into(imageView);

12

Android에서 GIF 표시

창조하다 CustomGifView.java which extends View Class

 public class CustomGifView extends View {

 private InputStream gifInputStream;
 private Movie gifMovie;
 private int movieWidth, movieHeight;
 private long movieDuration;
 private long mMovieStart;

 public CustomGifView(Context context) {
  super(context);
  init(context);
 }

 public CustomGifView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(context);
 }

 public CustomGifView(Context context, AttributeSet attrs, 
   int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(context);
 }

 private void init(Context context){
  setFocusable(true);
  gifInputStream = context.getResources()
    .openRawResource(R.drawable.YOUR_IMAGE);

  gifMovie = Movie.decodeStream(gifInputStream);
  movieWidth = gifMovie.width();
  movieHeight = gifMovie.height();
  movieDuration = gifMovie.duration();
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, 
   int heightMeasureSpec) {
  setMeasuredDimension(movieWidth, movieHeight);
 }

 public int getMovieWidth(){
  return movieWidth;
 }

 public int getMovieHeight(){
  return movieHeight;
 }

 public long getMovieDuration(){
  return movieDuration;
 }

 @Override
 protected void onDraw(Canvas canvas) {

  long now = android.os.SystemClock.uptimeMillis();
        if (mMovieStart == 0) {   // first time
            mMovieStart = now;
        }

        if (gifMovie != null) {

            int dur = gifMovie.duration();
            if (dur == 0) {
                dur = 1000;
            }

            int relTime = (int)((now - mMovieStart) % dur);

            gifMovie.setTime(relTime);

            gifMovie.draw(canvas, 0, 0);
            invalidate();

        }

 }

 }

이제 XML에서이 클래스를 호출하십시오.

 <Your_PackageName.CustomGifView
        android:id="@+id/gifview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

NP

하드웨어 가속을 끄려면 AndroidManifest.xml을 수정하십시오.

 android:hardwareAccelerated="false"

참고

또 다른 트릭

애니메이션 기능을 위해 방문 할 수 있습니다

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html


1
잘 작동합니다! 이를 구현하기위한 최소 API 레벨을 알고 있습니까?
Khan

@KhanSquare 아마 15
IntelliJ Amiya

@Lakhan 여기에서 잘 작동합니다. 좋아, 다시 확인하겠습니다
IntelliJ Amiya

1
아래의 kimmi dhingra의 답변에 따라 if (Build.VERSION.SDK_INT> = 11) {gifImageView.setLayerType (View.LAYER_TYPE_SOFTWARE, null); }
Aditya Vyas-Lakhan

1
@IntelliJAmiya 그래, 그것은 다른 사람들도 도울 것입니다
Aditya Vyas-Lakhan

10

글라이드 라이브러리를 사용하는 것이 좋습니다. 글라이드를 사용하려면이 의존성을 추가하기 위해 이것을 추가해야합니다

compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:23.4.0'

당신의 grandle (Module : app) 파일에.

그런 다음이 코드 줄을 사용하여 gif 이미지를로드하십시오.

Glide.with(context).load(R.drawable.loading).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(loadingImageView);

글라이드에 대한 추가 정보


8

Ahmad Dwaik 'Warlock 's comment를 기반으로 다음 코드를 시도해 보았습니다.

  1. xml 파일에서 webview를 사용하고 정확하게 .gif 이미지를 표시하려는 위치로 위치를 조정하십시오.
  2. 귀하의 활동에서 다른보기와 마찬가지로이 작은 웹보기를 초기화하십시오.
  3. 자산 폴더에 .gif 이미지를 배치하십시오.
  4. "diyaWebView1.loadUrl ("file : ///android_asset/www/diya.gif ");"와 같이 URL을 웹뷰에로드하는 것처럼 이미지를로드하십시오.
  5. 응용 프로그램을 시작할 때 .gif 이미지를 볼 수 있습니다.

추신 : .gif 이미지가 웹보기에 맞는 경우 또는 그 반대의 경우 이미지가 스크롤 막대가 활성화 된 웹보기보다 크면 사용자가 이미지 AKA 웹보기를 스크롤 할 수 있습니다. 따라서 이미지별로 웹뷰에 적절한 크기를 제공하거나 웹뷰에 맞는 이미지를 편집하려면이 정보를 사용할 때주의해야합니다.


5

Webview를 사용하여 다음과 같은 GIF를로드하십시오.

webView = (WebView) findViewById(R.id.webView);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/1.gif");

이미지 이름은 대소 문자를 구분합니다. 광산은 GIF로 끝나고 전화했을 때 작동하지 않습니다image.gif
Sam

4

GIFImageView

public class GifImageView extends ImageView {

    Movie movie;
    InputStream inputStream;
    private long mMovieStart;

    public GifImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public GifImageView(Context context) {
        super(context);
    }

    public GifImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
        inputStream = context.getResources()
                .openRawResource(R.drawable.thunder);
            byte[] array = streamToBytes(inputStream);
            movie = Movie.decodeByteArray(array, 0, array.length);

    }

    private byte[] streamToBytes(InputStream is) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
                1024);
        byte[] buffer = new byte[1024];
        int len;
        try {
            while ((len = is.read(buffer)) >= 0) {
                byteArrayOutputStream.write(buffer, 0, len);
                return byteArrayOutputStream.toByteArray();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return null;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        long now = SystemClock.uptimeMillis();
        if (mMovieStart == 0) { // first time
            mMovieStart = now;
        }
        if (movie != null) {
            int dur = movie.duration();
            if (dur == 0) {
                dur = 3000;
            }
            int relTime = (int) ((now - mMovieStart) % dur);
            movie.setTime(relTime);
            movie.draw(canvas, getWidth() - 200, getHeight() - 200);
            invalidate();
        }
    }

}

XML에서

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="abc" /> 

    <com.example.apptracker.GifImageView
        android:id="@+id/gifImageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>

자바 파일에서

public class MainActivity extends Activity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        GifImageView gifImageView = (GifImageView) findViewById(R.id.gifImageView1);
        if (Build.VERSION.SDK_INT >= 11) {
            gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }
}

gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);하드웨어 가속이 활성화 된 경우 GIF 이미지가 해당 장치에서 작동하지 않는 것처럼 사용해야 합니다. 하드웨어 가속 (4.x) 이상의 장치에서 활성화됩니다.


이것은 나에게 아무것도 보여주지 않습니다. Github에서 공유해 주시겠습니까?
안드로이드 개발자

4

으로 @Ahmad 코멘트했다 , 당신은 단지 GIF를 표시하려면 다음 코드를 사용할 수 있습니다!

onCreate 메소드에서이 코드를 팝하면됩니다. 또한, 내부에있는 GIF를 배치 assets(당신이 자산 폴더가 하나 개 아래를 작성하지 않는 경우 폴더 src/main)

WebView wView = new WebView(this);
wView.loadUrl("file:///android_asset/piggy.gif");
setContentView(view);

3

이온 라이브러리를 사용하여 이미지 뷰에 애니메이션 GIF 이미지를 쉽게 추가 할 수 있습니다.

튜토리얼 비디오 :: https://www.youtube.com/watch?v=IqKtpdeIpjA

ImageView image = (ImageView)findViewById(R.id.image_gif);
Ion.with(image).load("http://mygifimage.gif");

3

이것이 나를 위해 일한 것입니다.

build.gradle (프로젝트)에서 buildscript {} 및 모든 프로젝트 {}에 mavenCentral ()을 작성하십시오. 다음과 같아야합니다.

buildscript {
    repositories {
        jcenter()
        **mavenCentral()**
    }
//more code ...
}
allprojects {
    repositories {
        jcenter()
        **mavenCentral()**
    }
}

그런 다음 build.gradle (module)에서이 스 니펫에 종속성을 추가 {}하세요.

'pl.droidsonroids.gif : android-gif-drawable : 1.2.4'컴파일

다음과 같아야합니다.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'
    **compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.4'**
}

.gif 이미지를 드로어 블 폴더에 넣습니다. 이제 app> res> layout> activity_main.xml로 이동하여 .gif에 맞게 이것을 추가하십시오.

<pl.droidsonroids.gif.GifImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/YOUR_GIF_IMAGE"
    android:background="#000000" //for black background
    />

그리고 당신은 끝났습니다 :)

유용한 링크 : https://github.com/koral--/android-gif-drawable

https://www.youtube.com/watch?v=EOFY0cwNjuk

도움이 되었기를 바랍니다.


2

Facebook의 Fresco 라이브러리를 통해 모든 GIF 이미지를 표시 할 수 있습니다 .

Uri uri = Uri.parse("http://domain.com/awersome.gif");
final SimpleDraweeView draweeView = new SimpleDraweeView(context);
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(200, 200);

draweeView.setLayoutParams(params);
DraweeController controller = Fresco.newDraweeControllerBuilder()
        .setUri(uri)
        .setAutoPlayAnimations(true)
        .build();
draweeView.setController(controller);
//now just add draweeView to layout and enjoy

2

먼저 module:appbuild.gradle 파일에 종속성을 추가 하십시오

compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'

그런 다음 레이아웃 파일에서

<pl.droidsonroids.gif.GifImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/mq_app"
        />

1

Gif는 또한 몇 줄의 코드와 타사 라이브러리없이 웹보기에 표시 될 수 있습니다. 이렇게하면 SD 카드에서 gif를로드 할 수도 있습니다. 자산 폴더에 이미지를 복사 할 필요가 없습니다.

웹보기를하십시오.

<WebView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageWebView" />

많은 예제와 같이 자산 폴더뿐만 아니라 SD 카드에서 gif 파일을 열 수 있습니다.

    WebView webView = (WebView) findViewById(R.id.imageWebView);
    String  data    = "<body> <img src = \""+ filePath+"\"/></body>";
    // 'filePath' is the path of your .GIF file on SD card.
   webView.loadDataWithBaseURL("file:///android_asset/",data,"text/html","UTF-8",null);

1

사용하는 데 문제가 있습니다

compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'

또한 프로젝트에 추가 할 jar 파일을 찾을 수 없습니다. 따라서 gif를 표시하기 위해 다음과 같이 WebView를 사용합니다.

WebView webView = (WebView) this.findViewById(R.id.webView);
webView.loadDataWithBaseURL(null, "<html><body><center><img style='align:center;width:250px; height:250px; border-radius:50%' src='file:///android_asset/loading.gif'/></center></body></html>", "text/html", "UTF-8", "");
webView.setBackgroundColor(Color.TRANSPARENT);

1

안드로이드에 GIF 파일 표시

build.gradle 파일에 다음 종속성을 추가하십시오.

implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'

레이아웃- activity_xxxxx.xml파일 GifImageview에서 아래와 같이 추가하십시오 .

<pl.droidsonroids.gif.GifImageView
   android:id="@+id/CorrWrong"
   android:layout_width="100dp"
  android:layout_height="75dp"/>

Java 파일에서 u는 아래와 같이 gif에 액세스 할 수 있습니다.

 GifImageView emoji;
 emoji = (GifImageView)findViewById(R.id.CorrWrong);

0
import android.app.Activity;
import android.util.Log;
import android.widget.ImageView;

/**
 * Created by atiq.mumtaz on 25.04.2016.
 */
public class GifImage_Player extends Thread
{
    Activity activity;
    ImageView image_view;
    boolean is_running=false;
    int pause_time;
    int[] drawables;

    public GifImage_Player(Activity activity,ImageView img_view,int[] drawable)
    {
        this.activity=activity;
        this.image_view=img_view;
        this.is_running=true;
        pause_time=25;
        this.drawables=drawable;
    }

    public void set_pause_time(int interval)
    {
        this.pause_time=interval;
    }
    public void stop_playing()
    {
        this.is_running=false;
    }

    public void run()
    {
        Log.d("Gif Player","Gif Player Stopped");

        int pointer=0;
        while (this.is_running)
        {
           if(drawables.length>0)
           {
             if((drawables.length-1)==pointer)
             {
                 pointer=0;
             }


               try
               {
                   activity.runOnUiThread(new Run(pointer));
                   Thread.sleep(pause_time);
               }
               catch (Exception e)
               {
                   Log.d("GifPlayer","Exception: "+e.getMessage());
                   is_running=false;
               }
               pointer++;
           }
        }
        Log.d("Gif Player","Gif Player Stopped");
    }

    class Run implements Runnable
    {
        int pointer;
        public Run(int pointer)
        {
            this.pointer=pointer;
        }
        public void run()
       {
           image_view.setImageResource(drawables[pointer]);
       }
    }
}

/////////////////////////////Usage///////////////////////////////////////




  int[] int_array=new int[]{R.drawable.tmp_0,R.drawable.tmp_1,R.drawable.tmp_2,R.drawable.tmp_3
               ,R.drawable.tmp_4,R.drawable.tmp_5,R.drawable.tmp_6,R.drawable.tmp_7,R.drawable.tmp_8,R.drawable.tmp_9,
                    R.drawable.tmp_10,R.drawable.tmp_11,R.drawable.tmp_12,R.drawable.tmp_13,R.drawable.tmp_14,R.drawable.tmp_15,
                    R.drawable.tmp_16,R.drawable.tmp_17,R.drawable.tmp_18,R.drawable.tmp_19,R.drawable.tmp_20,R.drawable.tmp_21,R.drawable.tmp_22,R.drawable.tmp_23};

GifImage_Player gif_player;             
gif_player=new GifImage_Player(this,(ImageView)findViewById(R.id.mygif),int_array);
            gif_player.start();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.