2013-03-27 8 views
12

Я хочу создать кнопку в Android с текстом и фоновым изображением. Фоновое изображение должно пересекать каждые X раз.Android TransitionDrawable с несколькими элементами

У меня есть работа с использованием TransitionDrawable с 2-мя изображениями.

Но я не могу заставить это работать с более чем двумя изображениями.

Что у меня есть:

В Java коде создать кнопку и установить фон (который является TransitionDrawable определено в XML). И я начинаю переход.

final Button b = new Button(getApplicationContext()); 
b.setTextColor(getResources().getColor(R.color.white)); 
b.setText("Some text"); 
b.setBackgroundDrawable(getResources().getDrawable(R.drawable.tile)); 
StateListDrawable background = (StateListDrawable) b.getBackground(); 
TransitionDrawable td = (TransitionDrawable) background.getCurrent(); 
td.startTransition(2000); 

В XML я определяю в tile.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
     <shape> 
      <solid 
       android:color="#449def" /> 
     </shape> 
    </item> 
    <item android:drawable="@drawable/transition"> 
     <shape> 
      <solid 
       android:color="#0000ff" /> 
     </shape> 
    </item> 
</selector> 

И, наконец, transition.xml

<?xml version="1.0" encoding="utf-8"?> 
<transition xmlns:android="http://schemas.android.com/apk/res/android"  android:oneshot="false"> 
    <item android:drawable="@drawable/desert"/> 
    <item android:drawable="@drawable/hydrangeas" /> 
    <item android:drawable="@drawable/jellyfish" /> 
</transition> 

Теперь эффект, что, когда я запустить приложение пустыни изображение отображается , Это изображение пересекает изображение гортензии, как должно. Но изображение медузы никогда не отображается.

В документе doc for TransitionDrawables указано, что вы можете указать более двух чертежей, но я не могу заставить это работать.

Я также попытался это без какого-либо XML, но в чистом JAVA, но это дало точно такую ​​же проблему :-(

+0

* В док для TransitionDrawables указано, что вы можете указать более 2 * вводимого коэффициента - вы можете предоставить ссылку на где это сказано? – Luksprog

+0

http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html#TransitionDrawable (android.graphics.drawable.Drawable []) Это означает, что для этого можно использовать как минимум 2 слоя работать должным образом.". Как сказано в моем оригинальном посте, я также пробовал все в чистом Java-коде (таким образом, используя этот конструктор), но это имело точно такую ​​же проблему. – Knarf

+1

Плохой выбор слов. Я просто посмотрел на код для «TransitionDrawable», и он только исчезает между двумя чертежами, каждый другой слой игнорируется. – Luksprog

ответ

3

Вы можете сделать это с помощью обработчика

mAnimateImage is your button 

int DrawableImage[] = {R.drawable.back_red, R.drawable.back_green, R.drawable.back_purple}; 

final Handler handler = new Handler(); 
    final int[] i = {0}; 
    final int[] j = {1}; 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Resources res = getApplicationContext().getResources(); 
        TransitionDrawable out = new TransitionDrawable(new Drawable[]{res.getDrawable(DrawableImage[i[0]]), res.getDrawable(DrawableImage[j[0]])}); 
        out.setCrossFadeEnabled(true); 
        mAnimateImage.setBackgroundDrawable(out); 
        out.startTransition(4000); 
        i[0]++; 
        j[0]++; 
        if (j[0] == DrawableImage.length) { 
         j[0] = 0; 
        } 
        if (i[0] == DrawableImage.length) { 
         i[0] = 0; 
        } 
        handler.postDelayed(this, 8000); 
       } 
      }); 
     } 
    }, 0); 
+0

Отлично! Только одно: из-за усталости подумайте о замене getDrawable на ContextCompat.getDrawable –

+0

yes thanx @MohitSingh –

6

Согласно официальной документации, TransitionDrawable может только Затенение между 2 слоями, цитатами из официального андроида ссылка.

расширение LayerDrawables, который предназначен для плавного перехода между первым и вторым слоем. для того, чтобы начать переход, вызовите startTransition (INT). чтобы отобразить только первый слой, вызовите resetTransition ().

Если вы не прочитали его внимательно, так как он расширяет LayerDrawables, который может иметь несколько уровней, можно ожидать, что вы сможете пересечь слои из N слоев. Но это очень ясно, startTransition показывает второй уровень, resetTransition показывает первый.

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

+0

На самом деле, что для меня происходит, так это то, что он воспроизводит первый переходный тон, а затем, когда я снова вызываю startTransition, он перескакивает к первому извлекаемому и переходит обратно ко второму. – CaseyB

+2

Вы правы! Я просмотрел документацию и обновил ответ. Документировано, что он работает только с двумя слоями. – shalafi

4

в добавлении время работы вы можете динамически менять изображения

Использование td.setDrawableByLayerId (td.getId (1), рисуем) на вашем TransitionDrawable

TransitionDrawable transitionDrawable = (TransitionDrawable) myImage 
          .getDrawable(); 
transitionDrawable.setDrawableByLayerId(transitionDrawable.getId(1), getResources() 
          .getDrawable(R.drawable.c)); 
1

Вы можете только переходный максимум два изображения с TransitionDrawable. Чтобы работать с более чем двумя изображениями, вы можете расширить LayerDrawable и реализовать свой собственный TransitionDrawable.

Here's Готовая реализация пользовательских TransitionDrawable для работы с более чем двумя изображениями.

Вы можете увидеть полный образец вместе с демо-версией gif here on Github.

Смежные вопросы