2015-03-17 23 views
6

Tôi đã cố gắng tạo nội suy tùy chỉnh của mình theo GUI API của Android. Vì vậy, đây là nội suy.Nội suy tùy chỉnh Android với xml

<?xml version="1.0" encoding="utf-8"?> 
<customInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
android:factor="2" 
/> 

Nhưng khi tôi cố gắng sử dụng nó trong hoạt hình:

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android"> 
    android:fromXScale="1" 
    android:toXScale="5" 
    android:duration="3000" 
    android:interpolator="@anim/custom_interpolator"/> 
</scale> 

Và không có gì xảy ra - quan điểm chỉ làm mới bản thân. Tại sao vậy ? Và tại sao nếu tôi cố gắng sử dụng là theo cách đó:

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

<scale 
    android:fromXScale="1" 
    android:toXScale="5" 
    android:duration="3000" 
    android:interpolator="@anim/custom_interpolator"/> 
</set> 

với mã này:

AnimationSet animation =  (AnimationSet)AnimationUtils.loadAnimation(AnimationActivity.this, R.anim.animation); 
animationView.startAnimation(animation); 

một trường hợp ngoại lệ được ném:

java.lang.RuntimeException: Unknown interpolator name: customInterpolator 
     at android.view.animation.AnimationUtils.createInterpolatorFromXml(AnimationUtils.java:422) 
     at android.view.animation.AnimationUtils.loadInterpolator(AnimationUtils.java:285) 
     at android.view.animation.Animation.setInterpolator(Animation.java:391) 
     at android.view.animation.Animation.<init>(Animation.java:255) 
     at android.view.animation.ScaleAnimation.<init>(ScaleAnimation.java:63) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:119) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:115) 
     at android.view.animation.AnimationUtils.createAnimationFromXml(AnimationUtils.java:92) 
     at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:73) 
     at com.example.someone.studyproject.AnimationActivity$4.onClick(AnimationActivity.java:61) 
     at android.view.View.performClick(View.java:4633) 
     at android.view.View$PerformClick.run(View.java:19330) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:157) 
     at android.app.ActivityThread.main(ActivityThread.java:5356) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
     at dalvik.system.NativeStart.main(Native Method) 

Đó là lạ, tôi không bao giờ tạo của tôi tùy chỉnh nội suy với xml (Tôi muốn làm điều đó trong xml chỉ để thực hành nó). Cảm ơn trước.

Bây giờ tôi thử:

<scale 
    android:fromXScale="1" 
    android:toXScale="5" 
android:pivotX="50%" 
android:pivotY="50%" 
    android:duration="3000"/> 

và điều này không hoạt động - hình ảnh biến mất và sau 5 giây nó đã trở lại. Tại sao vậy ? Tại sao hình ảnh biến mất thay vì thay đổi kích thước?

Trả lời

3

Hãy xem lỗi mà nó đang ném. "customInterpolator" không phải là một nội suy thực tế. Bạn vừa tạo thẻ đó từ không có gì. Bạn phải sử dụng các lớp nội suy android sẵn có nếu bạn muốn sửa đổi chúng. Ví dụ:

customInterpolator.xml

<accelerateInterpolator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:factor="2" /> 

Có một cái nhìn tại this link với nhiều loại khác nhau của interpolators có sẵn trong Android.

Nếu bạn không muốn sử dụng một trong các công cụ nội suy android hiện có, bạn có thể tạo lập trình của riêng mình theo cách lập trình.

CubicAccelerateDecelerateInterpolator.java

public class CubicAccelerateDecelerateInterpolator implements Interpolator 
{ 
    @Override 
    public float getInterpolation(float t) 
    { 
     float x = t * 2.0f; 
     if (t < 0.5f) 
     { 
      return 0.5f * x * x * x; 
     } 
     x = (t - 0.5f) * 2 - 1; 
     return 0.5f * x * x * x + 1; 
    } 
} 

Như bạn thấy, bạn cần phải tạo một hàm trả về giá trị của nội suy giữa 0 và 1 cho thời gian t. i = f (t)

Lưu ý: Nếu bạn làm theo cách này, bạn không thể tham khảo nội suy này trong XML. Bạn phải tạo hoạt ảnh của mình theo chương trình.

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