是否有可能设置GIF动画文件,如Android的动态壁纸? [英] Is it possible to set an animated gif file as live wallpaper in android?
问题描述
我是新来的Android平台。我想建立一个动态壁纸应用程序。当我搜索关于该搜索引擎的,(使用 SurfaceView
和画布许多人创造了一个活的壁纸作为他们的 code
),我不是太了解这个。在这里,我的疑问是,任何的可以设置为.gif图像作为一个动态壁纸
I'm new to Android platform. I wish to develop a live wallpaper application. When i was searched regarding this in search Engine's, many of them created a live wallpaper as their code (using SurfaceView
and Canvas
), I'm not much aware in this. Here my doubt is, any possible to set a .gif images as a live wallpaper.
推荐答案
这是黑客攻击,显示GIF动画的基本壁纸服务(如动态壁纸教程提供)。
This is the basic wallpaper service (as supplied in the Live Wallpaper Tutorial) hacked to display an animated gif.
首先 - 创建项目和放大器;设置你作为一个动态壁纸的体现。
然后 - 下载一个GIF,像这样的
   
First - create a project & set up your manifest as a Live wallpaper.
Then - download a gif, like this one
保存的GIF在 RES /生/ nyan.gif
在您的项目。
创建一个动态壁纸服务,如本例中所示。
Save that gif in res/raw/nyan.gif
in your project.
Create a live wallpaper service, like shown in this example.
public class NyanNyanService extends WallpaperService {
static final String TAG = "NYAN";
static final Handler mNyanHandler = new Handler();
/**
* @see android.service.wallpaper.WallpaperService#onCreate()
*/
@Override
public void onCreate() {
super.onCreate();
}
/**
* @see android.service.wallpaper.WallpaperService#onCreateEngine()
*/
@Override
public Engine onCreateEngine() {
try {
return new NyanEngine();
} catch (IOException e) {
Log.w(TAG, "Error creating NyanEngine", e);
stopSelf();
return null;
}
}
class NyanEngine extends Engine {
private final Movie mNyan;
private final int mNyanDuration;
private final Runnable mNyanNyan;
float mScaleX;
float mScaleY;
int mWhen;
long mStart;
NyanEngine() throws IOException {
InputStream is = getResources().openRawResource(R.raw.nyan);
if (is != null) {
try {
mNyan = Movie.decodeStream(is);
mNyanDuration = mNyan.duration();
} finally {
is.close();
}
} else {
throw new IOException("Unable to open R.raw.nyan");
}
mWhen = -1;
mNyanNyan = new Runnable() {
public void run() {
nyan();
}
};
}
@Override
public void onDestroy() {
super.onDestroy();
mNyanHandler.removeCallbacks(mNyanNyan);
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
if (visible) {
nyan();
} else {
mNyanHandler.removeCallbacks(mNyanNyan);
}
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
mScaleX = width / (1f * mNyan.width());
mScaleY = height / (1f * mNyan.height());
nyan();
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
float yOffsetStep, int xPixelOffset, int yPixelOffset) {
super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
nyan();
}
void nyan() {
tick();
SurfaceHolder surfaceHolder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = surfaceHolder.lockCanvas();
if (canvas != null) {
nyanNyan(canvas);
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
mNyanHandler.removeCallbacks(mNyanNyan);
if (isVisible()) {
mNyanHandler.postDelayed(mNyanNyan, 1000L/25L);
}
}
void tick() {
if (mWhen == -1L) {
mWhen = 0;
mStart = SystemClock.uptimeMillis();
} else {
long mDiff = SystemClock.uptimeMillis() - mStart;
mWhen = (int) (mDiff % mNyanDuration);
}
}
void nyanNyan(Canvas canvas) {
canvas.save();
canvas.scale(mScaleX, mScaleY);
mNyan.setTime(mWhen);
mNyan.draw(canvas, 0, 0);
canvas.restore();
}
}
}
这将基本缩放吴年猫狗猫以适应屏幕和永远的动画吧。
This will basically scale the nyan-nyan cat to fit the screen and animate it perpetually.
一个动态壁纸清单看起来有点状的,这个(本例中不包含配置活动):
A Live wallpaper manifest looks sort-of-like this (this example does not contain a configuration activity):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.nyan.nyan.package"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/application_nyan" >
<service
android:label="@string/wallpaper_nyan"
android:name=".NyanNyanService"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper" android:resource="@xml/nyan" />
</service>
</application>
</manifest>
在AndroidManifest.xml中引用了一个文件中的 RES / XML
,在名为这种情况下,nyan.xml:
The AndroidManifest.xml has a reference to a file in res/xml
, in this case named "nyan.xml":
<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />
这篇关于是否有可能设置GIF动画文件,如Android的动态壁纸?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!