1 page.title=Mendefinisikan Animasi Custom 2 3 @jd:body 4 5 <div id="tb-wrapper"> 6 <div id="tb"> 7 <h2>Pelajaran ini mengajarkan Anda cara</h2> 8 <ol> 9 <li><a href="#Touch">Menyesuaikan Umpan Balik Sentuh</a></li> 10 <li><a href="#Reveal">Menggunakan Reveal Effect</a></li> 11 <li><a href="#Transitions">Menyesuaikan Transisi Aktivitas</a></li> 12 <li><a href="#ViewState">Menganimasikan Perubahan Status Tampilan</a></li> 13 <li><a href="#AnimVector">Menganimasikan Drawable Vektor</a></li> 14 </ol> 15 <h2>Anda juga harus membaca</h2> 16 <ul> 17 <li><a href="http://www.google.com/design/spec">Spesifikasi desain bahan</a></li> 18 <li><a href="{@docRoot}design/material/index.html">Desain bahan di Android</a></li> 19 </ul> 20 </div> 21 </div> 22 23 24 <p>Animasi dalam desain bahan memberi pengguna umpan balik tentang tindakannya dan menyediakan 25 kesinambungan visual saat pengguna berinteraksi dengan aplikasi Anda. Tema bahan menyediakan beberapa animasi default 26 untuk tombol dan transisi aktivitas, dan Android 5.0 (API level 21) ke atas memungkinkan Anda menyesuaikan 27 animasi ini dan membuat yang baru:</p> 28 29 <ul> 30 <li>Umpan balik sentuh</li> 31 <li>Singkap Melingkar</li> 32 <li>Transisi aktivitas</li> 33 <li>Gerakan melengkung</li> 34 <li>Perubahan status tampilan</li> 35 </ul> 36 37 38 <h2 id="Touch">Menyesuaikan Umpan Balik Sentuh</h2> 39 40 <p>Umpan balik sentuh dalam desain bahan menyediakan konfirmasi visual seketika pada 41 titik kontak bila pengguna berinteraksi dengan elemen UI. Animasi umpan balik sentuh default 42 untuk tombol menggunakan kelas {@link android.graphics.drawable.RippleDrawable} baru, yang bertransisi 43 di antara berbagai status dengan efek riak.</p> 44 45 <p>Di sebagian besar kasus, Anda harus menerapkan fungsionalitas ini dalam XML tampilan dengan menetapkan 46 latar belakang tampilan sebagai:</p> 47 48 <ul> 49 <li><code>?android:attr/selectableItemBackground</code> untuk riak berbatas.</li> 50 <li><code>?android:attr/selectableItemBackgroundBorderless</code> untuk riak yang meluas ke luar 51 tampilan. Latar belakang ini akan digambar di atas, dan dibatasi oleh, induk tampilan terdekat dengan 52 latar belakang non-null.</li> 53 </ul> 54 55 <p class="note"><strong>Catatan:</strong> <code>selectableItemBackgroundBorderless</code> adalah 56 atribut baru yang diperkenalkan di API level 21.</p> 57 58 59 <p>Atau, Anda bisa mendefinisikan {@link android.graphics.drawable.RippleDrawable} 60 sebagai sumber daya XML dengan menggunakan elemen <code>ripple</code>.</p> 61 62 <p>Anda bisa menetapkan warna ke objek-objek {@link android.graphics.drawable.RippleDrawable}. Untuk mengubah 63 warna default umpan balik sentuh, gunakan atribut <code>android:colorControlHighlight</code> 64 tema.</p> 65 66 <p>Untuk informasi selengkapnya, lihat referensi API bagi kelas {@link 67 android.graphics.drawable.RippleDrawable}.</p> 68 69 70 <h2 id="Reveal">Menggunakan Reveal Effect</h2> 71 72 <p>Animasi singkap memberi pengguna kesinambungan visual saat menampilkan atau menyembunyikan sekelompok 73 elemen UI. Metode {@link android.view.ViewAnimationUtils#createCircularReveal 74 ViewAnimationUtils.createCircularReveal()} memungkinkan Anda menganimasikan lingkaran terpangkas 75 untuk memperlihatkan atau menyembunyikan tampilan.</p> 76 77 <p>Untuk memperlihatkan tampilan yang sebelumnya tidak terlihat dengan menggunakan efek ini:</p> 78 79 <pre> 80 // previously invisible view 81 View myView = findViewById(R.id.my_view); 82 83 // get the center for the clipping circle 84 int cx = (myView.getLeft() + myView.getRight()) / 2; 85 int cy = (myView.getTop() + myView.getBottom()) / 2; 86 87 // get the final radius for the clipping circle 88 int finalRadius = Math.max(myView.getWidth(), myView.getHeight()); 89 90 // create the animator for this view (the start radius is zero) 91 Animator anim = 92 ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius); 93 94 // make the view visible and start the animation 95 myView.setVisibility(View.VISIBLE); 96 anim.start(); 97 </pre> 98 99 <p>Untuk menyembunyikan sebuah tampilan yang sebelumnya terlihat dengan menggunakan efek ini:</p> 100 101 <pre> 102 // previously visible view 103 final View myView = findViewById(R.id.my_view); 104 105 // get the center for the clipping circle 106 int cx = (myView.getLeft() + myView.getRight()) / 2; 107 int cy = (myView.getTop() + myView.getBottom()) / 2; 108 109 // get the initial radius for the clipping circle 110 int initialRadius = myView.getWidth(); 111 112 // create the animation (the final radius is zero) 113 Animator anim = 114 ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0); 115 116 // make the view invisible when the animation is done 117 anim.addListener(new AnimatorListenerAdapter() { 118 @Override 119 public void onAnimationEnd(Animator animation) { 120 super.onAnimationEnd(animation); 121 myView.setVisibility(View.INVISIBLE); 122 } 123 }); 124 125 // start the animation 126 anim.start(); 127 </pre> 128 129 130 <h2 id="Transitions">Menyesuaikan Transisi Aktivitas</h2> 131 132 <!-- shared transition video --> 133 <div style="width:290px;margin-left:35px;float:right"> 134 <div class="framed-nexus5-port-span-5"> 135 <video class="play-on-hover" autoplay=""> 136 <source src="{@docRoot}design/material/videos/ContactsAnim.mp4"> 137 <source src="{@docRoot}design/material/videos/ContactsAnim.webm"> 138 <source src="{@docRoot}design/material/videos/ContactsAnim.ogv"> 139 </video> 140 </div> 141 <div style="font-size:10pt;margin-left:20px;margin-bottom:30px"> 142 <p class="img-caption" style="margin-top:3px;margin-bottom:10px"><strong>Gambar 1</strong> - Transisi 143 dengan elemen bersama.</p> 144 <em>Untuk memutar ulang film, klik layar perangkat</em> 145 </div> 146 </div> 147 148 <p>Transisi aktivitas dalam aplikasi desain bahan memberikan koneksi visual antar berbagai status 149 melalui gerakan dan transformasi di antara elemen umum. Anda bisa menetapkan animasi custom untuk 150 masuk ke dan keluar dari transisi dan untuk transisi elemen bersama di antara aktivitas.</p> 151 152 <ul> 153 <li>Transisi <strong>masuk</strong> menentukan cara tampilan di aktivitas memasuki suatu babak. 154 misalnya, dalam transisi masuk <em>explode</em>, tampilan memasuki babak dari sisi luar 155 dan melayang masuk ke arah tengah layar.</li> 156 157 <li>Transisi <strong>keluar</strong> menentukan cara tampilan di aktivitas keluar dari suatu babak. Misalnya 158 , dalam transisi keluar <em>explode</em>, tampilan akan keluar dari babak dari bagian 159 tengahnya.</li> 160 161 <li>Transisi <strong>elemen bersama</strong> menentukan cara menggunakan bersama suatu tampilan 162 oleh dua transisi aktivitas di antara aktivitas-aktivitas ini. Misalnya, jika dua aktivitas memiliki 163 gambar yang sama dengan posisi dan ukuran berbeda, transisi elemen bersama <em>changeImageTransform</em> 164 mentransformasikan dan menskalakan gambar secara mulus di antara aktivitas-aktivitas ini.</li> 165 </ul> 166 167 <p>Android 5.0 (API level 21) mendukung transisi masuk dan transisi keluar ini:</p> 168 169 <ul> 170 <li><em>explode</em> - Memindahkan tampilan masuk ke atau keluar dari tengah babak.</li> 171 <li><em>slide</em> - Memindahkan tampilan masuk ke atau keluar dari salah satu tepi babak.</li> 172 <li><em>fade</em> - Menambahkan atau menghapus tampilan dari babak dengan mengubah opasitasnya.</li> 173 </ul> 174 175 <p>Transisi apa pun yang memperluas kelas {@link android.transition.Visibility} didukung 176 sebagai transisi masuk atau transisi keluar. Untuk informasi selengkapnya, lihat referensi API untuk kelas 177 {@link android.transition.Transition}.</p> 178 179 <p>Android 5.0 (API level 21) juga mendukung transisi elemen bersama ini:</p> 180 181 <ul> 182 <li><em>changeBounds</em> - Menganimasikan perubahan pada batas-batas layout tampilan target.</li> 183 <li><em>changeClipBounds</em> - Menganimasikan perubahan pada batas-batas pemangkasan tampilan target.</li> 184 <li><em>changeTransform</em> - Menganimasikan perubahan pada skala dan rotasi tampilan target.</li> 185 <li><em>changeImageTransform</em> - Menganimasikan perubahan pada ukuran dan skala gambar target.</li> 186 </ul> 187 188 <p>Bila Anda mengaktifkan transisi aktivitas dalam aplikasi, transisi memudar-silang default akan 189 diaktifkan di antara aktivitas masuk dan aktivitas keluar.</p> 190 191 <img src="{@docRoot}training/material/images/SceneTransition.png" alt="" width="600" height="405" style="margin-top:20px" /> 192 <p class="img-caption"> 193 <strong>Gambar 2</strong> - Transisi babak dengan satu elemen bersama. 194 </p> 195 196 <h3>Menetapkan transisi custom</h3> 197 198 <p>Pertama, aktifkan transisi konten jendela dengan atribut <code>android:windowContentTransitions</code> 199 bila Anda mendefinisikan gaya yang mewarisi tema bahan. Anda juga bisa menetapkan 200 transisi-transisi masuk, keluar, dan elemen bersama dalam definisi gaya:</p> 201 202 <pre> 203 <style name="BaseAppTheme" parent="android:Theme.Material"> 204 <!-- enable window content transitions --> 205 <item name="android:windowContentTransitions">true</item> 206 207 <!-- specify enter and exit transitions --> 208 <item name="android:windowEnterTransition">@transition/explode</item> 209 <item name="android:windowExitTransition">@transition/explode</item> 210 211 <!-- specify shared element transitions --> 212 <item name="android:windowSharedElementEnterTransition"> 213 @transition/change_image_transform</item> 214 <item name="android:windowSharedElementExitTransition"> 215 @transition/change_image_transform</item> 216 </style> 217 </pre> 218 219 <p>Transisi <code>change_image_transform</code> dalam contoh ini didefinisikan sebagai berikut:</p> 220 221 <pre> 222 <!-- res/transition/change_image_transform.xml --> 223 <!-- (see also Shared Transitions below) --> 224 <transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 225 <changeImageTransform/> 226 </transitionSet> 227 </pre> 228 229 <p>Elemen <code>changeImageTransform</code> menunjukkan 230 kelas {@link android.transition.ChangeImageTransform}. Untuk informasi selengkapnya, lihat referensi 231 API untuk {@link android.transition.Transition}.</p> 232 233 <p>Sebaliknya, untuk mengaktifkan transisi konten jendela dalam kode Anda, panggil 234 metode {@link android.view.Window#requestFeature Window.requestFeature()}:</p> 235 236 <pre> 237 // inside your activity (if you did not enable transitions in your theme) 238 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 239 240 // set an exit transition 241 getWindow().setExitTransition(new Explode()); 242 </pre> 243 244 <p>Untuk menetapkan transisi dalam kode Anda, panggil metode-metode ini dengan objek {@link 245 android.transition.Transition}:</p> 246 247 <ul> 248 <li>{@link android.view.Window#setEnterTransition Window.setEnterTransition()}</li> 249 <li>{@link android.view.Window#setExitTransition Window.setExitTransition()}</li> 250 <li>{@link android.view.Window#setSharedElementEnterTransition 251 Window.setSharedElementEnterTransition()}</li> 252 <li>{@link android.view.Window#setSharedElementExitTransition 253 Window.setSharedElementExitTransition()}</li> 254 </ul> 255 256 <p>Metode {@link android.view.Window#setExitTransition setExitTransition()} dan {@link 257 android.view.Window#setSharedElementExitTransition setSharedElementExitTransition()} mendefinisikan 258 transisi keluar untuk aktivitas yang memanggil. Metode {@link android.view.Window#setEnterTransition 259 setEnterTransition()} dan {@link android.view.Window#setSharedElementEnterTransition 260 setSharedElementEnterTransition()} mendefinisikan transisi masuk untuk aktivitas yang dipanggil.</p> 261 262 <p>Untuk mendapatkan efek penuh sebuah transisi, Anda harus mengaktifkan transisi konten jendela pada 263 aktivitas yang memanggil maupun aktivitas yang dipanggil. Jika tidak, aktivitas yang memanggil akan memulai transisi keluar, 264 namun kemudian Anda akan melihat transisi jendela (seperti mengelupas atau memudar).</p> 265 266 <p>Untuk memulai transisi masuk sesegera mungkin, gunakan metode 267 {@link android.view.Window#setAllowEnterTransitionOverlap Window.setAllowEnterTransitionOverlap()} 268 pada aktivitas yang dipanggil. Ini memungkinkan Anda mendapatkan transisi masuk yang lebih dramatis.</p> 269 270 <h3>Memulai aktivitas dengan menggunakan transisi</h3> 271 272 <p>Jika Anda mengaktifkan transisi dan mengatur transisi keluar untuk aktivitas, transisi itu akan diaktifkan 273 bila Anda menjalankan aktivitas lain sebagai berikut:</p> 274 275 <pre> 276 startActivity(intent, 277 ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); 278 </pre> 279 280 <p>Jika Anda telah mengatur transisi masuk untuk aktivitas kedua, transisi juga akan diaktifkan 281 bila aktivitas dimulai. Untuk menonaktifkan transisi bila Anda memulai aktivitas lain, sediakan 282 bundel opsi <code>null</code>.</p> 283 284 <h3>Memulai aktivitas dengan satu elemen bersama</h3> 285 286 <p>Untuk membuat animasi transisi layar di antara dua aktivitas yang memiliki satu elemen bersama:</p> 287 288 <ol> 289 <li>Aktifkan transisi konten jendela dalam tema Anda.</li> 290 <li>Tetapkan transisi elemen bersama dalam gaya Anda.</li> 291 <li>Definisikan transisi Anda sebagai sumber daya XML.</li> 292 <li>Tetapkan nama umum pada elemen bersama dalam kedua layout dengan 293 atribut <code>android:transitionName</code>.</li> 294 <li>Gunakan metode {@link android.app.ActivityOptions#makeSceneTransitionAnimation 295 ActivityOptions.makeSceneTransitionAnimation()}.</li> 296 </ol> 297 298 <pre> 299 // get the element that receives the click event 300 final View imgContainerView = findViewById(R.id.img_container); 301 302 // get the common element for the transition in this activity 303 final View androidRobotView = findViewById(R.id.image_small); 304 305 // define a click listener 306 imgContainerView.setOnClickListener(new View.OnClickListener() { 307 @Override 308 public void onClick(View view) { 309 Intent intent = new Intent(this, Activity2.class); 310 // create the transition animation - the images in the layouts 311 // of both activities are defined with android:transitionName="robot" 312 ActivityOptions options = ActivityOptions 313 .makeSceneTransitionAnimation(this, androidRobotView, "robot"); 314 // start the new activity 315 startActivity(intent, options.toBundle()); 316 } 317 }); 318 </pre> 319 320 <p>Untuk tampilan dinamis bersama yang Anda hasilkan dalam kode, gunakan 321 metode {@link android.view.View#setTransitionName View.setTransitionName()} untuk menetapkan 322 nama elemen umum di kedua aktivitas.</p> 323 324 <p>Untuk membalik animasi transisi babak bila Anda menyelesaikan aktivitas kedua, panggil metode 325 {@link android.app.Activity#finishAfterTransition Activity.finishAfterTransition()} 326 sebagai ganti {@link android.app.Activity#finish Activity.finish()}.</p> 327 328 <h3>Memulai aktivitas dengan beberapa elemen bersama</h3> 329 330 <p>Untuk membuat animasi transisi babak antara dua aktivitas yang memiliki lebih dari satu 331 elemen bersama, definisikan elemen bersama di kedua layout dengan atribut <code>android:transitionName</code> 332 (atau gunakan metode {@link android.view.View#setTransitionName View.setTransitionName()} 333 di kedua aktivitas), dan buat sebuah objek {@link android.app.ActivityOptions} sebagai berikut:</p> 334 335 <pre> 336 ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, 337 Pair.create(view1, "agreedName1"), 338 Pair.create(view2, "agreedName2")); 339 </pre> 340 341 342 <h2 id="CurvedMotion">Menggunakan Gerakan Melengkung</h2> 343 344 <p>Animasi dalam desain bahan mengandalkan kurva untuk pola interpolasi waktu dan 345 gerakan spasial. Dengan Android 5.0 (API level 21) ke atas, Anda bisa mendefinisikan kurva pewaktuan custom dan 346 pola gerakan melengkung untuk animasi.</p> 347 348 <p>Kelas {@link android.view.animation.PathInterpolator} adalah interpolator baru berdasarkan sebuah 349 kurva Bzier atau objek {@link android.graphics.Path}. Interpolator ini menetapkan kurva gerakan 350 dalam bujur sangkar 1x1, dengan titik-titik jangkar di (0,0) dan (1,1) dan titik-titik kontrol sebagaimana ditetapkan menggunakan 351 argumen konstruktor. Anda juga bisa mendefinisikan interpolator path sebagai sumber daya XML:</p> 352 353 <pre> 354 <pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 355 android:controlX1="0.4" 356 android:controlY1="0" 357 android:controlX2="1" 358 android:controlY2="1"/> 359 </pre> 360 361 <p>Sistem menyediakan sumber daya XML untuk tiga kurva dasar dalam 362 spesifikasi desain bahan:</p> 363 364 <ul> 365 <li><code>@interpolator/fast_out_linear_in.xml</code></li> 366 <li><code>@interpolator/fast_out_slow_in.xml</code></li> 367 <li><code>@interpolator/linear_out_slow_in.xml</code></li> 368 </ul> 369 370 <p>Anda bisa meneruskan objek {@link android.view.animation.PathInterpolator} ke metode {@link 371 android.animation.Animator#setInterpolator Animator.setInterpolator()}.</p> 372 373 <p>Kelas {@link android.animation.ObjectAnimator} memiliki konstruktor-konstruktor baru yang memungkinkan Anda menganimasikan 374 koordinat bersama sebuah path dengan menggunakan dua atau beberapa properti sekaligus. Misalnya, animator berikut 375 menggunakan objek {@link android.graphics.Path} untuk menganimasikan properti X dan Y sebuah tampilan:</p> 376 377 <pre> 378 ObjectAnimator mAnimator; 379 mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); 380 ... 381 mAnimator.start(); 382 </pre> 383 384 385 <h2 id="ViewState">Menganimasikan Perubahan Status Tampilan</h2> 386 387 <p>Kelas {@link android.animation.StateListAnimator} memungkinkan Anda mendefinisikan animator yang berjalan bila 388 status tampilan berubah. Contoh berikut menampilkan cara mendefinisikan {@link 389 android.animation.StateListAnimator} sebagai sumber daya XML:</p> 390 391 <pre> 392 <!-- animate the translationZ property of a view when pressed --> 393 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 394 <item android:state_pressed="true"> 395 <set> 396 <objectAnimator android:propertyName="translationZ" 397 android:duration="@android:integer/config_shortAnimTime" 398 android:valueTo="2dp" 399 android:valueType="floatType"/> 400 <!-- you could have other objectAnimator elements 401 here for "x" and "y", or other properties --> 402 </set> 403 </item> 404 <item android:state_enabled="true" 405 android:state_pressed="false" 406 android:state_focused="true"> 407 <set> 408 <objectAnimator android:propertyName="translationZ" 409 android:duration="100" 410 android:valueTo="0" 411 android:valueType="floatType"/> 412 </set> 413 </item> 414 </selector> 415 </pre> 416 417 <p>Untuk menyertakan animasi status tampilan custom ke tampilan, definisikan animator menggunakan 418 elemen <code>selector</code> dalam sumber daya file XML sebagaimana dalam contoh ini, dan tetapkan ke 419 tampilan Anda dengan atribut <code>android:stateListAnimator</code>. Untuk menetapkan animator daftar status 420 ke sebuah tampilan dalam kode Anda, gunakan metode {@link android.animation.AnimatorInflater#loadStateListAnimator 421 AnimationInflater.loadStateListAnimator()}, dan tetapkan animator ke tampilan dengan 422 metode {@link android.view.View#setStateListAnimator View.setStateListAnimator()}.</p> 423 424 <p>Bila tema Anda memperluas tema bahan, tombol-tombol akan memiliki animasi Z secara default. Untuk menghindari 425 perilaku ini di tombol Anda, aturlah atribut <code>android:stateListAnimator</code> ke 426 <code>@null</code>.</p> 427 428 <p>Kelas {@link android.graphics.drawable.AnimatedStateListDrawable} memungkinkan Anda membuat drawable 429 yang menampilkan animasi di antara perubahan status tampilan terkait. Sebagian widget sistem di 430 Android 5.0 menggunakan animasi ini secara default. Contoh berikut menampilkan cara 431 mendefinisikan {@link android.graphics.drawable.AnimatedStateListDrawable} sebagai sumber daya XML:</p> 432 433 <pre> 434 <!-- res/drawable/myanimstatedrawable.xml --> 435 <animated-selector 436 xmlns:android="http://schemas.android.com/apk/res/android"> 437 438 <!-- provide a different drawable for each state--> 439 <item android:id="@+id/pressed" android:drawable="@drawable/drawableP" 440 android:state_pressed="true"/> 441 <item android:id="@+id/focused" android:drawable="@drawable/drawableF" 442 android:state_focused="true"/> 443 <item android:id="@id/default" 444 android:drawable="@drawable/drawableD"/> 445 446 <!-- specify a transition --> 447 <transition android:fromId="@+id/default" android:toId="@+id/pressed"> 448 <animation-list> 449 <item android:duration="15" android:drawable="@drawable/dt1"/> 450 <item android:duration="15" android:drawable="@drawable/dt2"/> 451 ... 452 </animation-list> 453 </transition> 454 ... 455 </animated-selector> 456 </pre> 457 458 459 <h2 id="AnimVector">Menganimasikan Drawable Vektor</h2> 460 461 <p><a href="{@docRoot}training/material/drawables.html#VectorDrawables">Drawable Vektor </a> 462 bisa diubah skalanya tanpa kehilangan definisi. Kelas {@link android.graphics.drawable.AnimatedVectorDrawable} 463 memungkinkan Anda menganimasikan properti drawable vektor.</p> 464 465 <p>Anda biasanya mendefinisikan drawable vektor yang dianimasikan dalam tiga file XML:</p> 466 467 <ul> 468 <li>Drawable vektor dengan elemen <code><vector></code> dalam 469 <code>res/drawable/</code></li> 470 <li>Drawable vektor animasi dengan elemen <code><animated-vector></code> dalam 471 <code>res/drawable/</code></li> 472 <li>Satu atau beberapa animator objek dengan elemen <code><objectAnimator></code> dalam 473 <code>res/anim/</code></li> 474 </ul> 475 476 <p>Drawable vektor yang dianimasikan bisa menganimasikan atribut elemen <code><group></code> dan 477 <code><path></code>. Elemen <code><group></code> mendefinisikan satu set 478 path atau subgrup, dan elemen <code><path></code> mendefinisikan path yang harus digambar.</p> 479 480 <p>Bila Anda mendefinisikan drawable vektor yang ingin dianimasikan, gunakan atribut <code>android:name</code> 481 untuk menetapkan nama unik ke grup dan path, sehingga Anda bisa merujuknya dari 482 definisi animator Anda. Misalnya:</p> 483 484 <pre> 485 <!-- res/drawable/vectordrawable.xml --> 486 <vector xmlns:android="http://schemas.android.com/apk/res/android" 487 android:height="64dp" 488 android:width="64dp" 489 android:viewportHeight="600" 490 android:viewportWidth="600"> 491 <group 492 <strong>android:name="rotationGroup"</strong> 493 android:pivotX="300.0" 494 android:pivotY="300.0" 495 android:rotation="45.0" > 496 <path 497 <strong>android:name="v"</strong> 498 android:fillColor="#000000" 499 android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> 500 </group> 501 </vector> 502 </pre> 503 504 <p>Definisi drawable vektor yang dianimasikan merujuk pada grup dan path dalam drawable vektor 505 berdasarkan namanya:</p> 506 507 <pre> 508 <!-- res/drawable/animvectordrawable.xml --> 509 <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" 510 android:drawable="@drawable/vectordrawable" > 511 <target 512 android:name="rotationGroup" 513 android:animation="@anim/rotation" /> 514 <target 515 android:name="v" 516 android:animation="@anim/path_morph" /> 517 </animated-vector> 518 </pre> 519 520 <p>Definisi animasi menyatakan objek {@link android.animation.ObjectAnimator} atau {@link 521 android.animation.AnimatorSet}. Animator pertama dalam contoh ini memutar 522 grup target sebanyak 360 derajat:</p> 523 524 <pre> 525 <!-- res/anim/rotation.xml --> 526 <objectAnimator 527 android:duration="6000" 528 android:propertyName="rotation" 529 android:valueFrom="0" 530 android:valueTo="360" /> 531 </pre> 532 533 <p>Animator kedua dalam contoh ini perlahan-lahan mengubah bentuk path drawable vektor dari satu bentuk ke 534 bentuk yang lain. Kedua path harus kompatibel untuk morphing: keduanya harus memiliki jumlah perintah yang sama 535 dan jumlah parameter yang sama untuk setiap perintah.</p> 536 537 <pre> 538 <!-- res/anim/path_morph.xml --> 539 <set xmlns:android="http://schemas.android.com/apk/res/android"> 540 <objectAnimator 541 android:duration="3000" 542 android:propertyName="pathData" 543 android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" 544 android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z" 545 android:valueType="pathType" /> 546 </set> 547 </pre> 548 549 <p>Untuk informasi selengkapnya, lihat referensi API bagi {@link 550 android.graphics.drawable.AnimatedVectorDrawable}.</p> 551