将动画 .GIF 设置为背景 Android [英] Set Animated .GIF As Background Android

查看:43
本文介绍了将动画 .GIF 设置为背景 Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Android 新手,无法在布局背景中播放动画 .gif 文件.当我运行应用程序时,背景是动画 .gif 的单个帧,就像图片一样.我主要做了两个方面的研究:

I am new to Android and I am having trouble playing an animated .gif file in the background of my layout. When I run the application the background is a single frame of the animated .gif, just like a picture. I have done research mainly in two areas:

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

The link below is where I got the most help.

Android 操作系统入门 BlogSpot

下面的链接让我认为我收到的错误与设置为私有、公共或受保护的类有关.

The link below makes me think that the errors I am receiving have something to do with the classes being set to private, public, or protected.

Java 论坛

这是代码-----------------------------------------------------------------------------------------------------------

And Here's The Code -------------------------------------------------------------------------------------------------------------------

错误用 :: ERROR # :: 表示,代码下方有完整的描述.

Errors are denoted by :: ERROR # :: with full descriptions below the 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();

}
}

::错误列表::错误列表::错误列表::错误列表::错误列表::错误列表::

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

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

:: ERROR 1 :: The constructor MYGIFView() is not visible

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

:: ERROR 2 :: Implicit Super Constructor View() is undefined for visible constructor

:: ERROR 3 :: 缺少方法的返回类型

:: ERROR 3 :: Return type for the method is missing

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

:: ERROR 4 :: Constructor call must be the first statement in a constructor

.

.

---------- UPDATE --------- UPDATE ------------ UPDATE --------------- 更新 ------------- 更新 ---------- 更新 --------- 更新 ------------更新 --------------- 更新 ------------- 更新 --------- 更新

---------- UPDATE --------- UPDATE ------------ UPDATE --------------- UPDATE ------------- UPDATE ---------- UPDATE --------- UPDATE ------------ UPDATE --------------- UPDATE ------------- UPDATE --------- UPDATE

.

.

我已经创建了动画列表 = res/drawable-hdpi/progress_animation.xml

I have created the 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>

.

.

我已经创建了布局文件来托管图像视图 = res/layout/activity_main.xml

I have created layout file to host the Image 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>

.

Java 类 Activity 调用 ImageView 和 AnimationDrawable = com.example.apptwo/MainActivity.java

Java Class Activity to call ImageView and 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 已停止."

The IDE does not flag any errors in the code. However, when I run the Application my emulator displays a white background with a message "Unfortunately, AppTwo has stopped."

ErrorLog 读取 =未处理的事件循环异常"

The ErrorLog reads = "Unhandled Event Loop Exception"

LOGCAT -------------------------------------------------------------------------------------------------------------------

LOGCAT -----------------------------------------------------------------------------------------------------------------------------------

这是会话过滤器LOGCAT

This is the Session Filter 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(所有消息)太多,但下面的这个似乎在错误发生时很重要.

There are too many LogCat (all messages) to post, but this one below seems to be important around the time of the error.

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

.

更新到包含内容视图的 LOGCAT!!!

UPDATE TO LOGCAT WITH CONTENT VIEW INCLUDED ! ! !

 : 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

推荐答案

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

As Martin says, Android does not support GIFs. As a workaround, Android offers Animation List/AnimationDrawable. You will need to convert the GIF into individual frames [.png files]. I use GIMP for the conversion

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

This GIF can be broken down into its frames:

将它们另存为 frame01.png、frame02.png 等,并创建动画列表 XML 文件,例如 progress_animation.xml

Save them as frame01.png, frame02.png, and so on, and create an animation-list XML file, say, 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,并对其调用 start()

To begin the animation, you need to cast the image to an AnimationDrawable, and call start() on it

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

这篇关于将动画 .GIF 设置为背景 Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆