2017-08-29 4 views
1

J'ai lu plusieurs threads ici qui expliquent comment obtenir la taille de la vue lors de l'exécution, mais aucune des solutions n'a fonctionné pour moi.Obtenir la hauteur et la largeur de surface de vue lors de l'implémentation de runnable

GameScreen.java

public class GameScreen extends AppCompatActivity{ 

// Declare an instance of SnakeView 
GameView snakeView; 

SurfaceHolder surface; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_game_screen); 

    snakeView = (GameView) findViewById(R.id.GameView); 
    surface = snakeView.getHolder(); 

    snakeView = new GameView(this, surface); 

} 

où Gameview est une classe de vue surfaceview extension. Ce qui suit est une version simplifiée de mon code détaillant le problème. J'ai omis la méthode run() et beaucoup d'autres pour éviter la confusion.

GameView.java

public class GameView extends SurfaceView implements Runnable { 

public GameView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
} 

public GameView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 


public GameView(Context context, SurfaceHolder surfaceholder) { 

    super(context); 
    init(); 

    m_context = context; 

    // Initialize the drawing objects 
    m_Holder = surfaceholder; 
    m_Paint = new Paint(); 
} 

private void init(){ 
    surfaceHolder = getHolder(); 
    surfaceHolder.addCallback(new SurfaceHolder.Callback() { 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 

     } 


     @Override 
     public void surfaceChanged(SurfaceHolder holder, 
            int format, int width, int height) { 
     m_Screenheight = height; 
     m_Screenwidth = width; 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      // TODO Auto-generated method stub 
     } 
    }); 
} 

Cependant appeler getWidth() et getHeight() provoque l'application crash.

Je sais que vous devez attendre la vue pour mettre en page mais j'ai essayé toutes les suggestions mais j'ai essayé toutes les suggestions d'autres discussions en vain. Mon principal manque de compréhension vient du fait que j'utilise les outils Runnable dans ma classe personnalisée, donc je ne sais pas où je suis autorisé à utiliser getWidth ou une méthode similaire. Je suis nouveau à android en général alors s'il vous plaît soyez explicite dans votre solution.

EDIT:

Je signale que je suis en utilisant la largeur et la hauteur pour former une grille pour dessiner dans le surfaceview.

EDIT 2:

Voir le code révisé.

+0

vous avez 'surfaceChanged()' méthode qui transmet les données que vous voulez – pskink

+0

Alors dois-je utiliser getWidth() dans surfaceChanged()? –

+0

'surfaceChanged' prend 4 paramètres, utilisez-les – pskink

Répondre

0

Si votre surface est en plein écran, vous pouvez obtenir les tailles d'écran.

public GameView(Context context, SurfaceHolder surfaceholder) { 

    super(context); 
    init(); 

    m_context = context; 

    // Initialize the drawing objects 
    m_Holder = surfaceholder; 
    m_Paint = new Paint(); 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    ((Activity)context).getWindowManager() 
      .getDefaultDisplay() 
      .getMetrics(displayMetrics); 
    int height = displayMetrics.heightPixels; 
    int width = displayMetrics.widthPixels; 
    m_ScreenHeight= height; 
    m_ScreenWidth= width; 
} 
+0

Malheureusement, ma vue n'est pas en plein écran. Son dans une disposition linéaire sur l'écran –