2013-08-15 14 views
5

pracuję nad aplikacji, która potrzebuje obraz cross-fading między wieloma obrazami,Android - Przenikanie mutiple zdjęć w ImageView

co mam: jest ImageView i 50 kanału alfa (.png), które będę pobrać z Chmura

Czego chcę: 50 odkształcalne powinny płynne przejście (fade in i out) kolejno między odstępie kilku sekund

Co próbowałem: w oparciu o niektóre odpowiedzi tutaj na StackOverflow, próbowałem technikę TransitionDrawable, ale Mogłem tylko przeniknąć między dwoma obrazami, a nie więcej, i to z touchi ng.

wideo I, o którym mowa: https://www.youtube.com/watch?v=atH3o2uh_94

Odpowiedz

-1

następnie stworzyć swój własny rozciągliwej, który czerpie z dwóch kanału alfa ze zmianą wartości alfa, oczywiście trzeba będzie dodać wsparcie dla wymiany kanału alfa, kiedy trzeba obsługiwać wiele z nich

10

niestandardowego widoku, aby to zrobić:

public class FadeView extends FrameLayout { 
    private long mFadeDelay = 1000; 
    private ImageView mFirst; 
    private ImageView mSecond; 
    private boolean mFirstShowing; 

    public FadeView(Context context) { 
     super(context); 
     init(context); 
    } 

    public FadeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public FadeView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    private void init(Context c){ 
     mFirst = new ImageView(c); 
     mSecond = new ImageView(c); 

     mFirst.setAlpha(1.0f); 
     mSecond.setAlpha(0.0f); 

     mFirstShowing = true; 

     addView(mFirst); 
     addView(mSecond); 
    } 

    public void setFadeDelay(long fadeDelay) { 
     mFadeDelay = fadeDelay; 
    } 

    public void ShowImage(Drawable d){ 
     if(mFirstShowing){ 
      mSecond.setImageDrawable(d); 
      mSecond.animate().alpha(1.0f).setDuration(mFadeDelay); 
      mFirst.animate().alpha(0.0f).setDuration(mFadeDelay); 
     }else { 
      mFirst.setImageDrawable(d); 
      mSecond.animate().alpha(0.0f).setDuration(mFadeDelay); 
      mFirst.animate().alpha(1.0f).setDuration(mFadeDelay); 
     } 

     mFirstShowing = !mFirstShowing; 
    } 
} 

Zastosowanie:

public class test extends Activity { 

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

     final FadeView fw = new FadeView(this); 
     setContentView(fw); 

     fw.setOnClickListener(new View.OnClickListener() { 
      Drawable d1 = getResources().getDrawable(android.R.drawable.ic_dialog_alert); 
      Drawable d2 = getResources().getDrawable(android.R.drawable.ic_dialog_info); 
      boolean flag; 

      @Override 
      public void onClick(View view) { 
       if(flag){ 
        fw.ShowImage(d1); 
       }else { 
        fw.ShowImage(d2); 
       } 
       flag = !flag; 
      } 
     }); 
    } 


} 
+0

Jak mogę to osiągnąć dzięki Androidowi> = API9 –

+0

Wybieram odpowiedź jako poprawną odpowiedź. Ale myślę, że konieczne jest wskazanie, że akcja ShowImage musi być wykonana w wątku UI. Byłoby dobrze, gdybyś naprawił kod i przekazał działanie jako parametr lub cokolwiek innego. wykonać połączenia animacji z czymś takim: public void showImage (końcowe rozciągliwej d) { mActivity.runOnUiThread (nowa Runnable() { @Override public void run() { if (mFirstShowing) {...} else { ...} } }); } –

+0

@AnibalItriago Każdy kod, który współdziała z typami widoku, musi być uruchamiany w głównym wątku. Klasa widoku i jej potomkowie nie wykonują tej operacji wewnętrznie, a raczej zmuszają użytkownika do wywoływania odpowiedniego wątku. –