Dodawanie obrazu GIF w ImageView w systemie Android
139
Dodałem animowany obraz gif w imageView. Nie mogę zobaczyć tego jako obrazu GIF. Nie ma animacji. Pojawia się jako nieruchomy obraz. Chciałbym wiedzieć, jak mogę pokazać to jako obraz gif.
w zasadzie nie potrzebujesz tego wszystkiego, ponieważ tworzysz dekodery i kod złożony i nigdy ich nie używasz! używasz widoku GifWebView = new GifWebView (this, "file: /// android_asset /piggy.gif"); która wywołuje podklasę webview, która nie jest dostosowana do webview, możesz zastąpić cały kod trzema liniami .. webView wView = new webView (this); wView.loadUrl ("file: ///android_asset/piggy.gif"); setContentView (widok);
Ahmad Dwaik „Warlock”
2
Hej, dzięki za odpowiedź ... :) działa dobrze !! ale mam jeden problem z webview (w klasie GifWebView), który wyświetla plik gif większy niż ekran urządzenia. więc jak ustawić niestandardową szerokość i wysokość dla tego widoku ALBO mogę użyć innego widoku ???
Uczeń Androida
Czy to odtworzy mój gif tylko raz? Nie przejdzie przez gif ??? Czy mimo wszystko mogę ponownie uruchomić metody, aby wyświetlić je ponownie?
AKTUALIZACJA : Począwszy od wtyczki Android Gradle Plugin 3.0.0 , nowe polecenie kompilacji to implementation, więc powyższa linia może wymagać zmiany na:
Ta odpowiedź jest najlepszą odpowiedzią i działa dla mnie bardzo płynnie, próbowałem różnych rzeczy i budowałem klasy i niewiarygodne po tym, jak to znalazłem ... Dzięki panu;)
Alexiscanny
gładko, lepiej niż
ślizgaj się
1
Również dla mnie najlepsze, wprowadzone w 10 sekund
Diogo Garcia
prosty krok. to powinna być odpowiedź. zrobione w kilka minut
sunil
3
Nie powinno pl.droidsonroids.gif.GifImageViewbyć używane zamiast tego?
Flimm,
23
Użyj VideoView.
Natywnie ImageView nie obsługuje animowanego obrazu. Masz dwie opcje pokazania animowanego pliku gif
Posługiwać się VideoView
Użyj ImageViewi podziel plik gif na kilka części, a następnie zastosuj do niego animację
Użyj widoku internetowego w pliku xml i dostosuj jego położenie do miejsca, w którym dokładnie próbujesz wyświetlić obraz .gif.
W swojej aktywności zainicjuj ten mały fragment widoku internetowego, podobnie jak inne widoki.
umieść obraz .gif w folderze zasobów
teraz załaduj obraz tak, jakbyś ładował adres URL do widoku internetowego, np. „diyaWebView1.loadUrl (" file: ///android_asset/www/diya.gif ");"
możesz zobaczyć swój obraz .gif po uruchomieniu aplikacji.
PS: to działa, jeśli obraz .gif pasuje do twojego widoku internetowego lub odwrotnie, jeśli obraz jest większy niż widok internetowy, pasek przewijania zostanie włączony, a użytkownik może przewijać obraz AKA widok internetowy. Musimy więc zachować ostrożność, gdy z tego korzystamy, aby nadać widokowi odpowiedni rozmiar zgodnie z obrazem lub edytować obraz, który pasuje do widoku internetowego.
Musimy używać gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);tak, jak przy włączonej akceleracji sprzętowej, obraz GIF nie działa na tym urządzeniu. Przyspieszanie sprzętowe jest włączone na urządzeniach powyżej (4.x).
Po prostu umieść ten kod w metodzie onCreate i gotowe! Umieść również swój gif w assetsfolderze (jeśli nie masz folderu zasobów, utwórz go pod src/main)
WebView wView = new WebView(this);
wView.loadUrl("file:///android_asset/piggy.gif");
setContentView(view);
Możesz wyświetlić dowolny obraz gif za pośrednictwem biblioteki Fresco na Facebooku :
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
GIF-y można również wyświetlać w widoku sieciowym z kilkoma wierszami kodu i bez bibliotek innych firm. W ten sposób możesz nawet załadować gif z karty SD. Nie ma potrzeby kopiowania obrazów do folderu zasobów.
Użycie może otworzyć plik gif z karty SD, a nie tylko z folderu zasobów, jak pokazano w wielu przykładach.
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);
Odpowiedzi:
Najpierw skopiuj obraz GIF do folderu zasobów swojej aplikacji, utwórz następujące klasy i wklej kod 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); } }
Myślę, że to może ci pomóc ... :)
źródło
W pliku build.gradle (Module: app) dodaj
android-gif-drawable
jako zależność, dodając następujący kod:allprojects { repositories { mavenCentral() } } dependencies { compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.+' }
AKTUALIZACJA : Począwszy od wtyczki Android Gradle Plugin 3.0.0 , nowe polecenie kompilacji to
implementation
, więc powyższa linia może wymagać zmiany na:dependencies { implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17' }
Następnie zsynchronizuj swój projekt. Po zakończeniu synchronizacji przejdź do pliku układu i dodaj następujący kod:
<pl.droidsonroids.gif.GifImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/gif_file" />
I to wszystko, możesz nim zarządzać za pomocą prostego ImageView.
źródło
pl.droidsonroids.gif.GifImageView
być używane zamiast tego?Użyj VideoView.
Natywnie ImageView nie obsługuje animowanego obrazu. Masz dwie opcje pokazania animowanego pliku gif
VideoView
ImageView
i podziel plik gif na kilka części, a następnie zastosuj do niego animacjęźródło
VideoView
można użyć do wyświetlenia animowanego GIF-a?z najnowszą biblioteką Glide
użyj Gradle:
repositories { mavenCentral() google() } dependencies { implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
w działaniu lub fragment:
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);
źródło
Wyświetlam GIF w systemie Android
Stwórz
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(); } } }
Teraz wywołaj tę klasę w swoim XML
<Your_PackageName.CustomGifView android:id="@+id/gifview" android:layout_width="wrap_content" android:layout_height="wrap_content" />
NP
Zmodyfikuj plik AndroidManifest.xml, aby wyłączyć przyspieszenie sprzętowe.
android:hardwareAccelerated="false"
Odniesienie
Kolejne sztuczki
Aby zobaczyć funkcjonalność animacji, możesz odwiedzić
źródło
Proponuję skorzystać z biblioteki Glide. Aby używać Glide, musisz to dodać, aby dodać te zależności
compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:23.4.0'
do pliku grandle (moduł: aplikacja).
Następnie użyj tej linii kodu, aby załadować swój obraz gif
Glide.with(context).load(R.drawable.loading).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(loadingImageView);
Więcej informacji o Glide
źródło
Opierając się na komentarzu Czarnoksiężnika Ahmada Dwaika , wypróbowałem następujący kod i zadziałało.
PS: to działa, jeśli obraz .gif pasuje do twojego widoku internetowego lub odwrotnie, jeśli obraz jest większy niż widok internetowy, pasek przewijania zostanie włączony, a użytkownik może przewijać obraz AKA widok internetowy. Musimy więc zachować ostrożność, gdy z tego korzystamy, aby nadać widokowi odpowiedni rozmiar zgodnie z obrazem lub edytować obraz, który pasuje do widoku internetowego.
źródło
Użyj Webview, aby załadować gif jak jako
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");
źródło
image.gif
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(); } } }
W 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>
W pliku Java
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); } } }
Musimy używać
gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
tak, jak przy włączonej akceleracji sprzętowej, obraz GIF nie działa na tym urządzeniu. Przyspieszanie sprzętowe jest włączone na urządzeniach powyżej (4.x).źródło
Jak powiedział @Ahmad w komentarzu , możesz po prostu użyć następującego kodu, aby wyświetlić gif!
Po prostu umieść ten kod w metodzie onCreate i gotowe! Umieść również swój gif w
assets
folderze (jeśli nie masz folderu zasobów, utwórz go podsrc/main
)WebView wView = new WebView(this); wView.loadUrl("file:///android_asset/piggy.gif"); setContentView(view);
źródło
Możemy łatwo dodać animowany obraz gif do widoku obrazu za pomocą biblioteki Ion.
Film instruktażowy :: https://www.youtube.com/watch?v=IqKtpdeIpjA
ImageView image = (ImageView)findViewById(R.id.image_gif); Ion.with(image).load("http://mygifimage.gif");
źródło
Oto, co zadziałało dla mnie:
W swoim build.gradle (projekcie) wpisz mavenCentral () w skrypcie buildscript {} i wszystkie projekty {}. To powinno wyglądać tak:
buildscript { repositories { jcenter() **mavenCentral()** } //more code ... } allprojects { repositories { jcenter() **mavenCentral()** } }
Następnie w build.gradle (module) dodaj zależności {} ten fragment:
kompiluj „pl.droidsonroids.gif: android-gif-drawable: 1.2.4”
To powinno wyglądać tak:
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'** }
Umieść swój obraz .gif w folderze do rysowania. Teraz przejdź do app> res> layout> activity_main.xml i dodaj ten fragment do swojego .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 />
I jesteś skończony :)
Pomocne linki: https://github.com/koral--/android-gif-drawable
https://www.youtube.com/watch?v=EOFY0cwNjuk
Mam nadzieję że to pomoże.
źródło
Możesz wyświetlić dowolny obraz gif za pośrednictwem biblioteki Fresco na Facebooku :
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
źródło
Najpierw dodaj zależność w
module:app
pliku build.gradlecompile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
Następnie w pliku układu
<pl.droidsonroids.gif.GifImageView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/mq_app" />
źródło
Wyświetl plik GIF w systemie Android
Dodaj następującą zależność w pliku build.gradle.
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'
W układzie -
activity_xxxxx.xml
plik dodajGifImageview
jak poniżej.<pl.droidsonroids.gif.GifImageView android:id="@+id/CorrWrong" android:layout_width="100dp" android:layout_height="75dp"/>
W pliku Java możesz uzyskać dostęp do gif, jak poniżej.
GifImageView emoji; emoji = (GifImageView)findViewById(R.id.CorrWrong);
źródło
GIF-y można również wyświetlać w widoku sieciowym z kilkoma wierszami kodu i bez bibliotek innych firm. W ten sposób możesz nawet załadować gif z karty SD. Nie ma potrzeby kopiowania obrazów do folderu zasobów.
Zrób widok sieciowy.
<WebView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageWebView" />
Użycie może otworzyć plik gif z karty SD, a nie tylko z folderu zasobów, jak pokazano w wielu przykładach.
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);
źródło
Miałem problem z używaniem
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
Nie mogłem też znaleźć pliku jar do dodania do mojego projektu. Tak więc, aby wyświetlić gif, używam WebView w następujący sposób:
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);
źródło
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();
źródło