2013-04-05 20 views
10

Jestem nowy na Androida i mam problemy z odtwarzaniem animowanego pliku .gif w tle mojego układu. Po uruchomieniu aplikacji tło jest pojedynczą ramką animowanego pliku .gif, podobnie jak obraz. Zrobiłem badania głównie w dwóch obszarach:Zestaw animowany .GIF jako tło Android

Poniższy link jest tam, gdzie mam największą pomoc.

Android OS Beginning BlogSpot

Link poniżej sprawia, że ​​myślę, że błędy jestem otrzymujących mieć coś wspólnego z klas jest ustawiony jako prywatny, publiczny lub chronione.

Java Forums

I Oto kod ------------------------------------- -------------------------------------------------- ----------------------------

Błędy są oznaczone przez :: BŁĄD # :: z pełnymi opisami poniżej kodu.

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(); 

} 
} 

:: BŁĘDY BŁĘDY LIST LIST :: :: :: BŁĘDY BŁĘDY LIST LIST :: BŁĘDY LIST :: BŁĘDY ::

:: ERROR 1 :: MYGIFView konstruktor() nie jest widoczna

:: BŁĄD 2 :: Pośrednie Super Konstruktor Zobacz() jest zdefiniowana widocznych konstruktora

:: BŁĘDU Typ 3 :: Powrót do sposobu brakuje

:: błędu 4 :: Wywołanie konstruktora musi być pierwszą instrukcją w konstruktorze

.

.

---------- UPDATE --------- AKTUALIZACJA ------------ AKTUALIZACJA ------------ --- AKTUALIZACJA ------------- AKTUALIZACJA ---------- AKTUALIZACJA --------- AKTUALIZACJA ----------- - AKTUALIZACJA --------------- AKTUALIZACJA ------------- AKTUALIZACJA --------- AKTUALIZACJA

.

.

Stworzyłem listę animacji = res/odkształcalne-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> 

.

.

Stworzyłem plik układu gospodarzem obrazem view = 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> 

.

aktywny Java Class zadzwonić ImageView i 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(); 
} 

} 

.

IDE nie zgłasza żadnych błędów w kodzie. Jednak po uruchomieniu aplikacji mój emulator wyświetla białe tło z komunikatem "Niestety, AppTwo się zatrzymał."

errorlog czyta = "nieobsługiwany wyjątek pętli zdarzeń"

logcat ------------------------------- -------------------------------------------------- --------------------------------------------------

to logcat Filtr sesja

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 

Istnieje zbyt wiele logCat (wszystkie komunikaty) odpowiedzieć, ale pod ten wydaje się być ważne w czasach błędu.

04-06 17:10:48.213: E/AndroidRuntime(989): FATAL EXCEPTION: main 

.

AKTUALIZACJA DO LOGCAT Z WIDOKIEM ZAWARTYM W ZESTAWIE! ! !

: 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 
+0

spróbować tego samouczka http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android- part-1/ma inne sposoby wyświetlania animowanego gif .. są linki do innych części samouczka na dole strony .. – Elior

+0

Proponuję ci spojrzeć w ten sposób wyświetlania animowanego gifa http: // droid-blog.net/2011/10/17/samouczek-how-to-play-animowane-gify-in-android-part-3/ – Elior

+0

Android nie obsługuje animowanych Gifów – Martin

Odpowiedz

21

Jak mówi Martin, Android nie obsługuje GIF-ów. W ramach obejścia tego problemu Android oferuje Animation List/AnimationDrawable. Konwersja GIF na pojedyncze ramki [pliki .png]. Używam GIMP do konwersji

Original GIF image

Ten GIF może być rozłożony na poszczególne klatki:

GIF frames in GIMP

zapisać je jako frame01.png, frame02.png, i tak dalej, i tworzyć animację-list plik XML, powiedzmy, 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" /> 

Aby rozpocząć animację, trzeba rzucić obraz na AnimationDrawable i wywołać start() na nim

AnimationDrawable progressAnimation = (AnimationDrawable) yourImageView.getBackground(); 
progressAnimation.start(); 
+0

Dziękuję za zasoby, ponieważ bardzo mi pomogły. Opublikowałem aktualizację mojego kodu, ponieważ moja aplikacja nadal nie działa. –

+1

Czy umieścisz kompletny ślad stosu LogCat, czy przynajmniej podasz linię kodu powodującą wyjątek UnhandledEventLoopException? – WeNeigh

+0

Dodałem filtr LogCat sesji. Wrzucałbym wszystkie wiadomości (bez filtrów), ale zasadniczo są to ich strony. –

1

animacja gif jest obsługiwany w Androidzie gdy animacja GIF rozgrywany jest jako film.

Take a look.

0

umieścić GIF w aplikacji \ src \ główne atuty \

uczynić klasa jak

public class MyGifView extends View { 
Movie movie; 
InputStream is; 
long startTime; 

public MyGifView(Context context) { 
    super(context); 
    try { 
     is = getResources().getAssets().open("anim.gif"); 
     movie = Movie.decodeStream(is); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.WHITE); 
    super.onDraw(canvas); 
    long now = System.currentTimeMillis(); 
    if (startTime == 0) // first time 
     startTime = now; 
    int relTime = (int) ((now - startTime) % movie.duration()); 
    movie.setTime(relTime); 
    float scalefactorx = (float) this.getWidth()/(float) movie.width(); 
    float scalefactory = (float) this.getHeight()/(float) movie.height(); 
    canvas.scale(scalefactorx,1); 
    movie.draw(canvas, scalefactorx, scalefactory); 
    this.invalidate(); 
} 

}

dodać układ gdzieś w xml activity_layout (backgroundFrameLayout). Wykorzystanie w swojej działalności onCreate():

FrameLayout frameLayout = findViewById(R.id.backgroundFrameLayout); 
frameLayout.addView(new MyGifView(this));