2015-07-11 1 views
0

semble comme méthode onDraw n'est pas appelé ici, je reçois aucun message de journal ou d'un rectangle à l'écran et je ne peux pas semblent trouver le problème Classes importantes: classe Activité principale: package com.binf.riley.paintwall;Android: onDraw (de toile de toile) ne pas être appelé

import com.binf.riley.paintwall.util.SystemUiHider; 

import android.annotation.TargetApi; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Resources; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.RelativeLayout; 

public class GameActivity extends Activity { 

    RelativeLayout relLayout; 
    GameRoot gameRoot; 
    Renderer renderer; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.activity_game); 
     relLayout = (RelativeLayout) findViewById(R.id.relLayout); 

     //create objects (entry point for game) 
     gameRoot = new GameRoot(); 
     renderer = new Renderer(this.getApplicationContext()); 
     onResume(); 
    } 

    @Override 
    protected void onResume() { 
     gameRoot.resume(); 
     renderer.resume(); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     gameRoot.pause(); 
     renderer.pause(); 
     super.onPause(); 
    } 
} 

Classe brisé:

package com.binf.riley.paintwall; 


import android.app.Activity; 
import android.app.Fragment; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

/** 
* Created by Riley on 7/11/2015. 
*/ 
public class Renderer { 

    private CanvasRenderer mCanvasRenderer ; 

    public Renderer(Context context) { 
     mCanvasRenderer = new CanvasRenderer(context); 
      } 

    public void resume() { 
     mCanvasRenderer.resume(); 
    } 

    public void pause() { 
     mCanvasRenderer.pause(); 
    } 



    private class CanvasRenderer extends View implements Runnable { 

     Thread thread = null; 
     volatile boolean running = false; 
     volatile boolean drawNeeded = false; 

     public CanvasRenderer(Context context) { 
      super(context); 
      doSetup(); 
     } 

     private void doSetup() { 

     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      Log.i("betterinf","DRAWINGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG"); 
      //preform drawing here!!!!! 
      Paint p = new Paint(); 
      p.setColor(Color.BLACK); 
      p.setStyle(Paint.Style.FILL_AND_STROKE); 
       canvas.drawRect(50, 300, 200, 500, p); 

       Log.i("betterinf","drawing"); 


      //draw has finished, another one is now needed 
      drawNeeded = true; 

     } 

     @Override 
     public void run() { 
      while (running) { 

       if (drawNeeded) { 
        drawNeeded = false; 
        //hands off to UI thread for hardware acc. 

        postInvalidate(); 
        Log.i("betterinf", "draw was needed"); 
       } 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 


     public void pause() { 
      Log.i("betterinf","pause"); 
      running = false; 
      while (true) { 
       try { 
        thread.join(); 
        return; 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 

     } 


     public void resume() { 
      Log.i("betterinf","resume"); 
      running = true; 
      drawNeeded = true; 
      thread = new Thread(this); 
      thread.start(); 
     } 
    } 


} 

Répondre

1

Il semble que vous ne l'avez même pas lu quelque chose sur Android. Donc, évidemment, rien ne fonctionne.

  • Vous ne devez pas appeler des méthodes de cycle de vie telles que onResume par vous-même. Le système l'appellera;
  • onDraw appelle par le système, pas par votre code.
  • Vous ne devez pas créer un nouveau thread pour afficher des vues. Le système le crée déjà pour vous;

Vous devez commencer en savoir plus sur le rendu au moins d'ici: https://developer.android.com/guide/topics/graphics/opengl.html

+0

Je sais que onDraw est appelé par le système, mais ce ne est pas et c'est le problème – PandaTurtle

+1

@PandaTurtle vous vous contredisez. Comment le système peut-il appeler la méthode 'onDraw' si votre vue n'est pas dans la liste d'affichage? 'postInvalidate' ne fait pratiquement rien. – eleven

+0

@ Foxinsocks: il utilise une vue personnalisée, pas GLES, donc votre lien opengl n'est pas approprié - http://developer.android.com/training/custom-views/index.html est mieux. Je ne le vois pas appeler explicitementDraw (bien que vous ayez raison sur onResume). – fadden