Пользовательский интерфейс Android: TransitionDrawable - PullRequest
2 голосов
/ 31 декабря 2010

Каков предполагаемый способ использования TransitionDrawable в коде?Какие-нибудь примеры?

Я создал небольшое тестовое приложение для создания некоторого контекста:

public class SkeletonActivity extends Activity {
    private Button b;
    private ImageView iv;
    private TransitionDrawable transition;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Inflate our UI from its XML layout description.
        setContentView(R.layout.skeleton_activity);

        // Hook up button presses to the appropriate event handler.
        b = ((Button) findViewById(R.id.button));
        b.setOnClickListener(mButtonListener);
        iv = ((ImageView) findViewById(R.id.image));

        //XML-based code
        transition = (TransitionDrawable)getResources().getDrawable(R.drawable.trans).mutate();
        transition.setDrawableByLayerId(transition.getId(0), getResources().getDrawable(R.drawable.trans3));
        transition.setDrawableByLayerId(transition.getId(1), getResources().getDrawable(R.drawable.trans4));

        //Pure programmatic code
        transition = new TransitionDrawable(new Drawable[] {getResources().getDrawable(R.drawable.trans3), getResources().getDrawable(R.drawable.trans4)});

        transition.setCrossFadeEnabled(true);
    }

    OnClickListener mButtonListener = new OnClickListener() {
        public void onClick(View v) {
            iv.setImageDrawable(transition);
            transition.startTransition(5000);
        }
    };
}

и мой XML-файл TransitionDrawable выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/trans1" />
    <item android:drawable="@drawable/trans2" />
</transition>

Давайте сначала запустимс частью кода на основе XML (что означает закомментирование строки программного кода Pure).

Если вы запустите этот код и нажмете кнопку, то вы увидите, что изображение меняется с trans1 на trans4, а не сtrans3.Почему не заменяется начальный объект рисования?

Весь метод setDrawableByLayerId () сбивает с толку.В конструкторе вы бы указали список Drawables, который входит в LayerDrawable.Я полагаю, это то, что называется индексами.Тогда что такое id, если это не такой индекс?

Я попытался добавить атрибуты android: id в теги "item".Пока этот код собирается, он не запускается.Таким образом, id - это не тот идентификатор, который у вас обычно был бы.

Возможно, это резиденция текущего нарисованного в этой позиции?Это тоже не похоже.

Идентификатор - это просто некоторое число (возможно, это имеет значение в LayerDrawable), которое можно установить с помощью setId (index, id) и получить с помощью getId (index).По умолчанию идентификаторы не назначаются.И вы не можете зарезервировать ни один для слоев, которые еще не были добавлены.В моем коде оба вызова getId () возвращают -1, поэтому при использовании setDrawableByLayerId (-1, ...) придерживается только последний.Действительно, комментирование последней строки дает другое поведение, давая переход от trans1 к trans3.

Как я могу изменить первый нарисованный слой?Я должен добавить следующий код перед setDrawableByLayerId ().Даже когда я нигде не использую 50 или 51.Это заставляет его переходить от транс3 к транс4.

transition.setId(0, 50);
transition.setId(1, 51);

Что плохого в моих представлениях о том, что я должен сделать это настолько сложным, чтобы заставить его работать?

Что я действительно хотел сделатьв моем реальном приложении не было никакого кода XML, я не вижу смысла в этом.Я также хотел бы сначала добавить в первый слой и только позже, после создания, добавить второй слой, но мы продолжим с этим позже.

Давайте попробуем чистый программный код.Это эквивалентно.На самом деле он сразу вставляет нужные Drawables.

Теперь в этом примере приложения он дает тот же результат.Однако в моем приложении (из которого соответствующий код слишком сложен для публикации здесь) у меня все еще есть проблема:

Если я попытаюсь с предварительно запрограммированными Drawables из указанного в xml перехода, я получу, что getResources ().getDrawable (R.drawable.trans) второй раз возвращает ноль:

12-30 21:35:32.970: ERROR/AndroidRuntime(7457): java.lang.NullPointerException
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:581)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.TransitionDrawable$TransitionState.<init>(TransitionDrawable.java:235)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.TransitionDrawable.createConstantState(TransitionDrawable.java:99)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.LayerDrawable.<init>(LayerDrawable.java:94)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.TransitionDrawable.<init>(TransitionDrawable.java:90)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.TransitionDrawable.<init>(TransitionDrawable.java:39)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.graphics.drawable.TransitionDrawable$TransitionState.newDrawable(TransitionDrawable.java:245)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.content.res.Resources.getCachedDrawable(Resources.java:1753)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.content.res.Resources.loadDrawable(Resources.java:1664)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at android.content.res.Resources.getDrawable(Resources.java:581)
12-30 21:35:32.970: ERROR/AndroidRuntime(7457):     at net.lp.collectionista.ui.views.CoverView.updateCover(CoverView.java:78)

Что мне здесь не хватает?Что-то с отсутствующим mutate ()?

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

transition = new TransitionDrawable(new Drawable[] {<1>});

с прохождением только одного слоя.Однако я не могу сделать setId () на новом слое, поэтому я не могу добавить новый слой позже (хотя чтение документации для setDrawableByLayerId () заставит вас поверить, что вы можете).

Передача вВторой слой сразу, с помощью массива 2 со вторым элементом null, наказывается, так что я просто передам тот же самый чертеж, что и первый слой.

Все, что я пропустил здесь имог бы сделать проще?

1 Ответ

4 голосов
/ 17 августа 2013

Я рекомендую просто создать новый TransitionDrawable вместо "изнасилования" вашего старого.Я делаю это все время:

Вот мой фрагмент кода, который создает TransitionDrawable для кнопки обмена:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...