将animation.GIF设置为背景Android

我是Android新手,我在布局背景中播放animation.gif文件时遇到问题。 当我运行应用程序时,背景是animation.gif的单帧,就像图片一样。 我主要在两个方面做过研究:

下面的链接是我得到最多帮助的地方。

Android OS开始BlogSpot

下面的链接让我觉得我收到的错误与设置为private,public或protected的类有关。

Java论坛

这是守则———————————————- ————————————————– ——————-

错误由:: 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(); } } 

:: ERRORS LIST :: ERRORS LIST :: ERRORS LIST :: ERRORS LIST :: ERRORS LIST :: ERRORS LIST ::

::错误1 ::构造函数MYGIFView()不可见

::错误2 ::隐式超级构造函数View()未定义为可见构造函数

::错误3 ::缺少方法的返回types

:: ERROR 4 ::构造函数调用必须是构造函数中的第一个语句

———- UPDATE ——— UPDATE ———— UPDATE ————— UPDATE ————- UPDATE ———- UPDATE ——— UPDATE ———— UPDATE – ————-更新————-更新———更新

我创建了animation列表= res / drawable-hdpi / progress_animation.xml

            .........................................    

我创建了布局文件来托管Image View = res / layout / activity_main.xml

    

Java Class Activity调用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”

LOGCAT ————————————————- ————————————————– ——————————–

这是会话filterLOGCAT

 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 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 

    正如马丁所说,Android不支持GIF。 作为解决方法,Android提供animation列表/ AnimationDrawable 。 您需要将GIF转换为单独的帧[.png文件]。 我使用GIMP进行转换

    原始GIF图像

    这个GIF可以分解为它的框架:

    GIMP中的GIF帧

    将它们保存为frame01.png,frame02.png等,然后创建animation列表XML文件,例如progress_animation.xml

         ....  

    要开始animation,您需要将图像转换为AnimationDrawable,并在其上调用start()

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

    当GIFanimation作为电影播放时,Android支持gifanimation。

    看一看。

    把你的gif图像放在app \ src \ main \ assets中

    像一个class级

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