У меня проблема с моим видом поверхности, ошибка выглядит так, как будто мой поток создал два слоя проигрывателя, однако в коде я рисую только один раз.когда я вставляю для обновления фреймы, он обновляется только с одного из созданных слоев, по-видимому, со второго.так что происходит что-то, что заставляет мою систему создавать этот новый слой кадров.Может ли кто-нибудь мне помочь, пожалуйста
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));
}
}