2013-08-15 35 views
5

tôi đang làm việc trên một ứng dụng mà cần hình ảnh chéo mờ dần giữa nhiều hình ảnh,Android - Crossfade mutiple hình ảnh trong một ImageView

Những gì tôi có: một ImageView và 50 drawables (.png) mà tôi sẽ tải về từ đám mây

những gì tôi muốn: 50 drawable nên crossfade (phai trong và ngoài) liên tục giữa một khoảng thời gian của một số giây

những gì tôi đã cố gắng: Dựa trên số câu trả lời ở đây trên stackoverflow, tôi đã thử kỹ thuật TransitionDrawable, nhưng Tôi chỉ có thể crossfade giữa 2 hình ảnh và không nhiều hơn và rằng để với touchi ng.

video Tôi gọi: https://www.youtube.com/watch?v=atH3o2uh_94

Trả lời

-1

sau đó tạo drawable tùy chỉnh của bạn mà rút ra hai Drawables với thay đổi giá trị alpha, tất nhiên bạn sẽ cần phải thêm sự hỗ trợ để trao đổi Drawables khi bạn cần hỗ trợ nhiều người

10

Một giao diện tùy chỉnh để làm điều đó:

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

Cách sử dụng:

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

Làm cách nào để tôi đạt được điều đó với android> = API9 –

+0

Tôi chọn câu trả lời của bạn là câu trả lời đúng. Nhưng tôi nghĩ rằng nó là cần thiết để chỉ ra rằng hành động ShowImage phải được thực thi trong Thread UI. Vì vậy, nó sẽ được tốt đẹp mà bạn sửa mã, và đi qua một hoạt động như tham số hoặc bất cứ điều gì. thực hiện cuộc gọi hình ảnh động với một cái gì đó như: public void showImage (thức drawable d) { mActivity.runOnUiThread (new Runnable() {@Override public void run() { if (mFirstShowing) { ...} else { ...} } }); } –

+0

@AnibalItriago Bất kỳ mã nào tương tác với các loại Chế độ xem phải được chạy trên chuỗi chính. Xem lớp và con cháu của nó không thực hiện việc xử lý này bên trong, thay vào đó, buộc người dùng phải gọi trên chuỗi thích hợp. –