วิธีหยุดเคลื่อนไหว (ยกเลิก () ไม่ทำงาน)


245

ฉันต้องการหยุดแอนิเมชั่นแปลที่กำลังรันอยู่ .cancel()วิธีการAnimationไม่มีผล; อนิเมชั่นดำเนินต่อไปจนจบ

คุณจะยกเลิกภาพเคลื่อนไหวที่ทำงานอยู่ได้อย่างไร

คำตอบ:


509

โทรclearAnimation()ใดที่คุณเรียกว่าViewstartAnimation()


แต่ในความเป็นจริงฉันต้องการสิ่งที่ซับซ้อนมากกว่านี้เล็กน้อย: เมื่อหยุดแอนิเมชันมันจะต้องอยู่ในตำแหน่งปัจจุบันนั่นคือฉันมีภาพสไลด์และเหตุการณ์การสัมผัสมันต้องหยุดที่นี่ clearAnimation () ไม่ใช่กรณีเนื่องจากจะรีเซ็ตสถานะเป็นตำแหน่งเริ่มต้น / สิ้นสุดขึ้นอยู่กับ setFillAfter ()
ผสม

1
@ user349871: setFillAfter()อาจไม่ทำในสิ่งที่คุณคิด เมื่อเหตุการณ์การสัมผัสเกิดขึ้นให้ล้างภาพเคลื่อนไหวแล้วปรับเค้าโครงของคุณเพื่อให้มีผลกับการเปลี่ยนแปลงถาวรที่คุณต้องการ
CommonsWare

ตกลงดีฉันจะพยายามหยุดแอนิเมชันโดยเรียก clearAnimation () ขั้นตอนต่อไปคือการหาตำแหน่งที่มีการเคลื่อนไหวก่อนที่ฉันจะหยุดมัน API คืออะไร
ผสม

@Mix: ไม่มี API สำหรับสิ่งนั้น
CommonsWare

7
สวัสดีอีกครั้ง! ฉันได้พบวิธีในการรับคะแนน (ในแง่ของเวลาประมาณ) เมื่อภาพเคลื่อนไหวถูกยกเลิก คุณต้องสร้างคลาสย่อยของ Animation และใส่รหัสจากแอนิเมชันโค้ด android (เช่น TranslateAnimation) ในชั้นเรียนของคุณคุณจะสามารถบันทึกและติดตามตำแหน่งในฟังก์ชั่น ApplyTransformation ()
มิกซ์

40

ใน Android 4.4.4 ดูเหมือนว่าวิธีเดียวที่ฉันจะหยุดการเคลื่อนไหวของ alpha fading บน View ได้คือการโทร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);สิ่งนี้ช่วยฉัน
Muhammad Saqib

18

v.setAnimationListener(null)หากคุณกำลังใช้ฟังเคลื่อนไหวตั้ง ใช้รหัสต่อไปนี้พร้อมตัวเลือกทั้งหมด

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

2
มันไม่ได้จำเป็นต่อการเรียกร้อง เพราะจะทำได้v.setAnimation(null); v.clearAnimation();
Christian

ดังที่ @ คริสเตียนกล่าวว่าไม่จำเป็นต้องใช้ v.setAnimation (null)
akshay bhange

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

ใช้เมธอดsetAnimation (null)เพื่อหยุดการเคลื่อนไหวซึ่งเป็นวิธีสาธารณะใน View.javaซึ่งเป็นคลาสพื้นฐานสำหรับวิดเจ็ตทั้งหมดซึ่งใช้เพื่อสร้างส่วนประกอบ UI แบบโต้ตอบ (ปุ่มฟิลด์ข้อความและอื่น ๆ ) /** * 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

หากต้องการหยุดแอนิเมชันคุณสามารถตั้งค่า objectAnimator ที่ไม่ทำอะไรเช่น

ก่อนอื่นเมื่อการพลิกด้วยตนเองมีภาพเคลื่อนไหวจากซ้ายไปขวา:

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.