Подтвердить что ты не робот

Android 2.1 Просмотр метода getDrawingCache() всегда возвращает значение null

Я работаю с Android 2.1 и имею следующую проблему: Использование метода View.getDrawingCache() всегда возвращает null. getDrawingCache() должен возвращать растровое изображение, которое представляет собой представление содержимого View.

Пример кода:

public void onCreate(final Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  final View view = findViewById(R.id.ImageView01);
  view.setDrawingCacheEnabled(true);
  view.buildDrawingCache();
  final Bitmap bmp = view.getDrawingCache();
  System.out.println(bmp);

}

Я уже пробовал разные способы настроить объект View для создания кэша чертежа (например, View.setWillNotDraw(boolean) и View.setWillNotCacheDrawing(boolean)), но ничего не работает.

Каков правильный путь или что я делаю неправильно?

PS: В реальном коде я хочу применить getDrawingCache() в ViewGroup, например RelativeLayout. Является ли поведение одинаковым при использовании ViewGroup?

4b9b3361

Ответ 1

Bitmap screenshot;
view.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

Вам нужно Bitmap.createBitmap(view.getDrawingCache());, так как битмап, из которого получена ссылка getDrawingCache(), получает рециркуляцию.

Ответ 2

использовать

onLayout(x, y, width, height);

для ex:

onLayout(0, 0, 100, 100);

перед вызовом getDrawingCache

Ответ 3

Никогда не делайте этого в onCreate! Вы можете сделать это в View.onClickListener или в другом месте.

Ответ 4

Я знаю, что это не отвечает на ваш вопрос, но....

Так же, как и другие разработчики, читающие это, если то, что вы действительно пытаетесь сделать, это получить доступ к содержимому пользовательского представления, получить свой пользовательский вид из ImageView. А затем создайте холст и растровое изображение, которое вы собираетесь контролировать/рисовать/читать и использовать setImageBitmap(), чтобы установить растровое изображение в объект вида. Оттуда вы можете игнорировать холст, переданный вам в методе onDraw (canvas), и просто вставлять в ваш локальный холст/растровое изображение.

Зачем вам это нужно? По моему мнению, в классе Canvas есть надзор. Класс Canvas не дает вам возможности прочитать содержимое холста и не попасть в растровое изображение. Поэтому, если вам когда-либо нужно читать из растрового изображения, например, для получения дампа изображения содержимого представления, я не знаю, как это сделать, кроме метода, описанного выше.

Это не будет работать для проблемы RelativeView, описанной здесь в этом потоке, но это может заинтересовать новых разработчиков Android.

Ответ 5

Насколько я прочитал последние дни в документации, вы должны использовать только setDrawingCacheEnabled или buildDrawingChache(), но не оба.

Ответ 6

была та же проблема, и, наконец, это частично работает для меня:

view.layout(0, 0, 1000, 100);
Bitmap b = view.getDrawingCache();
try {
    b.compress(CompressFormat.JPEG, 95,
    new FileOutputStream( Environment.getExternalStorageDirectory()                                                            + "/folder/name.jpg"));
catch (FileNotFoundException e) {
    Log.e(LOGTAG, "error:" + e.getMessage());
    }

Единственная проблема заключается в том, что я не могу получить полные размеры моего представления. view.getwidth возвращает null...