【问题标题】:Android Live Wallpaper - why so slow - how to improve speed?Android 动态壁纸 - 为什么这么慢 - 如何提高速度?
【发布时间】:2014-01-06 23:38:00
【问题描述】:

我正在尝试创建我的第一个动态壁纸。它工作正常,除了速度问题,一切都会好起来的。它会减慢桌面速度 - 小部件和图标的滚动速度明显慢于使用专业动态壁纸时(我正在三星笔记上对其进行测试,因此不应该存在速度问题)。我开始认为我做错了 - 所以请看一下我的代码:

public class DemoWallpaperService extends WallpaperService {


@Override
public Engine onCreateEngine() {
    return new DemoWallpaperEngine();

}

private class DemoWallpaperEngine extends Engine {
    private boolean mVisible = false;
    private final Handler mHandler = new Handler();

     int x=0,y=0,a=255,i=-1, a1=255, i1=-1;
     float r=0,rs=1;
     float rx1=10, rxs=-1;

     private Matrix mMatrix = new Matrix();
     private Matrix mMatrix1 = new Matrix();
     private Matrix mMatrixRotate1 = new Matrix();
     private Matrix mMatrixRotate2 = new Matrix();

     public Bitmap spaceShip = BitmapFactory.decodeResource(getResources(), R.drawable.spaceship);
     public Bitmap background= BitmapFactory.decodeResource(getResources(), R.drawable.back2short2j);
     public Bitmap wyspa= BitmapFactory.decodeResource(getResources(), R.drawable.wyspa22g);
     public Bitmap ksiezyc = BitmapFactory.decodeResource(getResources(), R.drawable.ksiezyc);
     public Bitmap reflektorfront= BitmapFactory.decodeResource(getResources(), R.drawable.reflektorwyspa);

     private float mPixels;
     private float mPixels1;



    private final Runnable mUpdateDisplay = new Runnable() {
    @Override
    public void run() {
        draw();
    }};



    private void draw() {
       SurfaceHolder holder = getSurfaceHolder();
       Canvas c = null;

       Display d = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
       int wx= d.getWidth();
       int wy= d.getHeight();


       try {
           Runtime.getRuntime().gc();
          c = holder.lockCanvas();
          c.save();

          if (c != null) {

              Paint paintMoon = new Paint();

              if(a1<=15){
                  i1=1;
              }
              else if(a1>=255){
                  i1=-1;
              }
              a1+=5*i1;
              paintMoon.setAlpha(a1);

              c.translate((float)mPixels, 0f);
              c.drawBitmap(background, mMatrix, null);
              c.drawBitmap(ksiezyc, 1027*wx/480,15*wy/800, paintMoon);

              if(rx1<=-15){
                  rxs=1;
              }
              else if(rx1>=15){
                  rxs=-1;
              }
              rx1+=rxs*0.7;

              c.translate((float)mPixels1, 0f);
              //reflektor wyspa back
              mMatrixRotate2.setTranslate(340*wx/480,300*wy/800);
              mMatrixRotate2.preRotate(rx1,reflektorfront.getWidth()/2,20);
              c.drawBitmap(reflektorfront, mMatrixRotate2, null);


              c.drawBitmap(wyspa, mMatrix1, null);

              if(r<=-15){
                  rs=1;
              }
              else if(r>=15){
                  rs=-1;
              }
              r+=rs*0.5;


              mMatrixRotate1.setTranslate(160*wx/480,380*wy/800);

              mMatrixRotate1.preRotate(r,reflektorfront.getWidth()/2,20);

              c.drawBitmap(reflektorfront, mMatrixRotate1, null);


              if(x<c.getWidth()){
              x+=3;}
              else{x=0;}
              if(y<c.getHeight()){
              y+=3;}
              else{y=0;}
              Paint paint = new Paint();


              if(a<=5){
                  i=1;
              }
              else if(a>=255){
                  i=-1;
              }
              a+=10*i;
              paint.setAlpha(a);

              c.drawBitmap(spaceShip,x,y,paint);


                 c.restore();

          }
       } finally {
          if (c != null)
             holder.unlockCanvasAndPost(c);
       }
       mHandler.removeCallbacks(mUpdateDisplay);
       if (mVisible) {
           mHandler.postDelayed(mUpdateDisplay, 10);
       }
    }
    @Override
    public void onOffsetsChanged(float xOffset, float yOffset,
             float xStep, float yStep, int xPixels, int yPixels){

        super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels);                   
         mPixels = xPixels*7/4;

         mPixels1 = 500+xPixels;

            draw();
    }



    @Override
    public void onVisibilityChanged(boolean visible) {
        mVisible = visible;
        if (visible) {
            draw();
        } else {
            mHandler.removeCallbacks(mUpdateDisplay);
        }
    }

     @Override
      public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {

         super.onSurfaceChanged(holder, format, width, height);

         float w = background.getWidth();
         float h = background.getHeight();
         float s = height / (float)h;
         float z = height / (float)h;
         mMatrix.reset();
         mMatrix1.reset();
         mMatrixRotate1.reset();
         mMatrixRotate2.reset();

         mMatrix.setScale(s, s);
         mMatrix1.setScale(z, z);
         mMatrixRotate1.setScale(s, s);

         draw();
      }

    @Override
    public void onSurfaceDestroyed(SurfaceHolder holder) {
        super.onSurfaceDestroyed(holder);
        mVisible = false;
        mHandler.removeCallbacks(mUpdateDisplay);
    }


    @Override
     public void onCreate(SurfaceHolder surfaceHolder) {
         super.onCreate(surfaceHolder);

         setTouchEventsEnabled(false);
     }

    @Override
    public void onDestroy() {
         super.onDestroy();
         mVisible = false;
         mHandler.removeCallbacks(mUpdateDisplay);
    }
}    

基本上它是背景位图 (850x480jpg 70kb),滚动速度较慢,前面的位图 (350x400 透明 gif 100 kb) 滚动速度更快(以实现视差效果)和一些较小的 png 位图 (3x 10-20 kb 50x50)在前景旋转和移动的物体(灯光和太空船)。

我的问题是 - 我错过了重点 - 我通过刷新 draw() 函数来设置动画,延迟设置为 10。(这是我知道的唯一方法 - 我应该以其他方式为它设置动画吗?是位图吗?太大了?或者为什么这么慢?我应该使用精灵来为前面的小效果设置动画以使其更快吗?还有其他方法可以为生活壁纸设置动画吗?我经历了很多教程,我已经走了这么远,但现在我必须寻求帮助。

【问题讨论】:

    标签: android live-wallpaper slowdown


    【解决方案1】:

    我不确定这是否是完整的答案……但值得尝试。而不是使用 Bitmap.decodeResources() 方法引用位图,试试这个:

    pic1 = Bitmap.createScaledBitmap(background, (int)background.getWidth(), (int)background.getHeight(), true);
    

    我制作视差壁纸已经有一段时间了,发现缓慢通常是由于在屏幕上绘制了多少位图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2012-12-27
      • 2015-05-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多