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;
}

Ссылка: /questions/22982080/poluchenie-znacheniya-tsveta-pikselya-tochki-v-predstavlenii-android-vklyuchayuschej-rastrovyij-holst/22982095#22982095

Основная причина, по которой каждый получает пустые значения, заключается в том, что представление не имеет размеров. Тогда все попытки с использованием 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();
    }

Другие вопросы по тегам