使用canvas.drawBitmap的Android Live墙纸是一种减缓速度的方法

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

本周我刚开始安卓编程,现在正在制作一张实时壁纸

我有两个图像,背景图像(720x1280 png)和一个幻灯片条(2276x290 png),在一个端点循环中从右向左滑动。我的问题是,我只能让它以3-4fps的速度滑动,每帧1像素(在我的实际手机上,在AVD上,我只能以1/3fps的速度滑动),这对于一张活生生的壁纸来说是一种不稳定的方式。到目前为止,代码运行良好,但速度要慢得多

如果有人知道一种方法可以让这个“更快”的完成,那就太好了

我的代码:

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