Когда вы создаете LiveWallpaper в Android 2.2+, вы получаете холст (или любой другой 3D-эквивалент) для рисования. Я хотел бы рисовать некоторые элементы с помощью встроенных инструментов пользовательского интерфейса Android, а не создавать все с нуля, используя команды холста или загрузку предварительно обработанного растрового изображения пользовательского интерфейса.
Преобразование одного представления в растровое изображение работает нормально. то есть это прекрасно работает:
// For example this works:
TextView view = new TextView(ctx);
view.layout(0, 0, 200, 100);
view.setText("test");
Bitmap b = Bitmap.createBitmap( 200, 100, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
view.draw(tempC);
c.drawBitmap(b, 200, 100, mPaint);
Но преобразование LinearLayout с дочерними элементами вызывает проблемы. Вы только получаете сам LinearLayout и ни один из его дочерних элементов. Например, если я задаю для LinearLayout белый фон, я получаю хорошо отрисованное белое поле, но ни один из дочерних элементов TextView не находится в растровом изображении. Я также пытался использовать DrawingCache с аналогичными результатами.
Код, который я использую, представляет собой пример куба с единственными изменениями, заключающимися в дополнительной команде рисования. LinearLayout отлично работает как тост или как обычный вид (т.е. все хорошо отображается), на LiveWallpaper все, что я получаю, это визуализированный фон LinearLayout.
inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = (LinearLayout) inflater.inflate(com.example.android.livecubes.R.layout.testLinearLayout, null);
layout.layout(0, 0, 400, 200);
Bitmap b = Bitmap.createBitmap( 400, 200, Bitmap.Config.ARGB_8888);
Canvas tempC = new Canvas(b);
layout.draw(tempC);
c.drawBitmap(b, 10, 200, mPaint);
Кто-нибудь знает, нужно ли вам делать что-то особенное, чтобы дети правильно отображались в моем растровом изображении? то есть мне нужно как-то сделать что-то особенное, чтобы макет отображал остальные дочерние элементы? Должен ли я написать функцию, которая рекурсивно что-то делает со всеми дочерними элементами?
Я мог бы скомпоновать все сам, но, поскольку отображение довольно статично (т.е. я рисую это один раз и сохраняю копию растрового изображения для рисования на фоне), это кажется мне проще и все же довольно эффективно.
Редактировать: При более глубоком изучении состояния макета кажется, что макет не продвигается вниз по дереву представления (т.е. LinearLayout вычисляет свой макет, когда я вызываю layout(), но дочерние элементы имеют нулевой (0x0) размер). Согласно сообщению Romain Guy в 2008 году сообщение разработчика Android . Вам нужно дождаться прохождения макета или форсировать макет самостоятельно. Проблема в том, как я могу дождаться прохождения макета от механизма обоев для LinearLayout, который не подключен к корневой группе просмотра? И как я могу вручную разместить каждый дочерний элемент, если макет требует, чтобы вы установили левый, верхний, правый, нижний, когда я не знаю, какими они должны быть.
Я пытался вызывать forceLayout для детей, но это тоже не помогает. Я не уверен, как фреймворк макета работает за кулисами (помимо того, что он делает двухпроходный макет). Есть ли способ вручную заставить его выполнить макет, то есть прямо сейчас? Поскольку это не действие, я не думаю, что многие обычные фоновые вещи происходят так, как мне хотелось бы.