2012-12-04 44 views
10

मैं एक्सेलेरेट डीसेलरेटइंटरपोलेटर का उपयोग करने की कोशिश कर रहा हूं और इसे कस्टम कर रहा हूं। मैं देख सकता हूं कि DecelerateInterpolator जैसे इंटरपोलेटर के पास "कारक" फ़ील्ड है ताकि आप इसके व्यवहार बदल सकें। लेकिन एक्सेलेरेट डीसेलरेटइंटरपोलेटर में गैर नहीं है। जब मैं एक्सेलेरेट डीसेलरेट इंटरपोलेटर का उपयोग कर रहा हूं, मैं लगभग यह भी ध्यान नहीं दे सकता कि इंटरपोलेटर कुछ भी कर रहा है। एनीमेशन बहुत रैखिक दिखता है। तो, क्या एक्सेलेरेट डीसेलरेटइंटरपोलेटर को कारक करने या किसी भी तरह से इसे बदलने का कोई तरीका है? धन्यवादकस्टम एंड्रॉइड एक्सीलरेट डीसेलरेटइंटरपोलेटर

उत्तर

9

आप अपने Interpolator के साथ मानक आसान कार्य को कार्यान्वित कर सकते हैं।

public class MVAccelerateDecelerateInterpolator implements Interpolator { 

    // easeInOutQuint 
    public float getInterpolation(float t) { 
     float x = t*2.0f; 
     if (t<0.5f) return 0.5f*x*x*x*x*x; 
     x = (t-0.5f)*2-1; 
     return 0.5f*x*x*x*x*x+1; 
    } 
} 

enter image description here

+0

FYI करें, समारोह easeInOutQuint easings.net में पाया जा सकता। –

1

मैंने अपने स्वयं के टाइमइंटरपोलेटर को कस्टम एक्सीलरेट डीसेलरेटइंटरपोलेटर के रूप में परिभाषित करने का प्रयास किया। मैं परिणाम से बहुत खुश नहीं हूं, लेकिन यह कुछ विचार दे सकता है। कोड में कारक का भी प्रकार है: 0.05 एफ। इसे देखें:

TimeInterpolator interpolator = new TimeInterpolator() { 
     @Override 
     public float getInterpolation(float input) { 
      return input + 0.05f * (float) Math.sin(2 * Math.PI * input); 
     } 
    }; 

यहाँ और अधिक परिष्कृत समाधान है। टेंगेंट संभवतः नौकरी के लिए नौकरी के लिए एक बेहतर काम है। यह समाधान शुरुआत और अंत में तेजी से बढ़ता है। त्वरण निर्धारित करने के लिए एक कारक भी है।

TimeInterpolator interpolator = new TimeInterpolator() { 
     private final float mFactor = 1.1f; // less than pi/2 
     private float  oldRetVal; 
     private float  oldInputVal; 
     private double  initValue = Math.tan(-mFactor); 
     private double  endValue = 2 * Math.tan(mFactor); 

     @Override 
     public float getInterpolation(float input) { 
      if (oldInputVal != input) { 
       oldInputVal = input; 
       oldRetVal = (float) ((Math.tan(mFactor * (2 * input - 1)) - initValue)/endValue); 
      } 
      return oldRetVal; 
     } 
    }; 
1

Android v4 समर्थन पुस्तकालय के लिए PathInterpolatorCompat जोड़ा गया है: उदाहरण के लिए, इस easeInOutQuint के लिए कार्यान्वयन किया जाएगा। अब इसका उपयोग कर रहे हैं: https://gist.github.com/ebabel/8ff41cad01e9ce1dd9ce आप आसानी से एक EasyInOutQuint, easyInOutQuart, या easyInOutExpo निर्दिष्ट कर सकते हैं!

public static void expand(final View v) { 
     v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     final int targetHeight = v.getMeasuredHeight(); 

     if (v.getHeight() != targetHeight) { 
      // Older versions of android (pre API 21) cancel animations for views with a height of 0 so use 1 instead. 
      v.getLayoutParams().height = 1; 
      v.setVisibility(View.VISIBLE); 


      Animation a = new Animation() { 
       @Override 
       protected void applyTransformation(float interpolatedTime, Transformation t) { 
        v.getLayoutParams().height = interpolatedTime == 1 
          ? ViewGroup.LayoutParams.WRAP_CONTENT 
          : (int) (targetHeight * interpolatedTime); 
        v.requestLayout(); 
       } 

       @Override 
       public boolean willChangeBounds() { 
        return true; 
       } 
      }; 

      a.setInterpolator(EasingsConstants.easeInOutQuart); 
      a.setDuration(computeDurationFromHeight(v)); 
      v.startAnimation(a); 
     } else { 
      Log.d("AnimationUtil", "expand Already expanded "); 
     } 
    } 

/** 
* 1dp/ms * multiplier 
*/ 
private static int computeDurationFromHeight(View v) { 
    return (int) (v.getMeasuredHeight()/v.getContext().getResources().getDisplayMetrics().density) * DURATION_MULTIPLIER; 
} 

और अपने build.gradle मत भूलना:

compile "com.android.support:support-v4:22.2.0" 
+0

इस लड़के से कॉपी की गई विधि का विस्तार करें: http://stackoverflow.com/a/13381228/247325 –