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?
Должен ли я нарисовать представление до того, как будет установлен кеш?
- Как ограничить доступ к API конечных точек Google App Engine только для моих приложений для Android?
- Лучший способ реализовать View.OnClickListener в android
- Как создать диалоговое окно без заголовка?
- получить последний fragment в backstack
- Ошибка: com.android.tools.aapt2.Aapt2Exception: ошибка AAPT2: проверить журналы для получения более подробной информации
Благодаря!
- Google Maps Android API v2 - обнаружение касания на карте
- Камера PhoneGap перезапускает приложение
- Несовместимые плагины для android-apt после обновления до Android Studio 2.3
- Как динамически загружать Java-class на android / dalvik?
- Android GCM отправлен успешно, но не принят на некоторых устройствах
- Как проверить текущие запущенные приложения на Android?
- Как я могу получить данные из firebase на мой адаптер
- Активность запуска Android от службы
У меня тоже была эта проблема, и я нашел этот ответ:
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; }
Основная причина, по которой вы получаете 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(); }