Je suis nouveau sur Android et je ne parviens pas à lire un fichier .gif animé en arrière-plan de ma mise en page. Lorsque j'exécute l'application, l'arrière-plan est une image unique du fichier .gif animé, tout comme une image. J'ai effectué des recherches principalement dans deux domaines:
Le lien ci-dessous est l'endroit où j'ai eu le plus d'aide.
Le lien ci-dessous me fait penser que les erreurs que je reçois ont quelque chose à voir avec le fait que les classes soient définies comme privées, publiques ou protégées.
Et voici le code -------------------------------------------------- -------------------------------------------------- -------------------
Les erreurs sont signalées par :: ERROR # :: avec une description complète sous le code.
import Java.io.InputStream;
import Android.os.Bundle;
import Android.app.Activity;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Movie;
import Android.view.Menu;
import Android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(new MYGIFView()); :: ERROR 1 ::
}
}
private class MYGIFView extends View{ :: ERROR 2 ::
Movie movie,movie1;
InputStream is=null , is1=null;
long moviestart;
public GIFView(Context context) { :: ERROR 3 ::
super(context); :: ERROR 4 ::
is=context.getResources().openRawResource(R.drawable.swing);
movie=Movie.decodeStream(is);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
super.onDraw(canvas);
long now=Android.os.SystemClock.uptimeMillis();
System.out.println("now="+now);
if (moviestart == 0) { // first time
moviestart = now;
}
System.out.println("\tmoviestart="+moviestart);
int relTime = (int)((now - moviestart) % movie.duration()) ;
System.out.println("time="+relTime+"\treltime="+movie.duration());
movie.setTime(relTime);
movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);
this.invalidate();
}
}
:: LISTE DES ERREURS :: LISTE DES ERREURS :: LISTE DES ERREURS :: LISTE DES ERREURS :: LISTE DES ERREURS :: LISTE DES ERREURS ::
:: ERREUR 1 :: Le constructeur MYGIFView () n'est pas visible
:: ERROR 2 :: Super constructeur implicite La vue () n'est pas définie pour le constructeur visible.
:: ERROR 3 :: Le type de retour de la méthode est manquant
:: ERROR 4 :: L'appel du constructeur doit être la première instruction d'un constructeur
.
.
---------- UPDATE --------- UPDATE ------------ UPDATE --------------- UPDATE ------------- UPDATE ---------- UPDATE --------- UPDATE ------------ UPDATE - ------------- UPDATE ------------- UPDATE --------- UPDATE
.
.
J'ai créé l'animation list = res/drawable-hdpi/progress_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/selected" Android:oneshot="false">
<item Android:drawable="@drawable/frame02" Android:duration="50" />
<item Android:drawable="@drawable/frame03" Android:duration="50" />
<item Android:drawable="@drawable/frame04" Android:duration="50" />
<item Android:drawable="@drawable/frame05" Android:duration="50" />
<item Android:drawable="@drawable/frame06" Android:duration="50" />
<item Android:drawable="@drawable/frame07" Android:duration="50" />
<item Android:drawable="@drawable/frame08" Android:duration="50" />
<item Android:drawable="@drawable/frame09" Android:duration="50" />
<item Android:drawable="@drawable/frame10" Android:duration="50" />
.........................................
<item Android:drawable="@drawable/frame57" Android:duration="50" />
<item Android:drawable="@drawable/frame58" Android:duration="50" />
</animation-list>
.
.
J'ai créé un fichier de présentation pour héberger la vue d'image = res/layout/activity_main.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageView Android:id="@+id/swing_play" Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
</RelativeLayout>
.
Activité de classe Java pour appeler ImageView et AnimationDrawable = com.example.apptwo/MainActivity.Java
.
package com.exampleone.apptwo;
import Android.os.Bundle;
import Android.app.Activity;
import Android.graphics.drawable.AnimationDrawable;
import Android.view.Menu;
import Android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acivity_main);
ImageView img = (ImageView)findViewById(R.id.swing_play);
img.setBackgroundResource(R.drawable.progress_animation);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
frameAnimation.start();
}
}
.
Le IDE ne signale aucune erreur dans le code. Toutefois, lorsque j'exécute l'application, mon émulateur affiche un arrière-plan blanc avec le message "Malheureusement, AppTwo s'est arrêté."
ErrorLog reads = "Exception de boucle d'événement non gérée"
LOGCAT ------------------------------------------------- -------------------------------------------------- --------------------------------
Ceci est le filtre de session LOGCAT
04-06 17:10:48.193: D/AndroidRuntime(989): Shutting down VM
04-06 17:10:48.193: W/dalvikvm(989): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-06 17:10:48.213: E/AndroidRuntime(989): FATAL EXCEPTION: main
04-06 17:10:48.213: E/AndroidRuntime(989): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.apptwo/com.example.apptwo.MainActivity}: Java.lang.NullPointerException
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2180)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.os.Handler.dispatchMessage(Handler.Java:99)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.os.Looper.loop(Looper.Java:137)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread.main(ActivityThread.Java:5041)
04-06 17:10:48.213: E/AndroidRuntime(989): at Java.lang.reflect.Method.invokeNative(Native Method)
04-06 17:10:48.213: E/AndroidRuntime(989): at Java.lang.reflect.Method.invoke(Method.Java:511)
04-06 17:10:48.213: E/AndroidRuntime(989): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
04-06 17:10:48.213: E/AndroidRuntime(989): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
04-06 17:10:48.213: E/AndroidRuntime(989): at dalvik.system.NativeStart.main(Native Method)
04-06 17:10:48.213: E/AndroidRuntime(989): Caused by: Java.lang.NullPointerException
04-06 17:10:48.213: E/AndroidRuntime(989): at com.example.apptwo.MainActivity.onCreate(MainActivity.Java:14)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.Activity.performCreate(Activity.Java:5104)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
04-06 17:10:48.213: E/AndroidRuntime(989): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
04-06 17:10:48.213: E/AndroidRuntime(989): ... 11 more
Il y a trop de LogCat (tous les messages) à poster, mais celui ci-dessous semble être important au moment de l'erreur.
04-06 17:10:48.213: E/AndroidRuntime(989): FATAL EXCEPTION: main
.
MISE À JOUR POUR LOGCAT AVEC LA VUE DE CONTENU INCLUS! ! !
: error opening trace file: No such file or directory (2)
: GC_FOR_ALLOC freed 67K, 7% free 2500K/2688K, paused 49ms, total 54ms
: I/dalvikvm-heap(1813): Grow heap (frag case) to 4.022MB for 1536016-byte allocation
: D/dalvikvm(1813): GC_FOR_ALLOC freed 2K, 5% free 3998K/4192K, paused 125ms, total 125ms
: D/dalvikvm(1813): GC_CONCURRENT freed <1K, 5% free 3998K/4192K, paused 5ms+15ms, total 105ms
: D/dalvikvm(1813): GC_FOR_ALLOC freed <1K, 5% free 3998K/4192K, paused 36ms, total 37ms
: Grow heap (frag case) to 5.485MB for 1536016-byte allocation
: GC_CONCURRENT freed <1K, 4% free 5498K/5696K, paused 75ms+14ms, total 156ms
: GC_FOR_ALLOC freed <1K, 4% free 5499K/5696K, paused 32ms, total 33ms
: Grow heap (frag case) to 6.950MB for 1536016-byte allocation
: GC_CONCURRENT freed <1K, 3% free 6999K/7200K, paused 74ms+17ms, total 156ms
: D/dalvikvm(1813): GC_FOR_ALLOC freed <1K, 3% free 6999K/7200K, paused 46ms, total 47ms
: I/dalvikvm-heap(1813): Grow heap (frag case) to 8.416MB for 1536016-byte allocation
: GC_CONCURRENT freed <1K, 3% free 8499K/8704K, paused 79ms+4ms, total 173ms
: GC_FOR_ALLOC freed <1K, 3% free 10001K/10208K, paused 33ms, total 34ms
: GC_FOR_ALLOC freed <1K, 2% free 11501K/11712K, paused 35ms, total 35ms
: GC_FOR_ALLOC freed <1K, 2% free 13002K/13216K, paused 38ms, total 38ms
: GC_FOR_ALLOC freed <1K, 2% free 14503K/14720K, paused 35ms, total 36ms
: GC_FOR_ALLOC freed <1K, 2% free 16003K/16224K, paused 39ms, total 40ms
: GC_FOR_ALLOC freed <1K, 2% free 17504K/17728K, paused 41ms, total 41ms
: GC_FOR_ALLOC freed <1K, 2% free 19004K/19232K, paused 42ms, total 43ms
: GC_FOR_ALLOC freed <1K, 2% free 20505K/20736K, paused 58ms, total 58ms
: GC_FOR_ALLOC freed <1K, 2% free 22006K/22240K, paused 137ms, total 138ms
: GC_FOR_ALLOC freed <1K, 1% free 23506K/23744K, paused 47ms, total 47ms
: GC_FOR_ALLOC freed <1K, 1% free 25007K/25248K, paused 48ms, total 48ms
: GC_FOR_ALLOC freed <1K, 1% free 26507K/26752K, paused 50ms, total 51ms
: GC_FOR_ALLOC freed <1K, 1% free 28008K/28256K, paused 56ms, total 57ms
: GC_FOR_ALLOC freed <1K, 1% free 29509K/29760K, paused 58ms, total 58ms
: Clamp target GC heap from 32.398MB to 32.000MB
: GC_FOR_ALLOC freed <1K, 1% free 31009K/31264K, paused 57ms, total 58ms
: Clamp target GC heap from 33.863MB to 32.000MB
: GC_FOR_ALLOC freed <1K, 1% free 32510K/32768K, paused 56ms, total 56ms
: Forcing collection of SoftReferences for 1536016-byte allocation
:Clamp target GC heap from 33.855MB to 32.000MB
: GC_BEFORE_OOM freed 9K, 1% free 32500K/32768K, paused 87ms, total 88ms
: Out of memory on a 1536016-byte allocation.
: "main" prio=5 tid=1 RUNNABLE
: | group="main" sCount=0 dsCount=0 obj=0x40a729a0 self=0x2a00bba8
: | sysTid=1813 Nice=0 sched=0/0 cgrp=apps handle=1073849308
: | state=R schedstat=( 3245039730 1438341923 288 ) utm=275 stm=49 core=0
: at Android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
: at Android.graphics.BitmapFactory.decodeStream(BitmapFactory.Java:502)
: at Android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.Java:355)
: at Android.graphics.drawable.Drawable.createFromResourceStream(Drawable.Java:785)
: at Android.content.res.Resources.loadDrawable(Resources.Java:1965)
: at Android.content.res.Resources.getDrawable(Resources.Java:660)
: at Android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.Java:282)
: at Android.graphics.drawable.Drawable.createFromXmlInner(Drawable.Java:885)
: at Android.graphics.drawable.Drawable.createFromXml(Drawable.Java:822)
: at Android.content.res.Resources.loadDrawable(Resources.Java:1950)
: at Android.content.res.Resources.getDrawable(Resources.Java:660)
: at Android.view.View.setBackgroundResource(View.Java:14468)
: at com.example.appthree.MainActivity.onCreate(MainActivity.Java:15)
: at Android.app.Activity.performCreate(Activity.Java:5104)
: at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
: at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
: at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
: at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
: at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
: at Android.os.Handler.dispatchMessage(Handler.Java:99)
: at Android.os.Looper.loop(Looper.Java:137)
: at Android.app.ActivityThread.main(ActivityThread.Java:5041)
: at Java.lang.reflect.Method.invokeNative(Native Method)
: at Java.lang.reflect.Method.invoke(Method.Java:511)
: at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
: at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
: at dalvik.system.NativeStart.main(Native Method)
: --- decoder->decode returned false
: Shutting down VM
: threadid=1: thread exiting with uncaught exception (group=0x40a71930)
: FATAL EXCEPTION: main
: Java.lang.OutOfMemoryError
: at Android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
: at Android.graphics.BitmapFactory.decodeStream(BitmapFactory.Java:502)
: at Android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.Java:355)
: at Android.graphics.drawable.Drawable.createFromResourceStream(Drawable.Java:785)
: at Android.content.res.Resources.loadDrawable(Resources.Java:1965)
: at Android.content.res.Resources.getDrawable(Resources.Java:660)
: at Android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.Java:282)
: at Android.graphics.drawable.Drawable.createFromXmlInner(Drawable.Java:885)
: at Android.graphics.drawable.Drawable.createFromXml(Drawable.Java:822)
: at Android.content.res.Resources.loadDrawable(Resources.Java:1950)
: at Android.content.res.Resources.getDrawable(Resources.Java:660)
: at Android.view.View.setBackgroundResource(View.Java:14468)
: at com.example.appthree.MainActivity.onCreate(MainActivity.Java:15)
: at Android.app.Activity.performCreate(Activity.Java:5104)
: at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1080)
: at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2144)
: at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2230)
: at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
: at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1234)
: at Android.os.Handler.dispatchMessage(Handler.Java:99)
: at Android.os.Looper.loop(Looper.Java:137)
: at Android.app.ActivityThread.main(ActivityThread.Java:5041)
: at Java.lang.reflect.Method.invokeNative(Native Method)
: at Java.lang.reflect.Method.invoke(Method.Java:511)
: at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
: at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:560)
: at dalvik.system.NativeStart.main(Native Method)
: GC_CONCURRENT freed 30038K, 93% free 2539K/32768K, paused 73ms+97ms, total 472ms
Comme Martin le dit, Android ne supporte pas les GIF. Pour contourner le problème, Android propose Liste des animations/AnimationDrawable . Vous devrez convertir le fichier GIF en images individuelles [fichiers .png]. J'utilise GIMP pour la conversion
Ce GIF peut être décomposé en ses cadres:
Enregistrez-les en tant que frame01.png, frame02.png, etc., et créez un fichier XML de liste d'animation, par exemple, progress_animation.xml.
<animation-list Android:id="@+id/selected" Android:oneshot="false">
<item Android:drawable="@drawable/frame01" Android:duration="50" />
<item Android:drawable="@drawable/frame02" Android:duration="50" />
<item Android:drawable="@drawable/frame03" Android:duration="50" />
....
<item Android:drawable="@drawable/frameN" Android:duration="50" />
Pour commencer l'animation, vous devez convertir l'image en AnimationDrawable et appeler start () dessus.
AnimationDrawable progressAnimation = (AnimationDrawable) yourImageView.getBackground();
progressAnimation.start();
L'animation gif est prise en charge sous Android lorsque l'animation GIF est lue en tant que film.