2013-04-05 3 views
10

Я новичок в Android, и у меня возникли проблемы с воспроизведением анимированного файла .gif на фоне моего макета. Когда я запускаю приложение, фон представляет собой один кадр анимированного .gif, как и изображение. Я провел исследования главным образом в двух областях:Set Animated .GIF в качестве фона Android

Ниже приведена ссылка, где я получил наибольшую помощь.

Android OS Beginning BlogSpot

Ссылка ниже заставляет меня думать, что ошибки я получаю что-то делать с классами, установленным на частные, государственные, или защищены.

Java Forums

И вот Кодекс ------------------------------------- -------------------------------------------------- ----------------------------

Ошибки обозначаются :: ERROR # :: с полным описанием ниже кода.

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

} 
} 

:: ОШИБОК СПИСОК ОШИБОК :: СПИСОК :: ОШИБОК СПИСОК ОШИБОК :: СПИСОК :: ОШИБОК СПИСОК ОШИБОК СПИСОК :: ::

:: ERROR 1 :: Конструктор MYGIFView() не является видимый

:: ERROR 2 :: неявной Супер конструктор View() не определено для видимого конструктору

:: ERROR 3 :: Возвращение типа для метода отсутствующего

:: ERROR 4 :: Запрос конструктора должен быть первым оператором в конструкторе

.

.

---------- UPDATE --------- UPDATE ------------ UPDATE ------------ --- UPDATE ------------- UPDATE ---------- UPDATE --------- UPDATE ----------- - ОБНОВЛЕНИЕ --------------- ОБНОВЛЕНИЕ ------------- UPDATE --------- ОБНОВЛЕНИЕ

.

.

Я создал список анимации = Рез/вытяжке-ИПЧР/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> 

.

.

Я создал файл макета для размещения на изображение View = Рез/макет/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> 

.

класса Java активность вызывать ImageView и 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 не содержит никаких ошибок в коде. Однако при запуске приложения мой эмулятор отображает белый фон с сообщением «К сожалению, AppTwo остановился».

ErrorLog читает = "Exception Unhandled Loop Event"

LogCat ------------------------------- -------------------------------------------------- --------------------------------------------------

Это фильтр 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 

есть слишком много LogCat (все сообщения) для размещения, но это один ниже представляется важным по времени возникновения ошибки.

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

.

ОБНОВЛЕНИЕ К LOGCAT С СОДЕРЖАНИЕМ СОДЕРЖИМОГО ВИДА! ! !

: 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

попробовать этот учебник http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android- part-1/у него разные способы отображения анимированного gif .. есть ссылки для других частей учебника в нижней части страницы. – Elior

+0

Я предлагаю вам взглянуть на этот способ отображения анимированного gif Http: // дроид-блог.net/2011/10/17/tutorial-how-to-play-animated-gifs-in-android-part-3/ – Elior

+0

Android не поддерживает анимированные Gifs – Martin

ответ

21

Как утверждает Мартин, Android не поддерживает GIF. В качестве обходного решения Android предлагает Animation List/AnimationDrawable. Вам нужно будет преобразовать GIF в отдельные фреймы [.png-файлы]. Я использую GIMP для преобразования

Original GIF image

Это GIF можно разбить на свои кадры:

GIF frames in GIMP

сохранить их как frame01.png, frame02.png, и так далее, и создать XML-файл анимации-лист, скажем, 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" /> 

Чтобы начать анимацию, вам нужно бросить изображение в AnimationDrawable и начала звонка() на нем

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

Спасибо за ресурсы, поскольку они мне очень помогли. Однако я опубликовал обновление моего кода, так как мое приложение все еще не запускается. –

+1

Вы отправили бы полную трассировку стека LogCat или, по крайней мере, указали бы на строку кода, вызывающую UnhandledEventLoopException? – WeNeigh

+0

Я добавил фильтр сеанса фильтра LogCat. Я бы опубликовал все сообщения (без фильтров), но есть в основном их страницы. –

1

МФП анимация поддерживается в Android, когда GIF анимация воспроизводится в кино.

Take a look.

0

положить рисунок в приложении \ SRC \ главная \ активы

сделать класс как

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

}

добавить раскладку где-то в XML activity_layout (backgroundFrameLayout). Использование в вашей деятельности OnCreate():

FrameLayout frameLayout = findViewById(R.id.backgroundFrameLayout); 
frameLayout.addView(new MyGifView(this)); 
Смежные вопросы