2011-12-30 8 views
8

Tôi muốn highliht vừa được thêm vào ListView mục với một hiệu ứng tốt đẹp. Tôi nghĩ rằng đó là đơn giản & dễ dàng, nhưng tôi stumpled khi một vấn đề:TransitionDrawable: tự động đảo ngược quá trình chuyển đổi khi nó hoàn thành

Tôi muốn chơi TransitionDrawable hoạt hình và một khi nó hoàn thành - tua lại nó. Mục mới sẽ được highlited cho một thời điểm, và sau đó nó sẽ pha trộn với phần còn lại.

TransitionDrawable có các phương thức để phát hoạt ảnh về phía trước và phía sau, nhưng không có phương thức nào có thể được sử dụng để đồng bộ hóa. Tôi mong đợi một khả năng để xác định một callback để hoàn thành hình ảnh động, một cái gì đó như:

TransitionDrawable transition = (TransitionDrawable) view.getBackground(); 
transition.startTransition(500, new TransitionCompleteListener(){ 
       public void completed() 
       { 
        transition.reverseTransition(500); 
       } 
     }); 

Nhưng không có gì như thế được hỗ trợ bởi lớp TransitionDrawable.

Sự cố là: Cách phát hoạt ảnh Chuyển đổi có thể hiển thị và khi kết thúc - ngay lập tức phát lại? Tôi đã có ý tưởng sử dụng lớp Timer để trì hoãn việc thực hiện phần phía sau của hoạt ảnh, nhưng giải pháp này trông hơi quá nặng đối với một điều đơn giản như vậy.

Hoặc có lẽ tôi nên sử dụng thứ gì đó khác biệt mà TransitionDrawable? Tôi muốn tránh sử dụng các hình động bất động sản, vì tôi muốn hỗ trợ các thiết bị cũ hơn (và PA là avaialble từ Honeycomb).

Trả lời

4

tôi đã không thực sự cố gắng bản thân mình, nhưng Tôi muốn nói những gì bạn đang nhắm tới cũng có thể thực hiện được với chế độ xem Hoạt ảnh xem cũ, một chính xác là tween. Thay vì thao tác trực tiếp nền có thể vẽ được (giả sử đó là những gì bạn đang làm), bạn có khả năng tạo hiệu ứng tương tự bằng cách thay đổi thuộc tính alpha của Chế độ xem có cùng kích thước với bố cục hàng. Sau đó, bạn có thể chỉ định cả hoạt ảnh 'bình thường' và ngược lại trong một AnimationSet duy nhất và bắt đầu sau với độ trễ dựa trên lần đầu tiên. Ngoài ra, Hoạt ảnh cung cấp AnimationListener bạn có thể kết nối và nhận thông báo khi hoạt ảnh đầu tiên kết thúc và sau đó bắt đầu lại.

Nhìn vào mã nguồn cho TransitionDrawable, tôi cũng thấy một số khả năng mở rộng triển khai hiện tại với giao diện người nghe tùy chỉnh. Sẽ không quá khó để thực sự nhận ra mẫu bạn minh họa trong đoạn mã trong câu hỏi của bạn.

Tôi có một chút thời gian ngay bây giờ, vì vậy hãy cho tôi nhận xét trong trường hợp bạn cần thêm bất kỳ con trỏ cụ thể nào (ví dụ: đoạn mã) - Tôi sẽ cố gắng tìm một số thời gian cuối tuần này để giúp bạn.

+0

Hmm ... Sử dụng tween có thể hoạt động nếu tôi đặt màu nền của toàn bộ ListView thành màu được sử dụng cho các mục hightlight và đặt màu của tất cả các hàng thành màu trắng. Sau đó, bằng cách thao tác giá trị alpha của một hàng cụ thể, tôi sẽ đạt được hiệu ứng highliht. nhưng ý tưởng về subclassing TransitionDrawable có vẻ tốt hơn, sạch hơn và nhiều hơn "đúng". Tôi đã xem xét nguồn của nó ngay bây giờ và có vẻ như khá dễ dàng để thực hiện những gì tôi cần. Tôi sẽ cập nhật câu hỏi của mình với một giải pháp khi tôi viết mã, bây giờ tôi cần quay lại Luận văn Thạc sĩ của mình (không liên quan đến điều này - đó là một dự án sở thích). Bạn giành chiến thắng tiền thưởng. – user1234567

-2

đánh giá sử dụng ViewAnimator thay http://developer.android.com/reference/android/widget/ViewAnimator.html

Các đối tượng trong và ngoài phim hoạt hình gắn liền với ViewAnimator có một AnimationListener mà gây nên sự kiện bạn muốn chụp

+0

Tôi có thể sai - nhưng không ViewAnimator sử dụng để chuyển đổi giữa các quan điểm (như trong ViewFlipper, mà là nó phân lớp)? – user1234567

+0

có và đề xuất của tôi sẽ là có hai chế độ xem; một bình thường và một được đánh dấu. Về cơ bản, đối với danh sách xml hàng của bạn, bạn có ViewAnimator là phần tử bên ngoài và con của nó giống với hàng danh sách hiện tại của bạn. Sau đó, khi một phần tử được thêm vào mà bạn muốn có tiêu điểm, bạn thông qua mã thêm một chế độ xem mới cho ViewAnimator và bắt đầu chuyển đổi sang chế độ xem thể hiện trạng thái được đánh dấu của bạn. Bạn thiết lập trình xử lý sự kiện và nắm bắt sự kiện khi nó kết thúc và bạn đảo ngược hành động. – dparnas

0

Có lẽ bạn có thể thử này:

Drawable[] transBack = new Drawable[] { res.getDrawable(R.drawable.ic_acept_blue), res.getDrawable(R.drawable.ic_acept)}; 

ImageView btn = (ImageView) findViewById(R.id.resource); 
TransitionDrawable transitionAcept = new TransitionDrawable(transBack); 
btn.setImageDrawable(transitionAcept); 

btn.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN:{ 
      TransitionDrawable transition = (TransitionDrawable) btn.getDrawable(); 
      transition.startTransition(75); 
     }break; 
     case MotionEvent.ACTION_UP:{ 
      TransitionDrawable transition = (TransitionDrawable) btnAcept.getDrawable(); 
      transition.reverseTransition(75); 
      v.performClick(); 
     }break; 
     default: 
     break; 
    } 
    return true; 
} 
}); 
btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //... DO Something here 
    } 
}); 

Đoạn mã trên thực hiện một TouchListener để xử lý đảo ngược và chuyển về phía trước, và một clickListener để xử lý hành động của bạn. Đó là lý do tại sao trong số MotionEvent.ACTION_UP bạn gọi cho v.performClick(); Hy vọng điều này sẽ giúp bạn.

0

Tôi đã mở rộng việc triển khai TransitionDrawable (thực sự đã sao chép và sửa đổi) để chấp nhận tham số repeatCount cho biết số lần thực hiện chuyển tiếp ra sau. Xem RepeatableTransitionDrawable trong kho lưu trữ bên dưới.

Tôi cũng định thêm nhiều hơn hai hỗ trợ có thể kéo.

https://github.com/mehmet6parmak/CustomDrawables

0

Hãy thử với một Handler;)

final TransitionDrawable transition = (TransitionDrawable) sizesSelectionLayout.getBackground(); 
int duration = 500; 
transition.startTransition(duration); 
new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     transition.reverseTransition(duration); 
    } 
}, duration); 

;)