2013-03-27 22 views
12

Tôi muốn tạo Nút trong Android bằng văn bản và hình nền. Hình nền phải xen kẽ mỗi lần X.Chuyển đổi AndroidDrawable với nhiều mục

Tôi có thao tác này bằng TransitionDrawable với 2 hình ảnh.

Nhưng tôi không thể làm việc này với nhiều hơn 2 hình ảnh.

Những gì tôi có:

Trong mã Java Tôi tạo ra một nút và thiết lập một nền tảng (mà là một TransitionDrawable định nghĩa trong XML). Và tôi bắt đầu quá trình chuyển đổi.

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

Trong XML tôi xác định trong 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> 

Và cuối cùng là một 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> 

Bây giờ hiệu quả được rằng khi tôi bắt đầu ứng dụng hình ảnh sa mạc được hiển thị . Hình ảnh này đan xen vào hình ảnh của hydrangeas như nó cần. Nhưng hình ảnh sứa không bao giờ được hiển thị.

Trong tài liệu cho TransitionDrawables, bạn có thể chỉ định nhiều hơn 2 drawables nhưng tôi không thể làm việc này.

Tôi cũng đã cố gắng này mà không cần bất kỳ XML nhưng trong JAVA tinh khiết nhưng điều này đã đưa ra chính xác cùng một vấn đề :-(

+0

* Trong doc cho TransitionDrawables nó được tuyên bố rằng bạn có thể chỉ định nhiều hơn 2 drawables * - bạn có thể cung cấp một liên kết đến nơi này được nêu? – Luksprog

+0

http://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html#TransitionDrawable (android.graphics.drawable.Drawable []) Trạng thái này "Cần ít nhất 2 lớp để có thể vẽ được với làm việc đúng cách. Như đã nói trong bài viết ban đầu của tôi, tôi cũng đã thử tất cả mọi thứ trong mã Java thuần túy (do đó actaully sử dụng constructor này) nhưng điều này có cùng một vấn đề. – Knarf

+1

Lựa chọn không phù hợp cho các từ. Tôi vừa xem mã cho 'TransitionDrawable' và nó chỉ mờ dần giữa hai drawables, mọi lớp khác đều bị bỏ qua. – Luksprog

Trả lời

3

Bạn có thể làm điều đó bằng cách sử dụng một handler

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

Hoàn hảo! Chỉ một điều - do không dùng nữa, hãy cân nhắc việc thay thế getDrawable bằng ContextCompat.getDrawable –

+0

yes thanx @MohitSingh –

6

Theo tài liệu chính thức, TransitionDrawable chỉ có thể cross-phai trong 2 lớp, trích dẫn từ Android chính thức tài liệu tham khảo.

Một phần mở rộng của LayerDrawables đó là nhằm cross-fade giữa lớp đầu tiên và thứ hai. để bắt đầu quá trình chuyển đổi, gọi startTransition (int). để hiển thị chỉ các lớp đầu tiên, gọi resetTransition ()

Nếu bạn không đọc nó cẩn thận, vì nó mở rộng LayerDrawables, có thể có nhiều lớp, người ta có thể mong đợi rằng bạn có thể vượt qua mờ dần từ N lớp. Nhưng nó là rất rõ ràng, startTransition cho thấy lớp thứ hai, resetTransition hiển thị đầu tiên.

Tôi khuyên bạn nên thực hiện riêng cho nhiều lần chuyển tiếp. Những gì tôi muốn làm là để có 2 hình ảnh và animate chúng. Bạn có thể cần phải thiết lập các drawables bằng tay, nhưng nó phải là một đoạn mã khá đơn giản.

+0

Thực ra điều gì xảy ra với tôi là nó đóng tiền phạt chuyển tiếp đầu tiên và sau đó khi tôi gọi startTransition một lần nữa nó nhảy đến điểm có thể kéo và chuyển tiếp đầu tiên trở lại cái thứ hai. – CaseyB

+2

Bạn đã đúng! Tôi đã xem lại tài liệu và cập nhật câu trả lời. Nó được ghi nhận rằng nó chỉ hoạt động với 2 lớp. – shalafi

4

trong thời gian điều hành phụ lục bạn có thể tự động thay đổi hình ảnh

Sử dụng td.setDrawableByLayerId (td.getId (1), drawable) trên bạn TransitionDrawable

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

Bạn chỉ có thể tối đa quá trình chuyển đổi hai hình ảnh với TransitionDrawable. Để làm việc với nhiều hơn hai hình ảnh, bạn có thể mở rộng LayerDrawable và triển khai TransitionDrawable của riêng bạn.

Here's việc triển khai sẵn sàng tùy chỉnh TransitionDrawable để hoạt động với nhiều hơn hai hình ảnh.

Bạn có thể xem mẫu hoàn chỉnh cùng với bản trình diễn gif here on Github.

Các vấn đề liên quan