Android View.getDrawingCache возвращает null, только null

Кто-нибудь, пожалуйста, попытайтесь объяснить мне, почему

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?

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

Благодаря!

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

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

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

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

Если представление, которое вы хотите уловить, действительно отображается на экране, но оно возвращает null. Это означает, что вы поймаете представление до того, как оконный менеджер сгенерирует его. Некоторые макеты очень сложны. Если в макет входят вложенные макеты, layout_weight..etc, он вызывает несколько раз ретрансляцию, чтобы получить точно размер. Лучшее решение ждет, пока оконный менеджер закончит работу, а затем получит снимок экрана. Попробуйте поместить 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); 

Ответы @ cV2 и @ nininho работают для меня.

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

Я пытаюсь создать 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(); } 

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

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

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

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

В документах Android также говорится : Android-устройства могут иметь всего 16 МБ памяти для одного приложения. Вот почему вы не можете загружать большие растровые изображения.

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

 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(); } 
  • Экспорт и запуск проекта Unity3D в Android Studio
  • Обозреватель Android runOnUiThread
  • Как использовать карту google V2 внутри fragmentа?
  • Как обмениваться фотографиями с помощью CAPTION через Android?
  • Поместите неопределенный прогресс в качестве нижнего колонтитула в сетке RecyclerView
  • Android: getSupportActionBar () всегда возвращает null в библиотеке ActionBarSherlock
  • Прозрачная строка состояния, не работающая с windowTranslucentNavigation = "false"
  • Как настроить listview с помощью baseadapter
  • Выбор нескольких элементов в ListView
  • RadioButton - как использовать пользовательский ansible?
  • Откройте изображение с помощью URI в средстве просмотра изображений галереи по умолчанию в Android
  • Давайте будем гением компьютера.