Android View.getDrawingCache возвращает ноль, только ноль
Кто-нибудь, пожалуйста, попытайтесь объяснить мне, почему
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!!!
}
ВСЕГДА регистрирует, что кэш чертежа равен нулю, и устанавливает растровое изображение в ноль?
Нужно ли рисовать вид до того, как будет установлен кеш?
Спасибо!
10 ответов
У меня была эта проблема также и нашел этот ответ:
v.setDrawingCacheEnabled(true);
// this is the important code :)
// Without it the view will have a dimension of 0,0 and the bitmap will be null
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false); // clear drawing cache
Если getDrawingCache
всегда returning null
ребята: используйте это:
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
Основная причина, по которой каждый получает пустые значения, заключается в том, что представление не имеет размеров. Тогда все попытки с использованием view.getWidth(), view.getLayoutParams(). Width и т. Д., Включая view.getDrawingCache () и view.buildDrawingCache (), бесполезны. Итак, вам нужно сначала установить размеры для вида, например:
view.layout(0, 0, width, height);
(Вы уже установили "ширину" и "высоту", как вам нравится, или получили их с помощью WindowManager и т. Д.)
Я использую это вместо этого.
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
}
});
Лучшая работа 4me
Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight());
screen.draw(canvas);
Если желаемое представление действительно отображается на экране, но оно возвращает ноль. Это означает, что вы ловите представление до того, как оконный менеджер его сгенерирует. Некоторые макеты очень сложны. Если макет включает в себя вложенные макеты, layout_weight..etc, он заставляет несколько раз ретранслировать, чтобы получить точный размер. Лучшее решение - дождаться, пока оконный менеджер завершит работу, а затем сделать снимок экрана. Попробуйте поместить getDrawingCache() в обработчик.
Ошибка может быть из-за того, что ваш View слишком большой, чтобы поместиться в кеш чертежа.
Я получил объяснение моей проблемы "View.getDrawingCache возвращает ноль" из моих журналов:
W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available
Документы Android также гласят: Устройства Android могут иметь всего 16 МБ памяти, доступной для одного приложения. Вот почему вы не можете загружать большие растровые изображения.
Я пытаюсь создать количество изображений динамически в зависимости от вида.
LayoutInflater infalter=(LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View addview=infalter.inflate(R.layout.barcode_image_list_row_item, null);
final ImageView imv=(ImageView) addview.findViewById(R.id.imageView1);
final TextView tv=(TextView) addview.findViewById(R.id.textView1);
try {
final Bitmap bitmap = encodeAsBitmap(""+value, BarcodeFormat.CODE_128, 600, 300);
if(bitmap !=null){
// TODO Auto-generated method stub
imv.setImageBitmap(bitmap);
tv.setText(value);
addview.setDrawingCacheEnabled(true);
// this is the important code :)
// Without it the view will have a dimension of 0,0 and the bitmap will be null
addview.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
addview.layout(0, 0, addview.getMeasuredWidth(), addview.getMeasuredHeight());
addview.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(addview.getDrawingCache());
addview.setDrawingCacheEnabled(false); // clear drawing cache
// saving the bitmap
savebarcode(b,value);
}else{
}
} catch (WriterException e) {
e.printStackTrace();
}
Я думаю, что этот код поможет кому-то..
Ответы @cV2 и @nininho работают для меня.
Одна из других причин, по которым я обнаружил трудный путь, заключалась в том, что мое представление генерировало представление, имеющее ширину и высоту 0 (т.е. представьте, что у вас есть TextView со строковым текстом пустой строки). В этом случае getDrawingCache вернет значение NULL, поэтому обязательно проверьте это. Надеюсь, что это поможет некоторым людям там.
Это простой и эффективный способ получить растровое изображение
public void addView(View v) {
v.setDrawingCacheEnabled(true);
v.buildDrawingCache();
Bitmap bitmap = v.getDrawingCache();
if(bitmap == null) {
// bitmap is null
// do whatever you want
} else {
setImageBitmap(bitmap);
}
v.setDrawingCacheEnabled(false);
v.destroyDrawingCache();
}