Использование макета с холстом или указание цвета фона с фоном, который можно нарисовать на холсте - PullRequest
0 голосов
/ 23 октября 2011

Я создаю небольшую игру для задания по программированию.Я пытаюсь понять, как правильно установить фон, но я не могу понять.

У меня есть две линейные компоновки в моем main.xml;у одного фоновый цвет, а у другого макета внутри фоновое изображение (прозрачный PNG).Когда я запускаю приложение, оно отображается нормально:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#aacceeff"
    >

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    >

 </LinearLayout>

</LinearLayout>

Однако теперь мне нужно добавить анимацию.Для этого я создал объект View, который загружает изображения и анимирует их.Однако теперь мне нужно установить представление содержимого из основного действия на экземпляр этого нового объекта представления.Когда я это делаю, я получаю исключение нулевого указателя, потому что он не может найти линейный макет с идентификатором background:

BitmapDrawable tiledBackground = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.background));
LinearLayout backgroundLayout = (LinearLayout) findViewById(R.id.background);
tiledBackground.setTileModeX(Shader.TileMode.REPEAT);
backgroundLayout.setBackgroundDrawable(tiledBackground); //backgroundLayout is null

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

Наверное, я пытаюсь понять, как заставить пользовательское представление использовать макет, который я определил в main.xmlили найдите способ указать цвет фона и фона, который можно нарисовать для пользовательского представления.

Ответы [ 2 ]

1 голос
/ 23 октября 2011

Мне удалось решить эту проблему с помощью цветового фильтра:

super(context);

BitmapDrawable tiledBackground = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.background));
tiledBackground.setTileModeX(Shader.TileMode.REPEAT);

//I determined the PorterDuff.Mode value mainly through trial and error
tiledBackground.setColorFilter(0xaacceeff, PorterDuff.Mode.DARKEN);

this.setBackgroundDrawable(tiledBackground)
0 голосов
/ 23 октября 2011

Когда вы используете метод findViewById, вы ищете макет или представление из layout.xml, который вы указываете в методе setContentView.

Так что если вы вызываете setContentView и устанавливаете другой файл xml в качестве макета, тогдавы не сможете найти представление из предыдущего макета.

В идеальных случаях setContentView вызывается только один раз для действия.Новые действия называются для разных экранов.Но вы также вызываете класс ViewFlipper, вы можете добавить оба макета в качестве его дочерних элементов.Это покажет только 1 ребенок за один раз.Чтобы показать следующего ребенка, вы можете использовать

viewflipper.setDisplayChild(1);
...