Android Studio, потоки, управляющие анимацией.Холст не отображает графику? - PullRequest
0 голосов
/ 22 марта 2019

довольно новый для Android Dev. и я испытываю затруднения при реализации простого рисования на холст в коде. Ниже я перечисляю все соответствующие коды для приложения. Обратитесь к моему « CharacterSprite Class: » для конкретной проблемы. >> Это был мой canvas.drawRect не работает ..

  • Я не уверен, почему?
  • Может быть, мне нужно реализовать другой отдельный класс для каждой анимации / вызова отрисовки?
  • Должен ли я реализовать другой поток для обработки вызова draw.Rect?

И

Первое размещение, так что здесь ничего не выходит, любой совет будет более Добро пожаловать.

Спасибо за ваше время. -Адам С.

MainActivity:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(new GameView(this));
}

Класс GameView:

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

private CreatedMainThread thread;
private CharacterSprite characterSprite;


public GameView (Context context){
    super(context);

    getHolder().addCallback(this);
    thread = new CreatedMainThread(getHolder(), this);
    setFocusable(true);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
characterSprite.update();
}

@Override
public void surfaceCreated(SurfaceHolder holder){
    characterSprite = new CharacterSprite(BitmapFactory.decodeResource(getResources(), R.drawable.megumin_hat_icon));
    thread.setRunning(true);
    thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder){
    boolean retry = true;
    while (retry){
        try {
            thread.setRunning(false);
            thread.join();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
        retry = false;
    }

}

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

@Override
public void draw(Canvas canvas){
    super.draw(canvas);
        if(canvas!=null) {

            // setting background color:
            Paint paint = new Paint();
            paint.setColor(Color.DKGRAY);
            canvas.drawColor(paint.getColor());

            // calling the draw method:
            characterSprite.draw(canvas);
        }
}
}

Класс резьбы:

public class CreatedMainThread extends Thread {

private SurfaceHolder surfaceHolder;
private GameView gameView;
private boolean running;
public static Canvas canvas;

public CreatedMainThread(SurfaceHolder surfaceHolder, GameView gameView){

    super();
    this.surfaceHolder = surfaceHolder;
    this.gameView = gameView;
}

@Override
public void run(){
    while (running){
        canvas = null;
        try
        {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                this.gameView.update();
                this.gameView.draw(canvas);
            }
        } catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (canvas != null)
            {
                try
                {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

}


public void setRunning(boolean isRunning){
    running = isRunning;
}
}

Вот мои вопросы:

Метод public void draw (Canvas) , растровое изображение отображается нормально, но draw.rect не отображается.

CharacterSprite Класс:

public class CharacterSprite {

private RectF rectF = new RectF();

private Bitmap sprite;
private int x,y;

private int xVel = 10;
private int yVel = 5;

private int screenW = Resources.getSystem().getDisplayMetrics().widthPixels;
private int screenH = Resources.getSystem().getDisplayMetrics().heightPixels;


public CharacterSprite(Bitmap img){
    sprite = img;
    x = 50;
    y = 50;

    //Setting rectangle:
    rectF.bottom = 20;
    rectF.top = 20;
    rectF.left = 20;
    rectF.right = 20;
}


public void draw(Canvas canvas){

    // Draw Rect:
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setColor(paint.getColor());
    canvas.drawRect(rectF, paint);  // <<<<<-- Does not display!!! 

    // Draw Hat
    canvas.drawBitmap(sprite,x,y,null);
}

public void update() {

    if(x < 0 && y <0) {
        x = screenW / 2;
        y = screenH / 2;
    }else {
        x += xVel;
        y += yVel;

        if((x > screenW - sprite.getWidth()) || (x<0)){
            xVel = xVel*-1;
        }
        if((y > screenH - sprite.getHeight()) || (y<0)){
            yVel = yVel*-1;
        }
    }
}
}
...