একটি অ্যানিমেশন কীভাবে বন্ধ করবেন (বাতিল () কাজ করে না)


244

আমার একটি চলমান অনুবাদ অ্যানিমেশন বন্ধ করা দরকার। .cancel()পদ্ধতি Animationকোনো প্রভাব নেই; অ্যানিমেশনটি যাইহোক শেষ পর্যন্ত চলে।

আপনি কিভাবে একটি চলমান অ্যানিমেশন বাতিল করবেন?

উত্তর:


508

আপনি যাকে কল clearAnimation()করেছেন কল করুন ।ViewstartAnimation()


তবে আসলে আমার আরও জটিল জিনিস দরকার: অ্যানিমেশনটি বন্ধ হয়ে গেলে এটি অবশ্যই বর্তমান অবস্থানেই থাকবে, অর্থাত আমার স্লাইডিং ইমেজ রয়েছে এবং স্পর্শ ইভেন্টে এটি অবশ্যই এই জায়গায় হিমায়িত হবে। ক্লিয়ারএনিমেশন () কোনও কেস নয়, কারণ এটি সেটফিলএফটার () এর উপর নির্ভর করে অবস্থান শুরু করার / শেষের অবস্থাটি পুনরায় সেট করে
মিশ্রিত করুন

1
@ ব্যবহারকারী 349871: setFillAfter()সম্ভবত আপনি যা মনে করেন তা করেন না। যখন স্পর্শ ইভেন্টটি ঘটে তখন অ্যানিমেশনটি সাফ করুন এবং তারপরে আপনি যে স্থায়ী পরিবর্তন চান তা প্রভাবিত করতে আপনার বিন্যাসটি সামঞ্জস্য করুন।
কমন্সওয়্যার

ঠিক আছে, ভাল, আমি ক্লিয়ারএনিমেশন () কল করে অ্যানিমেশনটি বন্ধ করার চেষ্টা করব। পরবর্তী পদক্ষেপটি অ্যানিমেশনটি বন্ধ করার আগে যেখানে অবস্থান ছিল তা সন্ধান করা। এর জন্য কী এপিআই?
মিশ্রিত করুন

@ মিক্স: এর জন্য কোনও এপিআই নেই।
কমন্সওয়্যার

7
হাই আবার! অ্যানিমেশন বাতিল হয়ে যাওয়ার পরে আমি পয়েন্ট পাওয়ার (একটি ইন্টারপোল্টেড সময়ের নিরিখে) একটি উপায় খুঁজে পেয়েছি। আপনাকে অ্যানিমেশনটিকে উপ-শ্রেণি তৈরি করতে হবে এবং সেখানে অ্যান্ড্রয়েড কোড অ্যানিমেশন (উদাহরণস্বরূপ অনুবাদঅ্যানিমেশন) থেকে কোড রাখা দরকার। আপনার শ্রেণিতে আপনি প্রয়োগ ট্রান্সফর্মেশন () ফাংশনে অবস্থান সংরক্ষণ করতে এবং ট্র্যাক করতে সক্ষম হবেন।
মিক্স

40

অ্যান্ড্রয়েড ৪.৪.৪ এ, ভিউতে কল করা View.animate().cancel()(যেমন, ভিউগুলিতে ফোন .cancel()করা ViewPropertyAnimator) একমাত্র আলফা ফিডিং অ্যানিমেশনটি থামাতে পারার একমাত্র উপায় বলে মনে হয় ।

আমি আইসিএসের আগে এবং পরে সামঞ্জস্যতার জন্য কোডটি ব্যবহার করছি:

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();
খ্রিস্টান

@ ক্রিশ্চিয়ান যেমন বলেছিলেন যে v.setAnimation (নাল) দরকার নেই
অক্ষয় ভাঙ্গে

5

আপনাকে অবশ্যই .CararAnimation () ব্যবহার করতে হবে; ইউআই থ্রেডে পদ্ধতি:

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];

আমরা কারেন্টটাইম কোথায় পাব?
মকো

ওহ, ডকুমেন্টেশনটি এটি "প্রাচীর ঘড়ি" এর সাথে মিলেছে, অন্য কোথাও তারা প্রাচীরের ঘড়িটিকে সিস্টেম.কোর্নটাইমমিলিস () হিসাবে সংজ্ঞায়িত করে, যা ক্যালেন্ডারের সময়ের সাথে মিলে যায় এবং যখনই ব্যবহারকারী বা নেটওয়ার্কের দ্বারা সময় পরিবর্তন করা হয় তখন লাফিয়ে উঠবে। ব্যবহার করার জন্য একটি বিজোড় পরিমাপ।
মাকো

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.