Метод getDrawingCache () в Android 2.1 View всегда возвращает нуль - PullRequest
13 голосов
/ 12 мая 2010

Я работаю с Android 2.1 и имею следующую проблему: Использование метода View.getDrawingCache () всегда возвращает ноль. 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?

Ответы [ 7 ]

17 голосов
/ 18 января 2011
Bitmap screenshot;
view.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

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

5 голосов
/ 12 мая 2010

использование

onLayout(x, y, width, height);

Например:

onLayout(0, 0, 100, 100);

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

2 голосов
/ 20 июля 2012

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

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

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

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

2 голосов
/ 09 июня 2011

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

0 голосов
/ 08 декабря 2011

Проверьте, не превышает ли ваш размер экрана размер экрана. Я нашел это и переключил размеры моего взгляда так, теперь это работает =) Android получить полный просмотр в виде растрового изображения

0 голосов
/ 09 октября 2011

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

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 возвращает ноль ...

0 голосов
/ 12 мая 2010

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

...