2016-04-27 15 views
11

Điều tôi muốn làm là di chuyển nền theo chiều ngang và lặp lại vô hạn.Nền di chuyển Android liên tục với hoạt ảnh

Tôi đã thử sử dụng ImageSwitcher với hoạt ảnh để cung cấp hiệu ứng này, nhưng không thể làm cho nó hoạt động đúng. Đây là mã tôi có cho đến nayL

public class MainActivity extends AppCompatActivity implements ViewSwitcher.ViewFactory { 

    private Animation animSlide; 
    private ImageSwitcher image; 
    private ImageView imagePop; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     image = (ImageSwitcher) findViewById(R.id.image_switcher); 

     image.setFactory(this); 
     image.setImageResource(R.drawable.zc06); 
     Animation in = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left); 
     in.setDuration(10000); 
     Animation out = AnimationUtils.loadAnimation(this, android.R.anim.slide_out_right); 
     out.setDuration(10000); 
     image.setInAnimation(in); 
     image.setOutAnimation(out); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 

      @Override 
      public void run() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         image.setImageResource(R.drawable.zc06); 
        } 
       }); 
      } 

     }, 0, 10000); 

     Animation mZoomInAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_in); 

     Animation mZoomOutAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_out); 
     imagePop.startAnimation(mZoomInAnimation); 
     imagePop.startAnimation(mZoomOutAnimation); 

    } 

    @Override 
    public View makeView() { 
     ImageView myView = new ImageView(getApplicationContext()); 
     return myView; 
    } 
} 
+0

Tại sao bạn sử dụng hoạt ảnh xem? Bạn thực sự không nên sử dụng chúng nữa ... Thay vào đó hãy sử dụng API hoạt ảnh mới. Dù sao bạn có thể dễ dàng tạo ra một hình ảnh động như vậy bằng cách có hai 'ImageViews' trong bố trí của bạn và dịch chúng với một' ValueAnimator'. Xem câu trả lời của tôi để biết thêm thông tin. –

Trả lời

38

Tại sao bạn không thử tạo ảnh động nền thay vì sử dụng ViewSwitcher? Tất cả bạn cần là một trong những đơn giản ValueAnimator:

Đầu tiên thêm hai giống hệt ImageViews để bố trí của bạn và thiết lập hình nền tương tự cho cả hai trong số họ:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/background_one" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/background"/> 

    <ImageView 
     android:id="@+id/background_two" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/background"/> 

</FrameLayout> 

Sau đó sử dụng một ValueAnimator animate tài sản translationX của họ, nhưng bù lại chúng bằng chiều rộng của họ:

final ImageView backgroundOne = (ImageView) findViewById(R.id.background_one); 
final ImageView backgroundTwo = (ImageView) findViewById(R.id.background_two); 

final ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f); 
animator.setRepeatCount(ValueAnimator.INFINITE); 
animator.setInterpolator(new LinearInterpolator()); 
animator.setDuration(10000L); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     final float progress = (float) animation.getAnimatedValue(); 
     final float width = backgroundOne.getWidth(); 
     final float translationX = width * progress; 
     backgroundOne.setTranslationX(translationX); 
     backgroundTwo.setTranslationX(translationX - width); 
    } 
}); 
animator.start(); 

điều này dẫn đến một hình ảnh động liên tục mà lặp đi lặp lại nền vô thời hạn và nên tìm một cái gì đó như thế này:

+1

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn :) –

+0

Wow! Bạn là một thuật sĩ, cảm ơn bạn rất nhiều Xaver! – Sipty

+0

Trong trường hợp bạn muốn làm chậm hoạt ảnh, hãy tăng thời lượng! :-) – Sipty

2

bạn có thể sử dụng AndroidScrollingImageView Thư viện, tất cả các bạn phải làm là để xác định tốc độ và nguồn drawable

<com.q42.android.scrollingimageview.ScrollingImageView 
    android:id="@+id/scrolling_background" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    scrolling_image_view:speed="1dp" 
    scrolling_image_view:src="@drawable/scrolling_background" /> 

EDIT:

như @Cliff Burton đã đề cập, bạn có thể xoay chế độ xem 90 độ nếu bạn muốn cuộn theo chiều dọc.

+0

Có cách nào để cuộn theo chiều dọc với điều này không? –

+0

@CliffBurton Tôi đã không thử nó trước đây, nhưng bạn có thể chơi với nó, có thể bạn có thể thêm định hướng trong mã xml, hoặc có thể có một phương pháp để làm điều đó trong mã java, nhưng những người chỉ là đoán. –

+1

Tôi vừa mới nhận ra rằng bạn có thể xoay chế độ xem 90 độ nếu bạn muốn cuộn theo chiều dọc ... nếu bạn muốn bạn có thể cập nhật câu trả lời của mình với giải pháp này;) –

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