Я работаю с 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?
Bitmap screenshot; view.setDrawingCacheEnabled(true); screenshot = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false);
Вам нужно Bitmap.createBitmap(view.getDrawingCache());
Так как битмап, с которого получена ссылка getDrawingCache()
перерабатывается.
использование
onLayout(x, y, width, height);
Например:
onLayout(0, 0, 100, 100);
Перед вызовом getDrawingCache
Никогда не делайте этого в onCreate! Вы можете сделать это в View.onClickListener или в другом месте.
Я знаю, что это не отвечает на ваш вопрос, но …
Так же, как и другие разработчики, читающие это, если то, что вы действительно пытаетесь сделать, это доступ к содержимому пользовательского представления, вы получите свое собственное представление из ImageView. А затем создайте холст и растровое изображение, которое вы собираетесь контролировать / рисовать / читать и использовать setImageBitmap (), чтобы установить растровое изображение в объект вида. Оттуда вы можете игнорировать холст, переданный вам в методе onDraw (canvas), и просто вставлять в ваш локальный холст / растровое изображение.
Зачем вам это нужно? По моему мнению, в классе Canvas есть надзор. Класс Canvas не дает вам возможности прочитать содержимое холста и не попасть в растровое изображение. Поэтому, если вам когда-либо нужно читать из растрового изображения, например, чтобы получить дамп изображения содержимого представления, я не знаю, как это сделать, кроме метода, описанного выше.
Это не будет работать для проблемы RelativeView, описанной здесь в этом потоке, но это может представлять интерес для новых разработчиков Android.
Насколько я прочитал последние дни в документации, вы должны использовать только setDrawingCacheEnabled или buildDrawingChache (), но не оба.
Была та же проблема, и, наконец, это частично работает для меня:
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 …
Проверьте, не превышает ли ваш размер размер экрана. Я нашел это и переключил размеры моего представления так, теперь он работает =) Android get full View as Bitmap