使用canvas.drawBitmap的Android Live墙纸是一种减缓速度的方法
本周我刚开始安卓编程,现在正在制作一张实时壁纸 我有两个图像,背景图像(720x1280 png)和一个幻灯片条(2276x290 png),在一个端点循环中从右向左滑动。我的问题是,我只能让它以3-4fps的速度滑动,每帧1像素(在我的实际手机上,在AVD上,我只能以1/3fps的速度滑动),这对于一张活生生的壁纸来说是一种不稳定的方式。到目前为止,代码运行良好,但速度要慢得多 如果有人知道一种方法可以让这个“更快”的完成,那就太好了 我的代码:使用canvas.drawBitmap的Android Live墙纸是一种减缓速度的方法,android,performance,android-canvas,live-wallpaper,drawbitmap,Android,Performance,Android Canvas,Live Wallpaper,Drawbitmap,本周我刚开始安卓编程,现在正在制作一张实时壁纸 我有两个图像,背景图像(720x1280 png)和一个幻灯片条(2276x290 png),在一个端点循环中从右向左滑动。我的问题是,我只能让它以3-4fps的速度滑动,每帧1像素(在我的实际手机上,在AVD上,我只能以1/3fps的速度滑动),这对于一张活生生的壁纸来说是一种不稳定的方式。到目前为止,代码运行良好,但速度要慢得多 如果有人知道一种方法可以让这个“更快”的完成,那就太好了 我的代码: private class WEngine e
private class WEngine extends Engine {
private final Handler handler = new Handler();
private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}
};
private Paint paint = new Paint();
private int width;
int height;
private boolean visible = true;
int x = -1;
int x2 = 0;
int y = -1;
public WEngine() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(WService.this);
handler.post(drawRunner);
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(drawRunner);
} else {
handler.removeCallbacks(drawRunner);
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
this.visible = false;
handler.removeCallbacks(drawRunner);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
this.width = width;
this.height = height;
super.onSurfaceChanged(holder, format, width, height);
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
Resources res = getResources();
Bitmap backgroundimg = BitmapFactory.decodeResource(res, R.drawable.background);
Bitmap slidebarimg = BitmapFactory.decodeResource(res, R.drawable.slidebar);
try {
canvas = holder.lockCanvas();
canvas.drawBitmap(backgroundimg, 0, 0, paint);
if (canvas != null) {
if (x<0 && y<0) {
x = 0;
y = Math.round(height / 2);
} else {
x -= 1;
}
if (x - width < -height * 1.778125) {
x2 -= 1;
}
if (x < -height * 1.778125) {
x = x2;
x2 = 0;
}
canvas.drawBitmap(slidebarimg, x, y, paint);
if (x2 < 0) {
canvas.drawBitmap(slidebarimg, x2, y, paint);
}
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
handler.postDelayed(drawRunner, 30);
}
}
私有类WEngine扩展引擎{
私有最终处理程序=新处理程序();
private final Runnable drawRunner=新Runnable(){
@凌驾
公开募捐{
draw();
}
};
私人油漆=新油漆();
私有整数宽度;
内部高度;
私有布尔可见=真;
int x=-1;
int x2=0;
int y=-1;
公共工程(){
SharedReferences prefs=首选项管理器
.getDefaultSharedReferences(WService.this);
装卸工岗位(牵引员);
}
@凌驾
公共无效onVisibilityChanged(布尔可见){
可见的;可见的;
如果(可见){
装卸工岗位(牵引员);
}否则{
handler.removeCallbacks(drawRunner);
}
}
@凌驾
表面上的公共空隙已销毁(表面持有人){
super.OnSurface(持有人);
可见=假;
handler.removeCallbacks(drawRunner);
}
@凌驾
已更改曲面上的公共无效(曲面文件夹持有者,整数格式,
整数宽度,整数高度){
这个。宽度=宽度;
高度=高度;
super.onSurfaceChanged(支架、格式、宽度、高度);
}
私人提款(){
SurfaceHolder holder=getSurfaceHolder();
Canvas=null;
Resources res=getResources();
位图背景img=BitmapFactory.decodeResource(res,R.drawable.background);
位图slidebarimg=BitmapFactory.decodeResource(res,R.drawable.slidebar);
试一试{
canvas=holder.lockCanvas();
画布.绘制位图(背景img,0,0,绘制);
if(canvas!=null){
如果(x有OpenGl硬件纹理大小限制。在新设备中,主要是2048px。请尝试保持最大值。
( )
还要确保应用程序中已启用硬件加速
不要这样做。如果你在每一帧中解码位图,它会很慢。非常慢。硬件加速与否无关紧要。解码它们一次,然后在每一帧上绘制它们。我只是确保硬件加速处于启用状态,但它不会在我的画布上使用(我添加了If(canvas.isHardwareAccelerated())在绘制滑块位图之前(它没有绘制),我还将img大小减小到576x1024和320x290以确保,但没有任何效果。(除了smaler图像ofc)
private void draw() {
...
Bitmap backgroundimg = BitmapFactory.decodeResource(res, R.drawable.background);
Bitmap slidebarimg = BitmapFactory.decodeResource(res, R.drawable.slidebar);
...