2010-10-07 28 views
48

Tôi đang sử dụng hình động đã xác định xml để trượt chế độ xem khỏi màn hình. Vấn đề là, ngay khi hoạt ảnh hoàn tất, nó sẽ đặt lại vị trí ban đầu của nó. Tôi cần biết cách sửa lỗi này. Đây là xml:Android: Đặt lại vị trí hoạt ảnh sau khi hoàn thành

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> 
    <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/></set> 

Đây là Java mà tôi sử dụng để gọi nó là:

homeScrn = (View)findViewById(R.id.homescreen); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 

    //Set Click Listeners For Menu 
    btnHelp.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      LayoutInflater.from(getApplicationContext()).inflate(R.layout.help, (ViewGroup)findViewById(R.id.subpage), true); 
      homeScrn.startAnimation(slideLeftOut); 
     } 
    }); 

Vì vậy, về cơ bản những gì xảy ra là tôi thổi phồng một cái nhìn dưới một. Sau đó, tôi tạo hiệu ứng cho chế độ xem ở trên cùng bên trái. Ngay sau khi màn hình tắt và hoạt ảnh kết thúc, nó sẽ đặt lại vị trí của nó trở lại.

Trả lời

69

Hoạt ảnh đang hoạt động như mong đợi. Chỉ vì bạn làm điều gì đó không có nghĩa là bạn thực sự di chuyển nó. Một hoạt ảnh chỉ ảnh hưởng đến các điểm ảnh được vẽ trong chính hoạt ảnh chứ không ảnh hưởng đến cấu hình của các tiện ích.

Bạn cần thêm AnimationListener và phương thức onAnimationEnd(), làm điều gì đó giúp di chuyển vĩnh viễn (ví dụ: xóa chế độ xem ở trên cùng của bố mẹ, đánh dấu chế độ xem ở trên là có khả năng hiển thị GONE).

+0

ah ha! chính xác những gì tôi cần. cảm ơn! – LoneWolfPR

+4

Nhưng tôi nên làm gì nếu cùng phải trượtIn. kể từ khi nó không thực sự di chuyển sau đó làm thế nào tôi có thể slideIn đối tượng mà tôi có slideOut ??? – Ads

+0

Thậm chí nếu bạn làm bạn * permeneny * di chuyển 'View' của bạn trong' onAnimationEnd() 'nó ** flicker **. Kiểm tra: http://stackoverflow.com/questions/2650351/android-translateanimation-resets-after-animation –

14

Tôi có thể là một chút trễ trong trả lời, nhưng tôi có giải pháp cho việc này:

Chỉ cần thêm android:fillAfter=true trong xml của bạn

+14

Nó không hoạt động để dịch hoạt hình. Nó chỉ hoạt động với Scale Animation. – Ads

+3

nó không hoạt động để xoay. –

+1

Nó hoạt động để xoay. –

1

tôi đi đến cùng một câu hỏi và giải quyết nó bằng cách thiết lập các marginLeft tại OnAnimationEnd() ..

MarginLayoutParams params = (MarginLayoutParams) this.getLayoutParams(); params.setMargins(this.getWidth()*position, 0,0,0); this.setLayoutParams(params);

9

Bạn có thể sử dụng

fillAfter=true 
fillEnabled=true 

Chế độ xem của bạn sẽ không được đặt lại thành vị trí ban đầu, nhưng nếu bạn có một số nút hoặc cái gì đó khác trong chế độ xem của bạn, vị trí của chúng sẽ không thay đổi.

Bạn phải sử dụng ObjectAnimator, nó hoạt động từ cấp API 11.Nó thay đổi Xem vị trí tự động,

đây là ví dụ

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

Cảm ơn tháng bảy cho mình answer

Nếu ứng dụng của bạn không tìm thấy object animator, thay đổi mức độ API từ Project -> properties -> Android, hơn import android.animation.ObjectAnimator;

Trân trọng Hayk

88

Cuối cùng cũng có cách để làm việc, đúng cách để làm điều này là setFillAfter(true),

nếu bạn muốn xác định hình ảnh động của bạn trong xml thì bạn nên làm một số điều như thế này

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/decelerate_interpolator" 
    android:fillAfter="true"> 

    <translate 
     android:fromXDelta="0%" 
     android:toXDelta="-100%" 
     android:duration="1000"/> 

</set> 

bạn có thể thấy rằng tôi đã xác định filterAfter="true" trong set thẻ, nếu bạn cố gắng xác định thẻ đó trong translate, thẻ sẽ không hoạt động, có thể là lỗi lỗi trong khuôn khổ !!

và sau đó trong Bộ luật

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out); 
someView.startAnimation(anim); 

HOẶC

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0); 

animation.setFillAfter(true); 

animation.setDuration(1800); 

someView.startAnimation(animation); 

thì nó chắc chắn sẽ làm việc !!

Bây giờ điều này hơi phức tạp, có vẻ như chế độ xem thực sự di chuyển đến vị trí mới nhưng thực tế pixel của chế độ xem được di chuyển, tức là chế độ xem của bạn thực sự ở vị trí ban đầu nhưng không hiển thị, bạn có thể kiểm tra có bạn một số nút hoặc xem nhấp chuột được theo quan điểm của bạn (trong trường hợp của tôi trong cách bố trí), để khắc phục điều đó bạn phải tự di chuyển tầm nhìn của bạn/bố trí đến vị trí mới

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 

new TranslateAnimation(-90, 150, 0, 0); 

bây giờ là chúng ta có thể thấy rằng hoạt hình của chúng tôi sẽ bắt đầu từ -90 x-trục đến 150 x-trục

vì vậy những gì chúng tôi làm là đặt

someView.setAnimationListener(this); 

và trong

public void onAnimationEnd(Animation animation) 
{ 
    someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight()); 
} 

bây giờ hãy để tôi giải thích public void layout (int left, int top, int right, int botton)

nó di chuyển bố trí của bạn đến vị trí mới đối số đầu tiên xác định bên trái, mà chúng tôi là , vì dịch hoạt hình đã hoạt hình điểm của chúng tôi đến 150 trục x, trên cùng là 0 vì chúng tôi chưa có trục hình động, bây giờ ở bên phải chúng tôi đã thực hiện someView.getWidth() + 150 về cơ bản, chúng tôi nhận được chiều rộng của chế độ xem và đã thêm vì chúng tôi bên trái của chúng tôi hiện đang di chuyển sang 150 x-trục để làm cho chiều rộng của chế độ xem thành hình gốc, và đáy bằng với chiều cao của chế độ xem của chúng tôi.

Tôi hy vọng bạn người giờ đã hiểu các khái niệm về dịch, và vẫn còn bạn có bất kỳ câu hỏi mà bạn có thể yêu cầu ngay lập tức trong phần bình luận, tôi cảm thấy niềm vui để giúp :)

EDIT Không sử dụng phương pháp layout() vì nó có thể được gọi bởi khung công tác khi chế độ xem không hợp lệ và các thay đổi của bạn sẽ không có hiệu lực, hãy sử dụng LayoutParams để đặt thông số bố cục theo yêu cầu của bạn

+2

Câu trả lời hay hơn cho kịch bản này. – Vivekanand

+0

Cảm ơn lời giải thích tôi đang sử dụng cách tiếp cận này quá, chỉ có vấn đề với cách tiếp cận này là khi hoạt hình được kết thúc flickers xem hoạt hình. – user65721

+1

@ user65721 bạn có đang di chuyển chế độ xem của mình sang vị trí mới không ?? và bạn đã thử 'setFillEnabled()' ?? –

1

Sự cố này đã làm phiền hơn một tuần. Và câu trả lời của Muhammad đã chỉ cho tôi một cách hoàn hảo để giải quyết nó.

Tôi đã sử dụng bố cục cắt xén để triển khai thực đơn bên với hoạt ảnh. "view.layout sẽ không liên tục. Bạn nên sử dụng LayoutParams, sẽ liên tục".

Đây là giải pháp của tôi: (Sử dụng những loại LayoutParameter là phụ thuộc vào cách bố trí cha mẹ của riêng bạn):

@Override 
public void onAnimationEnd(Animation animation) { 
FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(screenWidth, screenHeight); 
layoutParams.setMargins((int) -(screenWidth * RATE), 0, 
      (int) (screenWidth - screenWidth * RATE), screenHeight); 
    for(View v:views) { 

     v.setLayoutParams(layoutParams); 
     //v.layout((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); 
     v.clearAnimation(); 
    } 
} 
5

Bạn cần phải thêm lệnh này:

final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0); 
animSlideLeft.setFillAfter(true); 
Các vấn đề liên quan