Может ли ширина и высота быть нулевыми в процедурах рисования? - PullRequest
1 голос
/ 14 марта 2012

Сегодня я получил отчет о сбое, потому что в следующем фрагменте w и / или h равны нулю. Я перезаписываю dispatchDraw на своем обычном ViewGroup, чтобы нарисовать наложение после рисования детей:

@Override
public void dispatchDraw(Canvas canvas) {
  super.dispatchDraw(canvas);
  int w = getWidth();
  int h = getHeight();
  bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
  // ...
}

Я внимательно прочитал документацию и, честно говоря, не могу понять, почему я должен беспокоиться о размере вида, потому что, когда система запрашивает чертеж, все виды должны быть уже выложены (а это не так). Не имеет смысла рисовать вид, если размер равен нулю). Более того, эту ошибку трудно отследить, потому что я не могу ее воспроизвести и потому что у меня есть только 2 отчета о сбоях при загрузке более 200 тыс. Что не так и как мне его восстановить?

ПРОЧИТАЙТЕ Я знаю, что проблема в том, что widht и высота равны 0. Вопрос почему они равны нулю после того, как дерево было выложено . Каждому фрагменту кода для рисования нужна примитивная информация, такая как ширина и высота, поэтому глупо, чтобы я проверял, чтобы они были ненулевыми каждый раз, когда я переопределяю onDraw или dispatchDraw. Это должно быть обработано системой, и большую часть времени, так как я никогда не был в состоянии воспроизвести эту ошибку и получил только два отчета о сбое

Ответы [ 2 ]

0 голосов
/ 25 июня 2012

Видимо, они могут.Не существует безопасного предохранителя от ширины или высоты, равной нулю.Поэтому, когда кто-то использует их для вычисления координат для рисования, необходимо обратить внимание и проверить правильность размеров.

На самом деле, поскольку у представления с шириной / высотой, равной нулю, действительно нет места для отображения чего-либо, я используюэтот простой кусок кода, чтобы пропустить процедуры рисования

@Override
public void onDraw(Canvas canvas)
  if (getWidth() == 0 || getHeight() == 0)
    return;
  // rest of the code...
0 голосов
/ 14 марта 2012

Метод Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) выдает IllegalArgumentException, если ширина или высота
Читайте здесь: http://developer.android.com/reference/android/graphics/Bitmap.html#createBitmap%28int,%20int,%20android.graphics.Bitmap.Config%29
Вы должны использовать оператор try{}catch(){}

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