Строим живые обои

1

Я застрял. Я пытаюсь построить живые обои с использованием фреймов. Код, который я использую, не работает. Живые обои не просматриваются через рамки. Он показывает только последний кадр. Что мне делать с этим кодом, чтобы заставить его перемещаться по его рамкам? Метод массива, если да, то как бы я создал массив изображений в этом коде?

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.service.wallpaper.WallpaperService;

import android.view.SurfaceHolder;

public class WallpaperSer extends WallpaperService {

    public void onCreate() 

    {
        super.onCreate();
    }

    public void onDestroy() 
    {
        super.onDestroy();
    }

    public Engine onCreateEngine() 
    {
        return new WallpaperSerEngine();
    }

    class WallpaperSerEngine extends Engine 
    {
        public Bitmap image1, image2, image3, image4, image5, image6, image7, image8, image9,image10,
        image11, image12, image13, image14, image15, image16, image17, image18, image19,image20;

        WallpaperSerEngine() 
        {       
                image1 = BitmapFactory.decodeResource(getResources(), R.drawable.and1);
                image2 = BitmapFactory.decodeResource(getResources(), R.drawable.and2);
                image3 = BitmapFactory.decodeResource(getResources(), R.drawable.and3); 
                image4 = BitmapFactory.decodeResource(getResources(), R.drawable.and4);
                image5 = BitmapFactory.decodeResource(getResources(), R.drawable.and5);
                image6 = BitmapFactory.decodeResource(getResources(), R.drawable.and6);
                image7 = BitmapFactory.decodeResource(getResources(), R.drawable.and7);
                image8 = BitmapFactory.decodeResource(getResources(), R.drawable.and8);
                image9 = BitmapFactory.decodeResource(getResources(), R.drawable.and9);
                image10 = BitmapFactory.decodeResource(getResources(), R.drawable.and10);
                image11 = BitmapFactory.decodeResource(getResources(), R.drawable.and11);
                image12 = BitmapFactory.decodeResource(getResources(), R.drawable.and12);
                image13 = BitmapFactory.decodeResource(getResources(), R.drawable.and13); 
                image14 = BitmapFactory.decodeResource(getResources(), R.drawable.and14);
                image15 = BitmapFactory.decodeResource(getResources(), R.drawable.and15);
                image16 = BitmapFactory.decodeResource(getResources(), R.drawable.and16);
                image17 = BitmapFactory.decodeResource(getResources(), R.drawable.and17);
                image18 = BitmapFactory.decodeResource(getResources(), R.drawable.and18);
                image19 = BitmapFactory.decodeResource(getResources(), R.drawable.and19);
                image20 = BitmapFactory.decodeResource(getResources(), R.drawable.and20);
        }

        public void onCreate(SurfaceHolder surfaceHolder) 
        {
            super.onCreate(surfaceHolder);
        }

        public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) 
        {
            drawFrame();

        }

        void drawFrame() 
        {
            final SurfaceHolder holder = getSurfaceHolder();

            Canvas c = null;
            try 
            {
                c = holder.lockCanvas();
                if (c != null) 
                {              
                     c.drawBitmap(image1, 0, 0, null);
                     c.drawBitmap(image2, 0, 0, null);
                     c.drawBitmap(image3, 0, 0, null);
                     c.drawBitmap(image4, 0, 0, null);
                     c.drawBitmap(image5, 0, 0, null);
                     c.drawBitmap(image6, 0, 0, null);
                     c.drawBitmap(image7, 0, 0, null);
                     c.drawBitmap(image8, 0, 0, null);
                     c.drawBitmap(image9, 0, 0, null);
                     c.drawBitmap(image10, 0, 0, null);
                     c.drawBitmap(image11, 0, 0, null);
                     c.drawBitmap(image12, 0, 0, null);
                     c.drawBitmap(image13, 0, 0, null);
                     c.drawBitmap(image14, 0, 0, null);
                     c.drawBitmap(image15, 0, 0, null);
                     c.drawBitmap(image16, 0, 0, null);
                     c.drawBitmap(image17, 0, 0, null);
                     c.drawBitmap(image18, 0, 0, null);
                     c.drawBitmap(image19, 0, 0, null);
                     c.drawBitmap(image20, 0, 0, null);
                }
            } finally 
            {
                if (c != null) holder.unlockCanvasAndPost(c);
            }
        }
    }
}

Это редактирование к моему коду. Не решение....

 import android.graphics.Bitmap;

 import android.graphics.BitmapFactory;

 import android.graphics.Canvas;

 import android.os.Handler;

 import android.service.wallpaper.WallpaperService;

 import android.view.SurfaceHolder;

 public class WallpaperSer extends WallpaperService {

int incrementer=0;
Bitmap bmps[]=new Bitmap[10];

public void onCreate() 
{
    super.onCreate();
}

public void onDestroy() 
{
    super.onDestroy();
}

public Engine onCreateEngine() 
{
    return new WallpaperSerEngine();
}

class WallpaperSerEngine extends Engine 
{

    int res[]={R.drawable.and1,R.drawable.and2,R.drawable.and3,R.drawable.and4,R.drawable.and5,R.drawable.and6,R.drawable.and7,R.drawable.and8,R.drawable.and9,R.drawable.and10};
    WallpaperSerEngine() 
    {  
          for(int i=0;i<=10;i++)
              {
                    bmps[i]= BitmapFactory.decodeResource(getResources(),res[i]);                     
               }
    }
}

    private final Handler handler = new Handler();
     private final Runnable drawRunner = new Runnable() {
            @Override
            public void run() {

                  drawFrame();
                  handler.removeCallbacks(drawRunner);

                  handler.postDelayed(drawRunner, 200);
            }

        };
        void drawFrame() 
        {
            final SurfaceHolder holder = getSurfaceHolder();

            Canvas c = null;
            try 
            {
                c = holder.lockCanvas();
                if (c != null) 
                {              

                     c.drawBitmap(bmps[incrementer], 0, 0, null);

                    incrementer=(incrementer==10)?0 : incrementer+1; 
                }
            } finally 
            {
                if (c != null) holder.unlockCanvasAndPost(c);
            }
        }

        private SurfaceHolder getSurfaceHolder() {
            // TODO Auto-generated method stub
            return null;
        }
    }
  • 0
    Вы рисуете все кадры одновременно ...
  • 0
    Как мне это изменить?
Показать ещё 1 комментарий
Теги:
animation
android-canvas
live-wallpaper

1 ответ

3
Лучший ответ

Вы должны зарегистрировать обработчик и использовать некоторые потоки.

Но прежде всего добавьте глобальный int, как это,

int incrementer = 0;

См. Этот модифицированный код.

1) Внутри вашего класса WallpaperSerEngine создайте обработчик следующим образом:

 private final Handler handler = new Handler(); 

2) Аналогичным образом добавьте Runnable внутри класса WallpaperSerEngine и вызовите drawFrame(),

 private final Runnable drawRunner = new Runnable() {
        @Override
        public void run() {

              drawFrame();              
        }

    };

3) Добавьте нижние строки в нижнюю часть вашего drawFrame(), чтобы гарантировать, что ваш runnable вызывается на определенный временной интервал для рисования кадров,

                handler.removeCallbacks(drawRunner);

        handler.postDelayed(drawRunner, 200); //delay milliseconds 200. Change it for your need.

4) Теперь измените метод drawFrame(). Вы не можете так поступать. Вы должны использовать некоторые массивы Bitmap. Это важно. Kindle четко следуйте приведенным ниже инструкциям.

5) Вместо объявления переменной для каждого растрового изображения поместите ее в массив Bitmap.

Bitmap bmps[]=new Bitmap[10]; // assign its size based on your need. I just need 10 for demo.

6) Теперь объявите массив int для ваших ресурсов Drawable.

   int res[]={R.drawable.and1,R.drawable.and2,R.drawable.and3,R.drawable.and4,R.drawable.and5,R.drawable.and6,R.drawable.and7,R.drawable.and8,R.drawable.and9,R.drawable.and10};

7) Теперь измените ваш WallpaperSerEngine() следующим образом.

WallpaperSerEngine() 
        {  
              for(int i=0;i<=10;i++)
                  {
                        bmps[i]= BitmapFactory.decodeResource(getResources(),res[i]);                     
                   }
        }

8) И теперь, наконец, небольшая модификация вашего drawFrame(),

void drawFrame() 
        {
            final SurfaceHolder holder = getSurfaceHolder();

            Canvas c = null;
            try 
            {
                c = holder.lockCanvas();
                if (c != null) 
                {              

                     c.drawBitmap(bmps[incrementer], 0, 0, null);

                    incrementer=(incrementer==10)?0 : incrementer+1; 
                }
            } finally 
            {
                if (c != null) holder.unlockCanvasAndPost(c);
            }
        }
    }

Это. Теперь вы должны видеть свои рамки. И примите это, если это будет полезно.

  • 0
    Извините, мне трудно залежать. Я не совсем уверен, где разместить эти коды ... Когда вы говорите, вставьте это в свой класс WallpaperSerEngine, вы имеете в виду как переменную? или ниже, где у меня есть image1 = BitmapFactory.decodeResource (getResources (), R.drawable.and1); и т.д. извините! Я новичок в этом. Но я посвящен, чтобы учиться ...
  • 0
    Вы должны удалить все из конструктора и добавить только это для цикла там. Комментарий для дальнейшей помощи. Нет проблем
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню