2013-02-02 3 views
1

Невозможно запустить onDraw() нестандартного вида. Зачем? Я использую 2.3.3. Не следует ли автоматически рисовать изображение при создании? Метод onMeasure() запускается, и я получаю правильную ширину и высоту экрана.onDraw не срабатывает при создании

package com.example.assignment2b; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.Log; 
import android.view.Display; 
import android.view.Menu; 
import android.view.View; 
import android.view.WindowManager; 

public class AcesActivity extends Activity { 

    private static final String TAG = "DEBUG"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     HeartView heartView = new HeartView(this); 
     setContentView(heartView); 
     heartView.invalidate(); 
    } 


    class HeartView extends View { 

     private int screenWidth; 
     private int screenHeight; 
     private Context context; 

     public HeartView(Context context) { 
      super(context); 
      this.context = context; 

     } 

     @Override 
     public void onDraw(Canvas canvas) { 
      Log.println(Log.DEBUG, TAG, "onDraw fired"); 
      int cardWidth = screenWidth - 10; 
      int cardHeight = (int) (cardWidth * 1.4); 


      canvas.drawColor(Color.DKGRAY); 

      Paint paint = new Paint(); 
      paint.setColor(Color.WHITE); 
      paint.setStyle(Paint.Style.FILL); 
      canvas.drawRect(5, (screenHeight/2) - (cardHeight/2), screenWidth - 5, (screenHeight/2) + (cardHeight/2), paint); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.STROKE); 
      canvas.drawRect(5, (screenHeight/2) - (cardHeight/2), screenWidth - 5, (screenHeight/2) + (cardHeight/2), paint); 

     } 

     @Override 
     public void onMeasure(int width, int height) { 
      Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
      WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
      Display display = wm.getDefaultDisplay(); 
      screenWidth = display.getWidth(); 
      screenHeight = display.getHeight(); 
      setMeasuredDimension(screenWidth, screenHeight); 
      Log.println(Log.DEBUG, TAG, "screenWidth = " + screenWidth); 
      Log.println(Log.DEBUG, TAG, "scrrenHeight = " + screenHeight); 
      super.onMeasure(screenWidth, screenHeight); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return true; 
    } 
} 
+0

я заметил 2 вещи, когда происходит через Android примеров: 1) Они обернули пользовательский вид в макете перед отправкой его к деятельности и 2) Они не называли Invalidate() в onCreate. Я не уверен, что любая из этих вещей решит вашу проблему, но вы также можете дать им шанс. – Prime

ответ

1

Несколько различных проблем. Сначала, как предложил @dragonwrenn, без параметров ViewGroup и layout, ваше представление не имеет собственных границ. Призыв к invalidate() не нужен, но не проблематичен.

public class AcesActivity extends Activity { 

    private static final String TAG = "DEBUG"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     RelativeLayout rl = new RelativeLayout(this); 
     RelativeLayout.LayoutParams params = new 
      RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, 
      LayoutParams.MATCH_PARENT); 
     setContentView(rl); 

     HeartView heartView = new HeartView(this); 
     heartView.setLayoutParams(params); 
     rl.addView(heartView);  
    } 

    class HeartView extends View { 

     private int screenWidth; 
     private int screenHeight; 
     private Context context; 

     // Moved a couple of variable declarations out of the onDraw method 
     Paint paint; 
     int cardWidth; 
     int cardHeight; 

     public HeartView(Context context) { 
      super(context); 
      this.context = context; 
      paint = new Paint(); 

     } 

Во-вторых, ваша математика для прямоугольников вытащила их за пределы экрана. Я поставил некоторые жесткие цифры, как тест. Вы захотите переделать свои номера, чтобы получить то, что вы действительно хотите. Кроме того, ваш ход не имел ширину, поэтому обратите внимание

 @Override 
     public void onDraw(Canvas canvas) { 

      Log.println(Log.DEBUG, TAG, "onDraw fired"); 

      canvas.drawColor(Color.DKGRAY); 

      paint.setColor(Color.WHITE); 
      paint.setStyle(Paint.Style.FILL); 
      canvas.drawRect(10, 10, 50, 50, paint); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeWidth(3); 
      canvas.drawRect(10, 10, 50, 50, paint); 

     } 

В-третьих, я не уверен, что все в onMeasure пытается достичь, но он вызывает проблемы для зрения. Вам не нужно больше, чем то, что ниже:

 @Override 
     public void onMeasure(int width, int height) { 
      Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
      screenWidth = width; 
      screenHeight = height; 

      Log.println(Log.DEBUG, TAG, "screenWidth = " + screenWidth); 
      Log.println(Log.DEBUG, TAG, "scrrenHeight = " + screenHeight); 
      super.onMeasure(screenWidth, screenHeight); 
      cardWidth = screenWidth - 10; 
      cardHeight = (int) (cardWidth * 1.4); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return true; 
    } 
} 

Edit: примечание оригинальный плакат, выше функциональный код протестирован в Eclipse. Если каждый раздел будет скопирован и вставлен точно, он будет работать.

+0

Upvote-тщательный анализ с предложениями – Prime

+0

Благодарим вас за ваши предложения. К сожалению, после того, как я их реализовал, onDraw все еще не срабатывает. – badgerduke

+0

Если вы скопируете этот код точно, он будет срабатывать. Я сам запустил его в Eclipse, увидел квадрат на экране и onDraw в logcat. Попробуйте снова. – anthropomo

0

Сделайте следующие изменения в вашем методе onMeasure(): Объявите показатели отображения в своем классе. private DisplayMetrics m_metrics;

 @Override 
    public void onMeasure(int width, int height) { 
     Log.println(Log.DEBUG, TAG, "onMeasure fired"); 
      Display m_display = getWindowManager().getDefaultDisplay(); 
     m_metrics = context.getResources().getDisplayMetrics(); 
     m_display.getMetrics(m_metrics); 
     screenWidth = m_display.getWidth(); 
     screenHeight = m_display.getHeight(); 
      super.onMeasure(screenWidth, screenHeight); 
    } 
+0

Спасибо за подсказку. К сожалению, он не вызывает onDraw, когда я его пробовал. – badgerduke

+0

Я пробовал и тестировал. Я получил его успешно, а также в моем логарифме он печатает сообщение, снятое onDraw. Попробуйте, скопировав мой код. – GrIsHu

Смежные вопросы