Подтвердить что ты не робот

IllegalArgumentException: ширина и высота должны быть> 0 при загрузке Bitmap из View

Я пытаюсь использовать ImageViewTouch, библиотеку, которая позволяет масштабировать масштабирование. Я могу рисовать изображение с помощью Canvas, но когда я увеличиваю изображение, рисунок исчезает.

Для этого я пытаюсь преобразовать представление в растровое изображение и установить для этого же представления значениеImageBitmap. Здесь код:

mImage.setDrawPath(true);
mImage.setImageBitmap(loadBitmapFromView(mImage)); 

public static Bitmap loadBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap( v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);                
        Canvas c = new Canvas(b);
        v.layout(0, 0, v.getWidth(), v.getHeight());
        v.draw(c);
        return b;
}

Когда я это сделаю, я получаю следующую ошибку журнала:

07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be > 0
07-11 21:13:41.567: E/AndroidRuntime(20056):    at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
07-11 21:13:41.567: E/AndroidRuntime(20056):    at android.graphics.Bitmap.createBitmap(Bitmap.java:620)

Если я удаляю вызов loadBitmapFromView, обычно рисунок отображается над изображением. Когда я пытаюсь выполнить какое-либо взаимодействие с изображением (например, масштабирование или выключение), рисунок исчезает, восстанавливая только фоновое изображение, которое представляет собой изображение.

--- EDIT ---

Вот еще один код, помещенный после вызова loadBitmapFromView. Дело в том, что у меня есть радиослушатель, и когда я проверяю какой-то переключатель, мне приходится загружать изображение и рисовать над ним рисунки. Затем я пытаюсь преобразовать все (изображение и чертежи) в одно растровое изображение.

Здесь находится другая часть кода:

bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y);
mImage.setImageBitmap(bitmap);

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

the decodeSampledBitmapFromResource метод, который я получил из этой ссылки на разработчиков Android http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

4b9b3361

Ответ 1

Наконец-то я нашел решение для своей проблемы.

Я использую метод post для представления, который будет выполняться только после измерения и компоновки, таким образом getWidth() и getHeight() возвращает фактическую ширину и высоту.

Здесь пример кода:

mImage.post(new Runnable() {
    @Override
    public void run() {
        mImage.setImageBitmap(loadBitmapFromView(mImage));
    }
});

Надеюсь, это также поможет кому-то еще:)

Ответ 2

Если все остальное верно, вы слишком рано выполняете свой код.

Макет представления еще не измерен Android. Попробуйте выполнить в OnResume только для того, чтобы убедиться, что это ваша проблема.

Ура!

Ответ 3

java.lang.IllegalArgumentException: width and height must be > 0 заключается в том, что в вашем Bitmap.createBitmap() вызове v.getLayoutParams().width или v.getLayoutParams().height равен 0. Вероятно, LayoutParams неправильно установлены в mImage.

Обновление: setLayoutParams() для mImage перед использованием createBitmap(). Что-то вроде этого:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30);
mImage.setLayoutParams(layoutParams);

Ответ 4

В моем случае я забыл установить orientation в vertical для parent LinearLayout и значение по умолчанию horizontal было установлено, поэтому я установил его, и моя проблема исчезла...

android:orientation="vertical"