ย้ายมุมมองโดยใช้ภาพเคลื่อนไหวแบบสะบัด

ลองใช้วิธีเขียน
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีใช้ภาพเคลื่อนไหวใน Compose

ภาพเคลื่อนไหวแบบเหวี่ยงใช้แรงเสียดทานซึ่งสัมพันธ์กับความเร็วของวัตถุ ใช้เพื่อทำให้พร็อพเพอร์ตี้ของออบเจ็กต์เคลื่อนไหวและเพื่อจบภาพเคลื่อนไหวอย่างช้าๆ โดยจะมีแรงกระตุ้นเริ่มต้นซึ่งส่วนใหญ่ได้รับจากความเร็วของท่าทางสัมผัส และค่อยๆ ช้าลง ภาพเคลื่อนไหวจะสิ้นสุดลงเมื่อความเร็วของภาพเคลื่อนไหวต่ำพอที่จะไม่ทำให้เกิดการเปลี่ยนแปลงที่มองเห็นได้บนหน้าจออุปกรณ์

รูปที่ 1 ภาพเคลื่อนไหวของการตวัด

อ่านคู่มือต่อไปนี้เพื่อดูข้อมูลเกี่ยวกับหัวข้อที่เกี่ยวข้อง

เพิ่มไลบรารี AndroidX

หากต้องการใช้ภาพเคลื่อนไหวตามฟิสิกส์ คุณต้องเพิ่มไลบรารี AndroidX ลงในโปรเจ็กต์ดังนี้

  1. เปิดไฟล์ build.gradle ของโมดูลแอป
  2. เพิ่มไลบรารี AndroidX ลงในส่วน dependencies

    Groovy

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    Kotlin

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

สร้างภาพเคลื่อนไหวแบบสะบัด

คลาส FlingAnimation ช่วยให้คุณสร้างภาพเคลื่อนไหวแบบฟลิงสำหรับวัตถุได้ หากต้องการสร้างภาพเคลื่อนไหวแบบฟลิง ให้สร้างอินสแตนซ์ของคลาส FlingAnimation และระบุออบเจ็กต์และพร็อพเพอร์ตี้ของออบเจ็กต์ที่ต้องการสร้างภาพเคลื่อนไหว

Kotlin

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

ตั้งค่าความเร็ว

ความเร็วเริ่มต้นจะกำหนดความเร็วที่คุณสมบัติภาพเคลื่อนไหวมีการเปลี่ยนแปลงในช่วงเริ่มต้นของภาพเคลื่อนไหว ความเร็วเริ่มต้นเริ่มต้นจะตั้งไว้ที่ 0 พิกเซลต่อวินาที คุณจึงต้องกำหนดความเร็วเริ่มต้นเพื่อให้ภาพเคลื่อนไหวไม่สิ้นสุดลงทันที

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

หากต้องการตั้งค่าความเร็ว ให้เรียกใช้เมธอด setStartVelocity() และส่งค่าความเร็วเป็นพิกเซลต่อวินาที เมธอดจะแสดงผลออบเจ็กต์ Fling ที่มีการตั้งค่าความเร็ว

หมายเหตุ: ใช้คลาส GestureDetector.OnGestureListener และ VelocityTracker เพื่อดึงข้อมูลและคำนวณความเร็วของท่าทางสัมผัสตามลำดับ

กำหนดช่วงค่าของภาพเคลื่อนไหว

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

หมายเหตุ: เมื่อค่าของภาพเคลื่อนไหวแบบฟลิงถึงค่าต่ำสุดหรือสูงสุด ภาพเคลื่อนไหวจะสิ้นสุดลง

หากต้องการตั้งค่าต่ำสุดและสูงสุด ให้เรียกใช้เมธอด setMinValue() และ setMaxValue() ตามลำดับ ทั้ง 2 วิธีจะแสดงผลออบเจ็กต์ภาพเคลื่อนไหวที่คุณตั้งค่าไว้

ตั้งค่าแรงเสียดทาน

วิธีการ setFriction() ช่วยให้คุณเปลี่ยนแรงเสียดทานของภาพเคลื่อนไหวได้ ซึ่งจะกำหนดความเร็วที่ความเร็วลดลงในภาพเคลื่อนไหว

หมายเหตุ: หากคุณไม่ได้ตั้งค่าแรงเสียดทานในช่วงเริ่มต้นของภาพเคลื่อนไหว ภาพเคลื่อนไหวจะใช้ค่าแรงเสียดทานเริ่มต้นที่ 1

เมธอดจะแสดงผลออบเจ็กต์ที่มีภาพเคลื่อนไหวซึ่งใช้ค่าแรงเสียดทานที่คุณระบุ

โค้ดตัวอย่าง

ตัวอย่างด้านล่างแสดงการพุ่งในแนวนอน ความเร็วที่บันทึกจากเครื่องมือติดตามความเร็วคือ velocityX และขอบเขตการเลื่อนได้รับการตั้งค่าเป็น 0 และ maxScroll การตั้งค่าแรงเสียดทานคือ 1.1

Kotlin

FlingAnimation(view, DynamicAnimation.SCROLL_X).apply {
    setStartVelocity(-velocityX)
    setMinValue(0f)
    setMaxValue(maxScroll)
    friction = 1.1f
    start()
}

Java

FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
fling.setStartVelocity(-velocityX)
        .setMinValue(0)
        .setMaxValue(maxScroll)
        .setFriction(1.1f)
        .start();

ตั้งค่าการเปลี่ยนแปลงขั้นต่ำที่มองเห็นได้

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

คุณไม่จำเป็นต้องเรียกใช้เมธอดนี้เมื่อสร้างภาพเคลื่อนไหวให้กับ DynamicAnimation.ViewProperty เนื่องจากการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำจะมาจากพร็อพเพอร์ตี้ เช่น

  • ค่าการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำเริ่มต้นคือ 1 พิกเซลสำหรับพร็อพเพอร์ตี้มุมมอง เช่น TRANSLATION_X, TRANSLATION_Y, TRANSLATION_Z, SCROLL_X และ SCROLL_Y
  • สำหรับภาพเคลื่อนไหวที่ใช้การหมุน เช่น ROTATION, ROTATION_X และ ROTATION_Y การเปลี่ยนแปลงที่มองเห็นได้น้อยที่สุดคือ MIN_VISIBLE_CHANGE_ROTATION_DEGREES หรือ 1/10 พิกเซล
  • สำหรับภาพเคลื่อนไหวที่ใช้ความทึบแสง การเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำคือ MIN_VISIBLE_CHANGE_ALPHA หรือ 1/256

หากต้องการตั้งค่าการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำสำหรับภาพเคลื่อนไหว ให้เรียกใช้เมธอด setMinimumVisibleChange() แล้วส่งค่าคงที่ที่มองเห็นได้ขั้นต่ำรายการใดรายการหนึ่งหรือค่าที่คุณต้องคำนวณสำหรับพร็อพเพอร์ตี้ที่กำหนดเอง ดูข้อมูลเพิ่มเติมเกี่ยวกับการคำนวณค่านี้ได้ในส่วนการคำนวณค่าการเปลี่ยนแปลงขั้นต่ำที่มองเห็นได้

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

หมายเหตุ: คุณจะต้องส่งค่าก็ต่อเมื่อสร้างภาพเคลื่อนไหวพร็อพเพอร์ตี้ที่กำหนดเองที่ไม่ได้กำหนดเป็นพิกเซลเท่านั้น

การคํานวณค่าการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำ

หากต้องการคํานวณมูลค่าการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำสําหรับพร็อพเพอร์ตี้ที่กําหนดเอง ให้ใช้สูตรต่อไปนี้

การเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำ = ช่วงของค่าพร็อพเพอร์ตี้ที่กำหนดเอง / ช่วงของภาพเคลื่อนไหวในพิกเซล

เช่น พร็อพเพอร์ตี้ที่คุณต้องการแสดงภาพเคลื่อนไหวมีการเปลี่ยนแปลงจาก 0 เป็น 100 ซึ่งสอดคล้องกับการเปลี่ยนแปลง 200 พิกเซล จากสูตร ค่าการเปลี่ยนแปลงที่มองเห็นได้ขั้นต่ำคือ 100 / 200 ซึ่งเท่ากับ 0.5 พิกเซล