Я добавил анимированное изображение gif в imageView. Я не могу рассматривать его как образ gif. Никакой анимации нет. Он появляется как неподвижное изображение. Я хотел бы знать, как я могу показать это как изображение gif.
Добавление gif-изображения в ImageView в android
Ответ 1
Сначала скопируйте изображение GIF в папку активов вашего приложения, создайте следующие классы и вставьте код 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);
}
}
Я думаю, что это может помочь вам... :)
Ответ 2
В свой 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.
Ответ 3
Используйте VideoView.
Натурально ImageView не поддерживает анимированное изображение. У вас есть два варианта отображения анимированного gif файла
- Используйте
VideoView
- Используйте
ImageView
и разделите файл gif на несколько частей, а затем примените к нему анимацию
Ответ 4
Отображение GIF в Android
Создать 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" />
N.P
Измените AndroidManifest.xml, чтобы отключить аппаратное ускорение.
android:hardwareAccelerated="false"
Для функциональности анимации вы можете посетить
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
Ответ 5
Я предлагаю вам использовать библиотеку Glide. Чтобы использовать Glide, вам нужно добавить это, чтобы добавить эти зависимости
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:23.4.0'
к вашему файлу (модуль: приложение).
Затем используйте эту строку кода для загрузки изображения gif
Glide.with(context).load(R.drawable.loading).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(loadingImageView);
Ответ 6
Основанный на комментарий к чертям Ахмада Двайка, я пробовал следующий код, и он работал.
- Используйте веб-просмотр в вашем XML файле и отрегулируйте его положение до места, где именно вы пытались показать вам изображение .gif.
- В вашей деятельности инициализируйте этот небольшой кусок веб-представления, как и другие виды.
- поместите файл .gif в папку с ресурсами
- загрузите изображение так, как если бы вы загрузили URL-адрес в веб-просмотр, например, "diyaWebView1.loadUrl(" file:///android_asset/www/diya.gif ");"
- вы можете видеть свое изображение .gif при запуске приложения.
P.S: это работает, если вы .gif обрамляете свой веб-просмотр или наоборот, если изображение больше, чем веб-просмотр, панель прокрутки активируется, и пользователь может прокручивать изображение в формате AKA. Поэтому мы должны быть осторожны, когда мы используем это, чтобы обеспечить правильный размер веб-просмотра в соответствии с изображением или отредактировать изображение, соответствующее вашему веб-просмотру.
Ответ 7
Как сказал @Ahmad в комментарии, вы можете просто использовать следующий код для отображения GIF!
Просто вставьте этот код в метод onCreate, и все готово! Кроме того, поместите ваш gif в папку assets
(если у вас нет папки assets, создайте ее в src/main
)
WebView wView = new WebView(this);
wView.loadUrl("file:///android_asset/piggy.gif");
setContentView(view);
Ответ 8
Используйте 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");
Ответ 9
с последней библиотекой Glide
использовать 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);
Ответ 10
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>
В файле 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);
}
}
}
Нам нужно использовать gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
, так как при включенном аппаратном ускорении изображение GIF не работает на этом устройстве. Аппаратное ускорение включено на устройствах выше (4.x).
Ответ 11
Мы можем легко добавить анимированное изображение gif на изображение с помощью библиотеки Ion.
Учебное видео:: https://www.youtube.com/watch?v=IqKtpdeIpjA
ImageView image = (ImageView)findViewById(R.id.image_gif);
Ion.with(image).load("http://mygifimage.gif");
Ответ 12
Это то, что сработало для меня:
В файле build.gradle(project) напишите mavenCentral() в buildscript {} и allprojects {}. Он должен выглядеть следующим образом:
buildscript {
repositories {
jcenter()
**mavenCentral()**
}
//more code ...
}
allprojects {
repositories {
jcenter()
**mavenCentral()**
}
}
Затем в build.gradle(module) добавьте в зависимости {} этот фрагмент:
compile '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
Надеюсь, что это поможет.
Ответ 13
Вы можете отобразить любое изображение gif через библиотеку Fresco by Facebook:
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
Ответ 14
Сначала добавьте зависимость в файле module:app
build.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"
/>
Ответ 15
Gif также может отображаться в веб-представлении с несколькими строками кода и без каких-либо сторонних библиотек. Таким образом, вы даже можете загрузить gif с вашей SD-карты. Нет необходимости копировать изображения в папку Asset.
Сделайте веб-представление.
<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageWebView" />
Использование может открывать gif файл с SD-карты не только из папки с данными, как показано во многих примерах.
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);
Ответ 16
Я столкнулся с проблемой использования
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);
Ответ 17
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();
Ответ 18
Показать GIF файл в Android
Добавьте следующую зависимость в ваш файл build.gradle.
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'
В макете - файл activity_xxxxx.xml
добавьте GifImageview
как GifImageview
ниже.
<pl.droidsonroids.gif.GifImageView
android:id="@+id/CorrWrong"
android:layout_width="100dp"
android:layout_height="75dp"/>
В вашем Java файле вы можете получить доступ к GIF, как показано ниже.
GifImageView emoji;
emoji = (GifImageView)findViewById(R.id.CorrWrong);
Ответ 19
"Не следует ли вместо этого использовать pl.droidsonroids.gif.GifImageView?" Вот как я это сделал. следуйте инструкциям Akaisteph7, затем поместите "pl.droidsonroids.gif.GifImageView" в свой макет xml вместо вашего представления изображений далее, в свой MainActivity
поместите свой GIF как изображение
"image_view.setImageResource(R.drawable.underweight)"//GIF is titled underweight