Использование ресурсов макета в LiveWallpaper на Android

Когда вы создаете LiveWallpaper в Android 2.2+, вы получаете холст (или любой другой его трехмерный эквивалент) для рисования. Я бы хотел нарисовать некоторые элементы с помощью встроенных инструментов пользовательского интерфейса 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 не находится в Bitmap. Я также пробовал использовать 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);

Кто-нибудь знает, нужно ли вам делать что-то особенное, чтобы отрисовать дочерние элементы правильно к моему растровому изображению? т.е. мне нужно как-то сделать что-то особенное, чтобы макет отображал остальных дочерних элементов? Должен ли я написать функцию, чтобы рекурсивно что-то делать со всеми дочерними элементами?

Я мог бы составить все самостоятельно, но, поскольку отображение довольно статично (т. Е. Я рисую это один раз и сохраняю копию растрового изображения для рисования на фоне) это кажется мне проще и все же довольно эффективно.

Изменить:

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);

Кто-нибудь знает, нужно ли вам делать что-то особенное, чтобы потомки правильно отображались в моем растровом изображении? т.е. мне нужно как-то сделать что-то особенное, чтобы макет отображал остальных дочерних элементов? Должен ли я написать функцию, чтобы рекурсивно что-то делать со всеми дочерними элементами?

Я мог бы составить все самостоятельно, но, поскольку отображение довольно статично (т. Е. Я рисую это один раз и сохраняю копию растрового изображения для рисования на фоне) это кажется мне проще и все же довольно эффективно.

Изменить:

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)). Согласно сообщению Ромена Гая в 2008 г. сообщение разработчика Android . Вы должны дождаться завершения макета или самостоятельно настроить макет. Проблема в том, как я могу дождаться прохода макета от движка обоев для LinearLayout, который не прикреплен к корневой группе представлений? И как я могу вручную расположить каждый дочерний элемент, если макет требует, чтобы вы установили левый, верхний, правый, нижний, когда я не знаю, какими они должны быть.

Я пробовал вызвать forceLayout для дочерних элементов, но это не так? похоже, тоже не помогает. Я' m не уверен, как структура макета работает за кулисами (кроме того, что это двухпроходный макет). Есть ли способ вручную заставить его пройти разметку, то есть прямо сейчас? Поскольку это не Activity, я не думаю, что многие обычные фоновые вещи происходят так, как мне бы хотелось.

5
задан William 14 November 2010 в 20:07
поделиться