2011-09-02 23 views
17

Tôi đã thực hiện thành công một hoạt ảnh bên sử dụng Translate Animation có nghĩa là hình ảnh sẽ chuyển từ trên xuống dưới. Đây là mã:Làm thế nào để di chuyển hình ảnh lên xuống liên tục bằng cách sử dụng dịch hình động trong Android?

private ImageView mScanner; 
private Animation mAnimation; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mScanner = (ImageView)findViewById(R.id.Scanner); 

    mAnimation = new TranslateAnimation(0, 0, 0, 500); 
    mAnimation.setDuration(10000); 
    mAnimation.setFillAfter(true); 
    mAnimation.setRepeatCount(-1); 
    mAnimation.setRepeatMode(Animation.REVERSE); 
    mScanner.setAnimation(mAnimation); 
    mScanner.setVisibility(View.VISIBLE); 
} 

Bây giờ tôi muốn rằng khi hình ảnh đạt đến dưới cùng của màn hình, nó sẽ bắt đầu di chuyển trở lại đầu trang. Làm thế nào tôi có thể làm điều đó?

Lưu ý: Đã hoàn thành chế độ ngược lại. Vui lòng xem mã. Nhưng bây giờ vấn đề là, nó rời khỏi dòng khi di chuyển từ dưới lên trên. Giống như hình ảnh đính kèm. Làm thế nào để loại bỏ dòng này? screenshot

+0

Xem giải pháp của tôi: http://stackoverflow.com/a/38934624/2535875 –

Trả lời

33

Sửa đổi mã của bạn theo này:

mScanner.setVisibility(View.VISIBLE); 
    mAnimation = new TranslateAnimation(
      TranslateAnimation.ABSOLUTE, 0f, 
      TranslateAnimation.ABSOLUTE, 0f, 
      TranslateAnimation.RELATIVE_TO_PARENT, 0f, 
      TranslateAnimation.RELATIVE_TO_PARENT, 1.0f); 
    mAnimation.setDuration(10000); 
    mAnimation.setRepeatCount(-1); 
    mAnimation.setRepeatMode(Animation.REVERSE); 
    mAnimation.setInterpolator(new LinearInterpolator()); 
    mScanner.setAnimation(mAnimation); 

Và hơn nữa sử dụng xml chứ không phải hình ảnh. Vui lòng xem mã bên dưới và đặt mã vào số ImageView src của bạn.

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="line"> 
    <solid android:color="#0000FF"/> 
    <size android:width="480dp" 
     android:height="10dp"/> 
    <corners android:radius="1dp"/> 
    <stroke android:width="3dp" 
     android:color="#000000"/> 
</shape> 

Tôi hy vọng nó sẽ giúp bạn.

+1

Hoàn hảo. Tôi bao gồm xml và loại bỏ 'mAnimation.setFillAfter (true);' dòng và nó hoạt động như tôi muốn. Cảm ơn đã giúp đỡ. –

+1

Xin chào, mã của bạn không hoạt động trên 2.3.6. – sandy

+0

@sandy Tôi đã kiểm tra mã này từ 2,1 đến 4,2 và hoạt động của nó trong tất cả các thiết bị của tôi. Xin đừng cố gắng sử dụng hình ảnh như tôi đã có vấn đề với hình ảnh và sau đó tôi sử dụng 'XML' dựa trên dòng tạo ra như là một thay thế của hình ảnh được sử dụng trong dự án. Vui lòng kiểm tra mã của bạn và thử thêm một lần nữa. Cảm ơn –

2

Tôi nghĩ bạn phải xóa mAnimation.setFillAfter(true); vì điều này có nghĩa là nó sẽ ở trạng thái vĩnh viễn khi dừng.

Để quay lại vị trí ban đầu, bạn có thể tạo một bộ hoạt ảnh hoàn chỉnh cho cả di chuyển lên và xuống hoặc thực hiện hai lần riêng biệt và khi kết thúc đầu tiên, sau đó bắt đầu thứ hai, mặc dù không có lý do gì để theo dõi tiêp cận như vậy.

+0

Tôi đã thực hiện những gì tôi muốn nhưng bây giờ tôi nhận được vấn đề mới mà tôi đã đính kèm một hình ảnh. Tôi đã cập nhật câu hỏi của mình. Xin hãy xem. Cảm ơn –

7

Bạn cần phải thiết lập thuộc tính lặp lại

android: repeatMode

int. Cách hoạt ảnh hoạt ảnh khi nó kết thúc hoạt ảnh. android: repeatCount phải được đặt thành số nguyên dương hoặc "-1" cho thuộc tính này để có hiệu lực. Đặt thành "đảo ngược" để có hướng ngược lại hoạt ảnh với mỗi lần lặp lại hoặc "lặp lại" để có vòng lặp hoạt ảnh từ đầu mỗi lần.

Animation a; 
a.setRepeatMode(Animation.REVERSE); 
+0

nó hoạt động nhưng để lại một đường khi di chuyển hướng ngược lại có nghĩa là từ dưới lên trên. Làm thế nào để loại bỏ dòng này để có vẻ như nó đang quét. Tôi đã cập nhật mã của mình và cũng đính kèm hình ảnh. Cảm ơn –

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