Рисование с SurfaceView Android - двухслойная рамка - PullRequest
0 голосов
/ 16 декабря 2018

У меня проблема с моим видом поверхности, ошибка выглядит так, как будто мой поток создал два слоя проигрывателя, однако в коде я рисую только один раз.когда я вставляю для обновления фреймы, он обновляется только с одного из созданных слоев, по-видимому, со второго.так что происходит что-то, что заставляет мою систему создавать этот новый слой кадров.Может ли кто-нибудь мне помочь, пожалуйста

MainPanel.java

package com.mycompany.animation;
import android.view.*;
import android.content.*;
import android.graphics.*;
import java.io.*;

public class MainPanel extends SurfaceView implements SurfaceHolder.Callback
{
    private Context ctx;
    private Player player;
    private MainThread thread;
    private Canvas canvas;

    public MainPanel(Context ctx) {
        super(ctx);
        this.ctx = ctx;

        getHolder().addCallback(this);

        setFocusable(true);


    }

    public void update() {
        player.update();
    }

    @Override
    public void surfaceCreated(SurfaceHolder p1)
    {
        setWillNotDraw(false);

        thread = new MainThread(getHolder(), this);
        thread.start();

        try
        {
            player = new Player(BitmapFactory.decodeStream(ctx.getAssets().open("mage.png")), 13, 21, 3);

        }
        catch (IOException e)
        {}
    }

    @Override
    public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4)
    {
        // TODO: Implement this method
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder p1)
    {
        // TODO: Implement this method
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        if(canvas != null) {
            //canvas.drawColor(Color.CYAN); 

            //canvas.scale(7, 7);
            player.draw(canvas);
        }
    }


}

MainThread.java

package com.mycompany.animation;

import android.graphics.*;
import android.view.*;

public class MainThread extends Thread
{
    MainPanel painel;
    Canvas canvas;
    SurfaceHolder holder;
    boolean running = true;
    public MainThread(SurfaceHolder holder, MainPanel painel) {
        //super();
        this.painel = painel;
        this.holder = holder;
    }

    @Override
    public void run()
    {
        while(running) {
            canvas = null;

            try {
                canvas = this.holder.lockCanvas();
                painel.update();
                painel.draw(canvas);

            } catch(Exception e) {

            } finally {
                if(canvas != null) {
                    try {
                        this.holder.unlockCanvasAndPost(canvas);
                    } catch(Exception e) {}
                }
            }
        }
        //super.run();
    }

}

Player.java

package com.mycompany.animation;


import android.graphics.*;
import com.mycompany.animation.Animation;
import android.widget.*;

public class Player
{
    private int x = 0, y = 0;
    private int width, height;
    private int xSpeed = 0, ySpeed = 0;
    private Bitmap spritesheet;
    private Animation animation = new Animation();
    private long startTime;

    public Player(Bitmap res, int width, int height, int numFrames) {
        this.width = width;
        this.height = height;

//      spritesheet
        Bitmap[] image = new Bitmap[numFrames];
        spritesheet = res;

        for(int i = 0; i < image.length; i++) {
            image[i] = Bitmap.createBitmap(spritesheet,  i * width, 0, width, height);
        }

        animation.setFrames(image);
        animation.setDelay(100);
        startTime = System.nanoTime();

    }

    public void update() {
        animation.update();

        ySpeed = 2;

        y += ySpeed;
    }

    public void draw(Canvas canvas) {
//      canvas.drawColor(Color.CYAN);
        //canvas.scale(7, 7);
        canvas.drawBitmap(Bitmap.createScaledBitmap(animation.getImage(), canvas.getWidth() / 5, canvas.getHeight() / 4, false), x, y, null);
    }

    public void setX(int x)
    {
        this.x = x;
    }

    public int getX()
    {
        return x;
    }

    public void setY(int y)
    {
        this.y = y;
    }

    public int getY()
    {
        return y;
    }

    public void setXSpeed(int xSpeed)
    {
        this.xSpeed = xSpeed;
    }

    public double getXSpeed()
    {
        return xSpeed;
    }

    public void setYSpeed(int ySpeed)
    {
        this.ySpeed = ySpeed;
    }

    public double getYSpeed()
    {
        return ySpeed;
    }

}

animation.java

package com.mycompany.animation;

import android.graphics.Bitmap;

public class Animation {
    private Bitmap[] frames;
    private int currentFrame;
    private long startTime;
    private long delay;
    private boolean playedOnce;

    public void setFrames(Bitmap[] frames)
    {
        this.frames = frames;
        currentFrame = 0;
        startTime = System.nanoTime();
    }
    public void setDelay(long d){delay = d;}
    public void setFrame(int i){currentFrame= i;}

    public void update()
    {
        long elapsed = (System.nanoTime()-startTime)/1000000;

        if(elapsed>delay)
        {
            currentFrame++;
            startTime = System.nanoTime();
        }
        if(currentFrame == frames.length){
            currentFrame = 0;
            playedOnce = true;
        }
    }
    public Bitmap getImage(){
        return frames[currentFrame];
    }
    public int getFrame(){return currentFrame;}
    public boolean playedOnce(){return playedOnce;}
}

MainActivity.this

package com.mycompany.animation;

import android.app.*;
import android.os.*;

public class MainActivity extends Activity 
{
            @Override
          protected void onCreate(Bundle savedInstanceState)
            {
            super.onCreate(savedInstanceState);
            setContentView(new MainPanel(this));
            }
}
...