एनीमेशन को कैसे रोकें (रद्द करें) काम नहीं करता है


245

मुझे एक चल रहे अनुवाद एनीमेशन को रोकने की आवश्यकता है। .cancel()की विधि Animationकोई प्रभाव नहीं है; एनीमेशन वैसे भी अंत तक चला जाता है।

आप एक रनिंग एनीमेशन कैसे रद्द करते हैं?

जवाबों:


509

कॉल clearAnimation()पर जो भी Viewआप कहा जाता है startAnimation()


लेकिन वास्तव में मुझे थोड़ी और जटिल बात की जरूरत है: जब एनीमेशन बंद हो जाता है, तो उसे वर्तमान स्थिति में रहना चाहिए, अर्थात मेरे पास फिसलने वाली छवि है और स्पर्श घटना पर इसे इस स्थान पर स्थिर होना चाहिए। ClearAnimation () एक मामला नहीं है, क्योंकि यह सेटफ़िल के बाद स्थिति को शुरू / समाप्त करने के लिए रीसेट करता है (बाद में)
मिक्स करें

1
@ user349871: setFillAfter()शायद वह नहीं करता है जो आप सोचते हैं कि यह वैसे भी करता है। जब टच ईवेंट होता है, तो एनीमेशन को साफ़ करें और फिर जो भी स्थायी परिवर्तन चाहते हैं उसे प्रभावित करने के लिए अपने लेआउट को समायोजित करें।
कॉमन्सवेयर

ठीक है, अच्छा, मैं क्लीयरएनिमेशन () कहकर एनीमेशन को रोकने की कोशिश करूंगा। अगला चरण वह स्थिति ढूंढना है जहां एनीमेशन इससे पहले कि मैं इसे रोकूं। उसके लिए एपीआई क्या है?
मिक्स

@ मिक्स: इसके लिए कोई एपीआई नहीं है।
कॉमन्सवेयर

7
फिर से नमस्कार! जब एनीमेशन रद्द कर दिया गया था, तब मुझे पॉइंट (इंटरपोलित समय के संदर्भ में) प्राप्त करने का एक तरीका मिल गया है। आपको ऐनिमेशन को उप-वर्ग बनाने और वहाँ कोड को एंड्रॉइड कोड एनीमेशन (जैसे TranslateAnimation) से डालना होगा। अपनी कक्षा में आप applyTransformation () फ़ंक्शन में स्थिति को सहेजने और ट्रैक करने में सक्षम होंगे।
मिक्स

40

एंड्रॉयड 4.4.4 पर, यह एक ही तरीका है मैं एक दृश्य पर एक अल्फा fading एनीमेशन बुला रहा था रोक सकता है लगता है View.animate().cancel()(यानी, बुला .cancel()देखें पर ViewPropertyAnimator)।

यहाँ वह कोड है जो मैं ICS के पहले और बाद की संगतता के लिए उपयोग कर रहा हूँ:

public void stopAnimation(View v) {
    v.clearAnimation();
    if (canCancelAnimation()) {
        v.animate().cancel();
    }
}

... विधि के साथ:

/**
 * Returns true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 * @return true if the API level supports canceling existing animations via the
 * ViewPropertyAnimator, and false if it does not
 */
public static boolean canCancelAnimation() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}

यहां वह एनीमेशन है जिसे मैं रोक रहा हूं:

v.setAlpha(0f);
v.setVisibility(View.VISIBLE);
// Animate the content view to 100% opacity, and clear any animation listener set on the view.
v.animate()
    .alpha(1f)
    .setDuration(animationDuration)
    .setListener(null);

.setListener(null);इससे मुझे मदद मिली।
मुहम्मद साकिब

18

यदि आप एनीमेशन श्रोता का उपयोग कर रहे हैं, तो सेट करें v.setAnimationListener(null)। सभी विकल्पों के साथ निम्नलिखित कोड का उपयोग करें।

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);

2
यह कॉल करने के लिए आवश्यक नहीं है v.setAnimation(null);क्योंकि यह अंदर किया जाएगा v.clearAnimation();
क्रिश्चियन

जैसा कि @Christian ने कहा कि v.setAnimation (अशक्त) की आवश्यकता नहीं है
अक्षय भंगे

5

आपको .clearAnimation () का उपयोग करना चाहिए; UI थ्रेड में विधि:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
    }
});

3

आप जो करने की कोशिश कर सकते हैं उसे बदलने से पहले एनीमेशन से रूपांतरण मैट्रिक्स प्राप्त करें और उस स्थिति मान को प्राप्त करने के लिए मैट्रिक्स सामग्री का निरीक्षण करें जिसे आप ढूंढ रहे हैं।

यहाँ आपी को देखना चाहिए

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

उदाहरण के लिए (कुछ छद्म कोड। मैंने इसका परीक्षण नहीं किया है):

Transformation outTransformation = new Transformation();
myAnimation.getTransformation(currentTime, outTransformation);
Matrix transformationMatrix = outTransformation.getMatrix();
float[] matrixValues = new float[9];
transformationMatrix.getValues(matrixValues);
float transX = matrixValues[Matrix.MTRANS_X];
float transY = matrixValues[Matrix.MTRANS_Y];

हमें वर्तमान समय कहाँ मिलता है?
mako

ओह, दस्तावेज़ कहता है कि यह "दीवार घड़ी" से मेल खाती है, कहीं और वे दीवार घड़ी को System.currentTimeMillis () के रूप में परिभाषित करते हैं, जो कि कैलेंडर समय से मेल खाती है और जब भी उपयोगकर्ता या नेटवर्क द्वारा समय बदला जाता है, तब वह कूद जाएगा। उपयोग करने के लिए एक अजीब उपाय।
mako

0

एनीमेशन को रोकने के लिए मेथड सेटअनीमेशन (नल) का उपयोग करें , यह View.java में सार्वजनिक विधि के रूप में सामने आया , यह सभी विजेट्स के लिए बेस क्लास है , जो इंटरेक्टिव यूआई घटकों (बटन, टेक्स्ट फ़ील्ड, आदि) बनाने के लिए उपयोग किया जाता है। /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)


0

एनीमेशन को रोकने के लिए आप ऐसे ऑब्जेक्ट सेट कर सकते हैं जो कुछ भी नहीं करते हैं, जैसे

पहली बार जब मैनुअल फ़्लिपिंग सही करने के लिए छोड़ दिया है एनीमेशन:

flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);

तब जब ऑटो फ़्लिप करने के लिए स्विच करना कोई एनीमेशन नहीं है

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.