मैं एक्सेलेरेट डीसेलरेटइंटरपोलेटर का उपयोग करने की कोशिश कर रहा हूं और इसे कस्टम कर रहा हूं। मैं देख सकता हूं कि DecelerateInterpolator जैसे इंटरपोलेटर के पास "कारक" फ़ील्ड है ताकि आप इसके व्यवहार बदल सकें। लेकिन एक्सेलेरेट डीसेलरेटइंटरपोलेटर में गैर नहीं है। जब मैं एक्सेलेरेट डीसेलरेट इंटरपोलेटर का उपयोग कर रहा हूं, मैं लगभग यह भी ध्यान नहीं दे सकता कि इंटरपोलेटर कुछ भी कर रहा है। एनीमेशन बहुत रैखिक दिखता है। तो, क्या एक्सेलेरेट डीसेलरेटइंटरपोलेटर को कारक करने या किसी भी तरह से इसे बदलने का कोई तरीका है? धन्यवादकस्टम एंड्रॉइड एक्सीलरेट डीसेलरेटइंटरपोलेटर
उत्तर
आप अपने 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;
}
}
मैंने अपने स्वयं के टाइमइंटरपोलेटर को कस्टम एक्सीलरेट डीसेलरेटइंटरपोलेटर के रूप में परिभाषित करने का प्रयास किया। मैं परिणाम से बहुत खुश नहीं हूं, लेकिन यह कुछ विचार दे सकता है। कोड में कारक का भी प्रकार है: 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;
}
};
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"
इस लड़के से कॉपी की गई विधि का विस्तार करें: http://stackoverflow.com/a/13381228/247325 –
FYI करें, समारोह easeInOutQuint easings.net में पाया जा सकता। –