Cómo jugar GIF en android

Hola stackoverflow Estoy tratando de desarrollar una aplicación de Android para jugar mi propio GIF , aquí está el fragmento de código

MainActivity.java

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 

AnimationView.java

 import java.io.ByteArrayOutputStream; import java.io.InputStream; import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; import android.util.AttributeSet; import android.view.View; public class AnimationView extends View { private Movie mMovie; private long mMovieStart; private static final boolean DECODE_STREAM = true; private int mDrawLeftPos; private int mHeight, mWidth; private static byte[] streamToBytes(InputStream is) { ByteArrayOutputStream os = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int len; try { while ((len = is.read(buffer)) >= 0) { os.write(buffer, 0, len); } } catch (java.io.IOException e) { } return os.toByteArray(); } public AnimationView(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); java.io.InputStream is; is = context.getResources().openRawResource(R.drawable.scanning); if (DECODE_STREAM) { mMovie = Movie.decodeStream(is); } else { byte[] array = streamToBytes(is); mMovie = Movie.decodeByteArray(array, 0, array.length); } } @Override protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec ) { int p_top = this.getPaddingTop(), p_bottom = this.getPaddingBottom(); mWidth = mMovie.width(); mHeight = mMovie.height(); // Calculate new desired height final int desiredHSpec = MeasureSpec.makeMeasureSpec( mHeight + p_top + p_bottom , MeasureSpec.EXACTLY ); setMeasuredDimension( widthMeasureSpec, desiredHSpec ); super.onMeasure( widthMeasureSpec, desiredHSpec ); // Update the draw left position mDrawLeftPos = Math.max( ( this.getWidth() - mWidth ) / 2, 0) ; } @Override public void onDraw(Canvas canvas) { long now = android.os.SystemClock.uptimeMillis(); if (mMovieStart == 0) { // first time mMovieStart = now; } if (mMovie != null) { int dur = mMovie.duration(); if (dur == 0) { dur = 3000; } int relTime = (int) ((now - mMovieStart) % dur); // Log.d("", "real time :: " +relTime); mMovie.setTime(relTime); mMovie.draw(canvas, mDrawLeftPos, this.getPaddingTop()); invalidate(); } } } 

Main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:orientation="vertical" > <com.example.androidgifwork.AnimationView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </LinearLayout> 

Manifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidgifwork" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="com.example.androidgifwork.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

Cuando ejecuto el fragmento de código anterior GIF no está funcionando en absoluto, pero cuando me quite el android:targetSdkVersion="19" GIF corriendo, por favor, ayúdame a resolver este acertijo.

Gracias

2017 RESPUESTA ACTUALIZADA

Para jugar GIF en android use la biblioteca Glide para cargar cualquier imagen o GIF.

 Glide.with(context) .load(YOUR_GIF) .asGif() .into(YOUR_IMAGE_VIEW); 

Utilice Glide para cargar imágenes normales, imágenes desde el servidor o incluso para cargar GIF. También echa un vistazo a la biblioteca de carga de imágenes de Picasso android que es similar a Glide pero a partir de ahora ( 16 Apr 2017 ) Picasso no admite cargar GIF en android todavía.

################################################## ####################

ANTIGUA RESPUESTA

Para todos aquellos que quieren jugar a GIF en su aplicación por favor encontrar el código abajo PlayGifView.java

  import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; import android.os.Build; import android.util.AttributeSet; import android.view.View; public class PlayGifView extends View{ private static final int DEFAULT_MOVIEW_DURATION = 1000; private int mMovieResourceId; private Movie mMovie; private long mMovieStart = 0; private int mCurrentAnimationTime = 0; @SuppressLint("NewApi") public PlayGifView(Context context, AttributeSet attrs) { super(context, attrs); /** * Starting from HONEYCOMB have to turn off HardWare acceleration to draw * Movie on Canvas. */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } public void setImageResource(int mvId){ this.mMovieResourceId = mvId; mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId)); requestLayout(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(mMovie != null){ setMeasuredDimension(mMovie.width(), mMovie.height()); }else{ setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight()); } } @Override protected void onDraw(Canvas canvas) { if (mMovie != null){ updateAnimtionTime(); drawGif(canvas); invalidate(); }else{ drawGif(canvas); } } private void updateAnimtionTime() { long now = android.os.SystemClock.uptimeMillis(); if (mMovieStart == 0) { mMovieStart = now; } int dur = mMovie.duration(); if (dur == 0) { dur = DEFAULT_MOVIEW_DURATION; } mCurrentAnimationTime = (int) ((now - mMovieStart) % dur); } private void drawGif(Canvas canvas) { mMovie.setTime(mCurrentAnimationTime); mMovie.draw(canvas, 0, 0); canvas.restore(); } } 

En su clase de actividad use el siguiente código para jugar GIF

 PlayGifView pGif = (PlayGifView) findViewById(R.id.viewGif); pGif.setImageResource(<Your GIF file name Eg: R.drawable.infinity_gif>); 

Diseño XML

 <yourPacckageName.PlayGifView android:id="@+id/viewGif" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> 

Use Glide para cargar cualquier gif de la carpeta en raw de su proyecto o URL externa en ImageView, ImageButtons o similares [Glide targets][2]

 Glide.with(getActivity()).load(R.raw.alarm).asGif().into(btnAlert); 

Si puedes usar webview, la película gif jugará directamente sobre ella. Pero no estoy seguro, en su caso, desea poner webview o no.

Esto es viejo sé, pero aquí está, usted puede tomar un WebView, tiene un html creado que jugará el gif y pasar la url en la webview que funcionará como un encanto.

Android proporciona la clase android.graphics.Movie. Esta clase es capaz de decodificar y reproducir InputStreams. Así que para este enfoque, creamos una clase GifMovieView y dejar que hereda de Ver un tutorial detallado se da en http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs- En-android-part-1 /

  • Error de JNI en la animación de transición de escena - Capa supera el máximo
  • Haga que aparezca un diseño con animación después de hacer clic en el botón en Android
  • RecyclerView notifyItemInserted () La animación no se muestra cuando la posición es 0 pero funciona bien con otra posición
  • El método de animación applyTransformation no se activa hasta que haga clic en cualquier diseño
  • Cómo detener Android ViewFlipper de bucle?
  • ¿Existe un método "setSharedElementsUseOverlay ()" para las transiciones Fragmento?
  • Diapositiva de animación no funciona en el botón de prensa de nuevo?
  • SetClipChildren y capas de hardware
  • Establecer el interpolador para las animaciones de Android en Java
  • Google Maps Android API v2: Visualización del radio de búsqueda con la ayuda de ValueAnimator
  • ¿Cómo podemos optimizar (cpu & ram) esta animación de salpicadura personalizada de android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.