android — Android View.getDrawingCache возвращает ноль, только ноль" />

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

ВСЕГДА регистрирует, что кэш чертежа равен нулю, и устанавливает растровое изображение в ноль?

Нужно ли рисовать вид до того, как будет установлен кеш?

Спасибо!

90 голосов | спросил Bex 26 FebruaryEurope/MoscowbFri, 26 Feb 2010 07:06:27 +0300000000amFri, 26 Feb 2010 07:06:27 +030010 2010, 07:06:27

8 ответов


0

У меня тоже была эта проблема, и я нашел ответ:

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
ответил Marcio Covre 6 Jpm1000000pmThu, 06 Jan 2011 20:58:12 +030011 2011, 20:58:12
0

если 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;
}

Ссылка: https://stackoverflow.com/a/6272951/371749

ответил cV2 13 PM00000070000001531 2012, 19:25:15
0

Я использую это вместо этого.

myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
        }
    });
ответил Tyro 2 J0000006Europe/Moscow 2015, 13:47:15
0

Если желаемое представление действительно отображается на экране, но оно возвращает ноль. Это означает, что вы ловите представление до того, как оконный менеджер его сгенерирует. Некоторые макеты очень сложны. Если макет включает в себя вложенные макеты, layout_weight..etc, он заставляет несколько раз ретранслировать, чтобы получить точный размер. Лучшее решение - дождаться, пока оконный менеджер завершит работу, а затем сделать снимок экрана. Попробуйте поместить getDrawingCache () в обработчик.

ответил Kislingk 16 Mayam13 2013, 01:42:21
0
Ответы

@ cV2 и @ nininho работают на меня.

Одна из других причин, по которым я выяснил трудный путь, заключалась в том, что мое представление генерировало представление с шириной и высотой 0 ( т.е. представьте, что у вас есть TextView со строковым текстом пустой строки) ). В этом случае getDrawingCache вернет значение NULL, поэтому обязательно проверьте это. Надеюсь, что это поможет некоторым людям.

ответил Bundeeteddee 27 J0000006Europe/Moscow 2015, 10:46:46
0

Я пытаюсь создать n изображений динамически в зависимости от вида.

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

Я думаю, что этот код поможет кому-то ..

ответил Harish 1 AMpFri, 01 Apr 2016 10:39:47 +030039Friday 2016, 10:39:47
0

Ошибка может быть связана с тем, что ваш вид слишком большой, чтобы поместиться в кеш чертежа .

Я получил объяснение моей проблемы "View.getDrawingCache возвращает null" из моих журналов:

W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available

Документы для Android также говорит : Устройства Android могут иметь всего 16 МБ памяти, доступной для одного приложения. Именно поэтому вы не можете загружать большие растровые изображения.

ответил Yuliia Ashomok 13 PMpWed, 13 Apr 2016 14:02:00 +030002Wednesday 2016, 14:02:00
0

Это простой и эффективный способ получить растровое изображение

 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();
    }
ответил B2N 4 MonEurope/Moscow2017-12-04T10:51:44+03:00Europe/Moscow12bEurope/MoscowMon, 04 Dec 2017 10:51:44 +0300 2017, 10:51:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132