Кто-нибудь, пожалуйста, попытайтесь объяснить мне, почему
public void addView(View child) {
child.setDrawingCacheEnabled(true);
child.setWillNotCacheDrawing(false);
child.setWillNotDraw(false);
child.buildDrawingCache();
if(child.getDrawingCache() == null) { //TODO Make this work!
Log.w("View", "View child's drawing cache is null");
}
setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!!
}
ВСЕГДА регистрирует, что кеш рисования имеет значение NULL, и устанавливает для растрового изображения значение NULL?
Должен ли я рисовать представление до того, как будет установлен кеш?
Спасибо!
getDrawingCache()
View#draw
Canvas
Ответы:
У меня тоже была эта проблема, и я нашел этот ответ:
источник
если
getDrawingCache
всегда,returning null
ребята: используйте это:Ссылка: https://stackoverflow.com/a/6272951/371749
источник
getLayoutParams
вместо v.getWidth () и v.getHeight ()?ImageView
еще не получили изображение, поэтому кажется, что это будет 0. Это будет по-разному для кода разных людей, но убедитесь, что ваш вызовloadBitmapFromView()
определенно после вашImageView
содержит изображение.Основная причина получения нулевых значений в том, что представление не имеет размеров. Тогда все попытки с использованием view.getWidth (), view.getLayoutParams (). Width и т.д., включая view.getDrawingCache () и view.buildDrawingCache (), бесполезны. Итак, вам нужно сначала установить размеры для вида, например:
(Вы уже установили "ширину" и "высоту" по своему усмотрению или получили их с помощью WindowManager и т. Д.)
источник
Я использую это вместо этого.
источник
Работай лучше всего 4me
источник
Если вид, который вы хотите поймать, действительно отображается на экране, но возвращает значение null. Это означает, что вы ловите представление до того, как оконный менеджер его сгенерирует. Некоторые макеты очень сложные. Если макет включает вложенные макеты, layout_weight..etc, это заставляет ретранслятор несколько раз получить точный размер. Лучшее решение - дождаться завершения работы оконного менеджера, а затем сделать снимок экрана. Попробуйте в обработчике поставить getDrawingCache ().
источник
Ответы @ cV2 и @ nininho работают для меня.
Одна из других причин, по которой я узнал на собственном горьком опыте, заключалась в том, что представление, которое у меня было, генерировало представление с шириной и высотой 0 ( т.е. представьте, что у меня есть TextView со строковым текстом пустой строки ). В этом случае getDrawingCache вернет null, поэтому обязательно проверьте это. Надеюсь, что это поможет некоторым людям.
источник
Ошибка может быть из-за того, что ваш вид слишком велик, чтобы поместиться в кеш чертежа .
Я получил объяснение моей проблемы "View.getDrawingCache возвращает null" из моих журналов:
В документации по Android также говорится : на устройствах Android для одного приложения может быть доступно всего 16 МБ памяти. Вот почему вы не можете загружать большие растровые изображения.
источник
Я пытаюсь создать n изображений динамически в зависимости от вида.
Думаю, этот код кому-то поможет ..
источник
Это простой и эффективный способ получить растровое изображение
источник