TransitionHelper.java revision ce0bd5abebf662db7d8b42468009b227715698ec
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.transition; 15 16import android.content.Context; 17import android.os.Build; 18import android.view.Gravity; 19import android.view.View; 20import android.view.ViewGroup; 21import android.view.Window; 22 23/** 24 * Helper for view transitions. 25 * @hide 26 */ 27public final class TransitionHelper { 28 29 public static final int FADE_IN = 0x1; 30 public static final int FADE_OUT = 0x2; 31 32 public static final int SLIDE_LEFT = Gravity.LEFT; 33 public static final int SLIDE_TOP = Gravity.TOP; 34 public static final int SLIDE_RIGHT = Gravity.RIGHT; 35 public static final int SLIDE_BOTTOM = Gravity.BOTTOM; 36 37 private final static TransitionHelper sHelper = new TransitionHelper(); 38 TransitionHelperVersionImpl mImpl; 39 40 /** 41 * Gets whether the system supports Transition animations. 42 * 43 * @return True if Transition animations are supported. 44 */ 45 public static boolean systemSupportsTransitions() { 46 if (Build.VERSION.SDK_INT >= 19) { 47 // Supported on Android 4.4 or later. 48 return true; 49 } 50 return false; 51 } 52 53 /** 54 * Returns true if system supports entrance Transition animations. 55 */ 56 public static boolean systemSupportsEntranceTransitions() { 57 return Build.VERSION.SDK_INT >= 21; 58 } 59 60 /** 61 * Interface implemented by classes that support Transition animations. 62 */ 63 static interface TransitionHelperVersionImpl { 64 65 public void setEnterTransition(android.app.Fragment fragment, Object transition); 66 67 public void setExitTransition(android.app.Fragment fragment, Object transition); 68 69 public Object getSharedElementEnterTransition(Window window); 70 71 public Object getSharedElementReturnTransition(Window window); 72 73 public Object getSharedElementExitTransition(Window window); 74 75 public Object getSharedElementReenterTransition(Window window); 76 77 public Object getEnterTransition(Window window); 78 79 public Object getReturnTransition(Window window); 80 81 public Object getExitTransition(Window window); 82 83 public Object getReenterTransition(Window window); 84 85 public Object createScene(ViewGroup sceneRoot, Runnable r); 86 87 public Object createAutoTransition(); 88 89 public Object createSlide(int slideEdge); 90 91 public Object createScale(); 92 93 public Object createFadeTransition(int fadingMode); 94 95 public Object createChangeBounds(boolean reparent); 96 97 public Object createFadeAndShortSlide(int edge); 98 99 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay); 100 101 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay); 102 103 public void setChangeBoundsStartDelay(Object changeBounds, String className, 104 int startDelay); 105 106 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay); 107 108 public Object createTransitionSet(boolean sequential); 109 110 public void addTransition(Object transitionSet, Object transition); 111 112 public void setTransitionListener(Object transition, TransitionListener listener); 113 114 public void runTransition(Object scene, Object transition); 115 116 public void exclude(Object transition, int targetId, boolean exclude); 117 118 public void exclude(Object transition, View targetView, boolean exclude); 119 120 public void excludeChildren(Object transition, int targetId, boolean exclude); 121 122 public void excludeChildren(Object transition, View target, boolean exclude); 123 124 public void include(Object transition, int targetId); 125 126 public void include(Object transition, View targetView); 127 128 public void setStartDelay(Object transition, long startDelay); 129 130 public void setDuration(Object transition, long duration); 131 132 public void setInterpolator(Object transition, Object timeInterpolator); 133 134 public void addTarget(Object transition, View view); 135 136 public Object createDefaultInterpolator(Context context); 137 138 public Object loadTransition(Context context, int resId); 139 } 140 141 /** 142 * Interface used when we do not support Transition animations. 143 */ 144 static class TransitionHelperStubImpl implements TransitionHelperVersionImpl { 145 146 private static class TransitionStub { 147 TransitionListener mTransitionListener; 148 } 149 150 public void setEnterTransition(android.app.Fragment fragment, Object transition) { 151 } 152 153 public void setExitTransition(android.app.Fragment fragment, Object transition) { 154 } 155 156 @Override 157 public Object getSharedElementEnterTransition(Window window) { 158 return null; 159 } 160 161 @Override 162 public Object getSharedElementReturnTransition(Window window) { 163 return null; 164 } 165 166 @Override 167 public Object getSharedElementExitTransition(Window window) { 168 return null; 169 } 170 171 @Override 172 public Object getSharedElementReenterTransition(Window window) { 173 return null; 174 } 175 176 @Override 177 public Object getEnterTransition(Window window) { 178 return null; 179 } 180 181 @Override 182 public Object getReturnTransition(Window window) { 183 return null; 184 } 185 186 @Override 187 public Object getExitTransition(Window window) { 188 return null; 189 } 190 191 @Override 192 public Object getReenterTransition(Window window) { 193 return null; 194 } 195 196 @Override 197 public Object createScene(ViewGroup sceneRoot, Runnable r) { 198 return r; 199 } 200 201 @Override 202 public Object createAutoTransition() { 203 return new TransitionStub(); 204 } 205 206 @Override 207 public Object createFadeTransition(int fadingMode) { 208 return new TransitionStub(); 209 } 210 211 @Override 212 public Object createChangeBounds(boolean reparent) { 213 return new TransitionStub(); 214 } 215 216 @Override 217 public Object createFadeAndShortSlide(int edge) { 218 return new TransitionStub(); 219 } 220 221 @Override 222 public Object createSlide(int slideEdge) { 223 return new TransitionStub(); 224 } 225 226 @Override 227 public Object createScale() { 228 return new TransitionStub(); 229 } 230 231 @Override 232 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 233 } 234 235 @Override 236 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 237 } 238 239 @Override 240 public void setChangeBoundsStartDelay(Object changeBounds, String className, 241 int startDelay) { 242 } 243 244 @Override 245 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 246 } 247 248 @Override 249 public Object createTransitionSet(boolean sequential) { 250 return new TransitionStub(); 251 } 252 253 @Override 254 public void addTransition(Object transitionSet, Object transition) { 255 } 256 257 @Override 258 public void exclude(Object transition, int targetId, boolean exclude) { 259 } 260 261 @Override 262 public void exclude(Object transition, View targetView, boolean exclude) { 263 } 264 265 @Override 266 public void excludeChildren(Object transition, int targetId, boolean exclude) { 267 } 268 269 @Override 270 public void excludeChildren(Object transition, View targetView, boolean exclude) { 271 } 272 273 @Override 274 public void include(Object transition, int targetId) { 275 } 276 277 @Override 278 public void include(Object transition, View targetView) { 279 } 280 281 @Override 282 public void setStartDelay(Object transition, long startDelay) { 283 } 284 285 @Override 286 public void setDuration(Object transition, long duration) { 287 } 288 289 @Override 290 public void setTransitionListener(Object transition, TransitionListener listener) { 291 ((TransitionStub) transition).mTransitionListener = listener; 292 } 293 294 @Override 295 public void runTransition(Object scene, Object transition) { 296 TransitionStub transitionStub = (TransitionStub) transition; 297 if (transitionStub != null && transitionStub.mTransitionListener != null) { 298 transitionStub.mTransitionListener.onTransitionStart(transition); 299 } 300 Runnable r = ((Runnable) scene); 301 if (r != null) { 302 r.run(); 303 } 304 if (transitionStub != null && transitionStub.mTransitionListener != null) { 305 transitionStub.mTransitionListener.onTransitionEnd(transition); 306 } 307 } 308 309 @Override 310 public void setInterpolator(Object transition, Object timeInterpolator) { 311 } 312 313 @Override 314 public void addTarget(Object transition, View view) { 315 } 316 317 @Override 318 public Object createDefaultInterpolator(Context context) { 319 return null; 320 } 321 322 @Override 323 public Object loadTransition(Context context, int resId) { 324 return new TransitionStub(); 325 } 326 } 327 328 /** 329 * Implementation used on KitKat (and above). 330 */ 331 static class TransitionHelperKitkatImpl extends TransitionHelperStubImpl { 332 333 @Override 334 public Object createScene(ViewGroup sceneRoot, Runnable r) { 335 return TransitionHelperKitkat.createScene(sceneRoot, r); 336 } 337 338 @Override 339 public Object createAutoTransition() { 340 return TransitionHelperKitkat.createAutoTransition(); 341 } 342 343 @Override 344 public Object createFadeTransition(int fadingMode) { 345 return TransitionHelperKitkat.createFadeTransition(fadingMode); 346 } 347 348 @Override 349 public Object createChangeBounds(boolean reparent) { 350 return TransitionHelperKitkat.createChangeBounds(reparent); 351 } 352 353 @Override 354 public Object createSlide(int slideEdge) { 355 return TransitionHelperKitkat.createSlide(slideEdge); 356 } 357 358 @Override 359 public Object createScale() { 360 return TransitionHelperKitkat.createScale(); 361 } 362 363 @Override 364 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 365 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, view, startDelay); 366 } 367 368 @Override 369 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 370 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 371 } 372 373 @Override 374 public void setChangeBoundsStartDelay(Object changeBounds, String className, 375 int startDelay) { 376 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, className, startDelay); 377 } 378 379 @Override 380 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 381 TransitionHelperKitkat.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 382 } 383 384 @Override 385 public Object createTransitionSet(boolean sequential) { 386 return TransitionHelperKitkat.createTransitionSet(sequential); 387 } 388 389 @Override 390 public void addTransition(Object transitionSet, Object transition) { 391 TransitionHelperKitkat.addTransition(transitionSet, transition); 392 } 393 394 @Override 395 public void exclude(Object transition, int targetId, boolean exclude) { 396 TransitionHelperKitkat.exclude(transition, targetId, exclude); 397 } 398 399 @Override 400 public void exclude(Object transition, View targetView, boolean exclude) { 401 TransitionHelperKitkat.exclude(transition, targetView, exclude); 402 } 403 404 @Override 405 public void excludeChildren(Object transition, int targetId, boolean exclude) { 406 TransitionHelperKitkat.excludeChildren(transition, targetId, exclude); 407 } 408 409 @Override 410 public void excludeChildren(Object transition, View targetView, boolean exclude) { 411 TransitionHelperKitkat.excludeChildren(transition, targetView, exclude); 412 } 413 414 @Override 415 public void include(Object transition, int targetId) { 416 TransitionHelperKitkat.include(transition, targetId); 417 } 418 419 @Override 420 public void include(Object transition, View targetView) { 421 TransitionHelperKitkat.include(transition, targetView); 422 } 423 424 @Override 425 public void setStartDelay(Object transition, long startDelay) { 426 TransitionHelperKitkat.setStartDelay(transition, startDelay); 427 } 428 429 @Override 430 public void setDuration(Object transition, long duration) { 431 TransitionHelperKitkat.setDuration(transition, duration); 432 } 433 434 @Override 435 public void setTransitionListener(Object transition, TransitionListener listener) { 436 TransitionHelperKitkat.setTransitionListener(transition, listener); 437 } 438 439 @Override 440 public void runTransition(Object scene, Object transition) { 441 TransitionHelperKitkat.runTransition(scene, transition); 442 } 443 444 @Override 445 public void setInterpolator(Object transition, Object timeInterpolator) { 446 TransitionHelperKitkat.setInterpolator(transition, timeInterpolator); 447 } 448 449 @Override 450 public void addTarget(Object transition, View view) { 451 TransitionHelperKitkat.addTarget(transition, view); 452 } 453 454 @Override 455 public Object createDefaultInterpolator(Context context) { 456 return null; 457 } 458 459 @Override 460 public Object loadTransition(Context context, int resId) { 461 return TransitionHelperKitkat.loadTransition(context, resId); 462 } 463 } 464 465 static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl { 466 467 public void setEnterTransition(android.app.Fragment fragment, Object transition) { 468 TransitionHelperApi21.setEnterTransition(fragment, transition); 469 } 470 471 public void setExitTransition(android.app.Fragment fragment, Object transition) { 472 TransitionHelperApi21.setExitTransition(fragment, transition); 473 } 474 475 @Override 476 public Object getSharedElementEnterTransition(Window window) { 477 return TransitionHelperApi21.getSharedElementEnterTransition(window); 478 } 479 480 @Override 481 public Object getSharedElementReturnTransition(Window window) { 482 return TransitionHelperApi21.getSharedElementReturnTransition(window); 483 } 484 485 @Override 486 public Object getSharedElementExitTransition(Window window) { 487 return TransitionHelperApi21.getSharedElementExitTransition(window); 488 } 489 490 @Override 491 public Object getSharedElementReenterTransition(Window window) { 492 return TransitionHelperApi21.getSharedElementReenterTransition(window); 493 } 494 495 @Override 496 public Object createFadeAndShortSlide(int edge) { 497 return TransitionHelperApi21.createFadeAndShortSlide(edge); 498 } 499 500 @Override 501 public Object getEnterTransition(Window window) { 502 return TransitionHelperApi21.getEnterTransition(window); 503 } 504 505 @Override 506 public Object getReturnTransition(Window window) { 507 return TransitionHelperApi21.getReturnTransition(window); 508 } 509 510 @Override 511 public Object getExitTransition(Window window) { 512 return TransitionHelperApi21.getExitTransition(window); 513 } 514 515 @Override 516 public Object getReenterTransition(Window window) { 517 return TransitionHelperApi21.getReenterTransition(window); 518 } 519 520 @Override 521 public Object createScale() { 522 return TransitionHelperApi21.createScale(); 523 } 524 525 @Override 526 public Object createDefaultInterpolator(Context context) { 527 return TransitionHelperApi21.createDefaultInterpolator(context); 528 } 529 } 530 531 /** 532 * Returns the TransitionHelper that can be used to perform Transition 533 * animations. 534 */ 535 public static TransitionHelper getInstance() { 536 return sHelper; 537 } 538 539 private TransitionHelper() { 540 if (Build.VERSION.SDK_INT >= 21) { 541 mImpl = new TransitionHelperApi21Impl(); 542 } else if (systemSupportsTransitions()) { 543 mImpl = new TransitionHelperKitkatImpl(); 544 } else { 545 mImpl = new TransitionHelperStubImpl(); 546 } 547 } 548 549 public Object getSharedElementEnterTransition(Window window) { 550 return mImpl.getSharedElementEnterTransition(window); 551 } 552 553 public Object getSharedElementReturnTransition(Window window) { 554 return mImpl.getSharedElementReturnTransition(window); 555 } 556 557 public Object getSharedElementExitTransition(Window window) { 558 return mImpl.getSharedElementExitTransition(window); 559 } 560 561 public Object getSharedElementReenterTransition(Window window) { 562 return mImpl.getSharedElementReenterTransition(window); 563 } 564 565 public Object getEnterTransition(Window window) { 566 return mImpl.getEnterTransition(window); 567 } 568 569 public Object getReturnTransition(Window window) { 570 return mImpl.getReturnTransition(window); 571 } 572 573 public Object getExitTransition(Window window) { 574 return mImpl.getExitTransition(window); 575 } 576 577 public Object getReenterTransition(Window window) { 578 return mImpl.getReenterTransition(window); 579 } 580 581 public Object createScene(ViewGroup sceneRoot, Runnable r) { 582 return mImpl.createScene(sceneRoot, r); 583 } 584 585 public Object createChangeBounds(boolean reparent) { 586 return mImpl.createChangeBounds(reparent); 587 } 588 589 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 590 mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay); 591 } 592 593 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 594 mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 595 } 596 597 public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 598 mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay); 599 } 600 601 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 602 mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 603 } 604 605 public Object createTransitionSet(boolean sequential) { 606 return mImpl.createTransitionSet(sequential); 607 } 608 609 public Object createSlide(int slideEdge) { 610 return mImpl.createSlide(slideEdge); 611 } 612 613 public Object createScale() { 614 return mImpl.createScale(); 615 } 616 617 public void addTransition(Object transitionSet, Object transition) { 618 mImpl.addTransition(transitionSet, transition); 619 } 620 621 public void exclude(Object transition, int targetId, boolean exclude) { 622 mImpl.exclude(transition, targetId, exclude); 623 } 624 625 public void exclude(Object transition, View targetView, boolean exclude) { 626 mImpl.exclude(transition, targetView, exclude); 627 } 628 629 public void excludeChildren(Object transition, int targetId, boolean exclude) { 630 mImpl.excludeChildren(transition, targetId, exclude); 631 } 632 633 public void excludeChildren(Object transition, View targetView, boolean exclude) { 634 mImpl.excludeChildren(transition, targetView, exclude); 635 } 636 637 public void include(Object transition, int targetId) { 638 mImpl.include(transition, targetId); 639 } 640 641 public void include(Object transition, View targetView) { 642 mImpl.include(transition, targetView); 643 } 644 645 public void setStartDelay(Object transition, long startDelay) { 646 mImpl.setStartDelay(transition, startDelay); 647 } 648 649 public void setDuration(Object transition, long duration) { 650 mImpl.setDuration(transition, duration); 651 } 652 653 public Object createAutoTransition() { 654 return mImpl.createAutoTransition(); 655 } 656 657 public Object createFadeTransition(int fadeMode) { 658 return mImpl.createFadeTransition(fadeMode); 659 } 660 661 public void setTransitionListener(Object transition, TransitionListener listener) { 662 mImpl.setTransitionListener(transition, listener); 663 } 664 665 public void runTransition(Object scene, Object transition) { 666 mImpl.runTransition(scene, transition); 667 } 668 669 public void setInterpolator(Object transition, Object timeInterpolator) { 670 mImpl.setInterpolator(transition, timeInterpolator); 671 } 672 673 public void addTarget(Object transition, View view) { 674 mImpl.addTarget(transition, view); 675 } 676 677 public Object createDefaultInterpolator(Context context) { 678 return mImpl.createDefaultInterpolator(context); 679 } 680 681 public Object loadTransition(Context context, int resId) { 682 return mImpl.loadTransition(context, resId); 683 } 684 685 public void setEnterTransition(android.app.Fragment fragment, Object transition) { 686 mImpl.setEnterTransition(fragment, transition); 687 } 688 689 public void setExitTransition(android.app.Fragment fragment, Object transition) { 690 mImpl.setExitTransition(fragment, transition); 691 } 692 693 public void setEnterTransition(android.support.v4.app.Fragment fragment, Object transition) { 694 fragment.setEnterTransition(transition); 695 } 696 697 public void setExitTransition(android.support.v4.app.Fragment fragment, Object transition) { 698 fragment.setExitTransition(transition); 699 } 700 701 public Object createFadeAndShortSlide(int edge) { 702 return mImpl.createFadeAndShortSlide(edge); 703 } 704} 705