├── .gitignore ├── AndroidTransitionsProject ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── shevart │ │ │ └── androidtransitions │ │ │ ├── MainActivity.kt │ │ │ ├── advanced │ │ │ ├── Description.kt │ │ │ ├── clean │ │ │ │ ├── Description.kt │ │ │ │ └── code │ │ │ │ │ ├── CleanCodeTransitionActivity.kt │ │ │ │ │ ├── CleanCodeTransitionUtil.kt │ │ │ │ │ └── delegates │ │ │ │ │ ├── CleanCodeDelegateTransitionActivity.kt │ │ │ │ │ ├── ContentTransitionProvider.kt │ │ │ │ │ ├── SimpleContentTransitionDelegate.kt │ │ │ │ │ └── TransitionDelegatesUtil.kt │ │ │ ├── mvpandmvvmpatterns │ │ │ │ ├── Description.kt │ │ │ │ └── mvp │ │ │ │ │ ├── MvpTransitionSampleActivity.kt │ │ │ │ │ ├── Presenter.kt │ │ │ │ │ ├── SampleTransitionContract.kt │ │ │ │ │ └── base │ │ │ │ │ ├── AbsMvpTransitionActivity.kt │ │ │ │ │ ├── AbsPresenter.kt │ │ │ │ │ └── BaseMvp.kt │ │ │ └── polish │ │ │ │ ├── PolishFinishActivity.kt │ │ │ │ └── PolishStartActivity.kt │ │ │ ├── base │ │ │ ├── AbsActivity.kt │ │ │ ├── AbsFragment.kt │ │ │ └── BaseRVAdapter.kt │ │ │ ├── common │ │ │ ├── AbsTransitionListener.kt │ │ │ ├── MockItemListDetailHost.kt │ │ │ ├── MockSimpleItemAdapter.kt │ │ │ └── SimpleItem.kt │ │ │ ├── customtransitions │ │ │ ├── Overview.kt │ │ │ └── changeicontransitions │ │ │ │ └── ChangeIconImageTransition.kt │ │ │ ├── scene │ │ │ ├── SceneTopicActivity.kt │ │ │ └── samples │ │ │ │ ├── bylayoutid │ │ │ │ └── ContentByLayoutIdSceneSampleActivity.kt │ │ │ │ ├── enterexitaction │ │ │ │ └── EnterAndExitActionSceneSampleActivity.kt │ │ │ │ └── searchbar │ │ │ │ └── SearchBarSceneSampleActivity.kt │ │ │ ├── screenstransition │ │ │ ├── ScreenTransitionsTopicActivity.kt │ │ │ ├── screencontents │ │ │ │ ├── activity │ │ │ │ │ ├── bytheme │ │ │ │ │ │ ├── ContentTransitionByThemeScreenAActivity.kt │ │ │ │ │ │ └── ContentTransitionByThemeScreenBActivity.kt │ │ │ │ │ └── programmatically │ │ │ │ │ │ ├── FirstContentProgrammaticallyActivity.kt │ │ │ │ │ │ └── SecondContentProgrammaticallyActivity.kt │ │ │ │ └── fragments │ │ │ │ │ ├── FragmentsScreenContentTransitionActivity.kt │ │ │ │ │ ├── SampleContentTransitionsProvider.kt │ │ │ │ │ ├── SampleTransitionsHelper.kt │ │ │ │ │ ├── ScreenAFragment.kt │ │ │ │ │ └── ScreenBFragment.kt │ │ │ └── sharedelements │ │ │ │ ├── SharedElementsSimpleIItemAdapter.kt │ │ │ │ ├── activity │ │ │ │ ├── SharedElementsAActivity.kt │ │ │ │ └── SharedElementsBActivity.kt │ │ │ │ ├── fragments │ │ │ │ ├── FragmentsSharedElementsActivity.kt │ │ │ │ ├── SharedElementAFragment.kt │ │ │ │ └── SharedElementBFragment.kt │ │ │ │ ├── sharedelementscallback │ │ │ │ ├── FragmentsSharedElementsCallbackActivity.kt │ │ │ │ ├── SecAFragment.kt │ │ │ │ └── SecBFragment.kt │ │ │ │ └── sharedelementscallbackvalidator │ │ │ │ ├── FragmentsSharedElementsCallbackValidatorActivity.kt │ │ │ │ ├── SecvAFragment.kt │ │ │ │ ├── SecvBFragment.kt │ │ │ │ └── helper │ │ │ │ ├── FragmentSharedElementsTransition.kt │ │ │ │ ├── FragmentSharedElementsTransitionRecord.kt │ │ │ │ ├── SharedElementsFragmentsHelper.kt │ │ │ │ ├── SupportTransitionValidateUtil.kt │ │ │ │ ├── TransitionHelperUtil.kt │ │ │ │ └── TransitionValidateUtil.kt │ │ │ ├── specialcases │ │ │ ├── Description.kt │ │ │ └── screentriangle │ │ │ │ ├── ScreenTriangleStartActivity.kt │ │ │ │ ├── fragments │ │ │ │ ├── FirstFragment.kt │ │ │ │ ├── ParentWrapperSecondFragment.kt │ │ │ │ └── SecondFragment.kt │ │ │ │ └── middlescreen │ │ │ │ └── MiddleScreensHostActivity.kt │ │ │ ├── transition │ │ │ ├── TransitionTopicActivity.kt │ │ │ └── overview │ │ │ │ ├── TransitionsOverviewComplexLayoutActivity.kt │ │ │ │ ├── base │ │ │ │ ├── AbsTransitionBaseActivity.kt │ │ │ │ ├── AutoTransitionOverviewActivity.kt │ │ │ │ ├── ChangeBoundsArcMotionOverviewActivity.kt │ │ │ │ ├── ChangeBoundsOverviewActivity.kt │ │ │ │ ├── ChangeBoundsPatternMotionOverviewActivity.kt │ │ │ │ ├── ChangeClipBoundsActivity.kt │ │ │ │ ├── ChangeImageTransformOverviewActivity.kt │ │ │ │ ├── ChangeScrollOverviewActivity.kt │ │ │ │ ├── ChangeTransformOverviewActivity.kt │ │ │ │ ├── ExplodeOverviewActivity.kt │ │ │ │ ├── FadeOverviewActivity.kt │ │ │ │ └── SlideOverviewActivity.kt │ │ │ │ └── custom │ │ │ │ └── ChangeIconImageTransitionActivity.kt │ │ │ ├── transitionmanager │ │ │ ├── Temp.kt │ │ │ └── begindelayedsample │ │ │ │ └── BeginDelayedSampleActivity.kt │ │ │ └── util │ │ │ ├── ActivityUtil.kt │ │ │ ├── Launcher.kt │ │ │ ├── MockItemsUtil.kt │ │ │ ├── MockResourcesPlace.kt │ │ │ ├── SharedElementsCallbackUtil.kt │ │ │ ├── TransitionNameUtil.kt │ │ │ ├── TransitionUtil.kt │ │ │ ├── UiUtil.kt │ │ │ └── ViewUtil.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── auto_transition.png │ │ ├── bg_one.jpg │ │ ├── change_bounds.png │ │ ├── change_bounds_arch_motion.png │ │ ├── change_bounds_pattern_path_motion.png │ │ ├── change_clip_bounds.png │ │ ├── change_image_transform.png │ │ ├── change_scroll.png │ │ ├── change_transform.png │ │ ├── city_one.jpg │ │ ├── explode.png │ │ ├── fade.png │ │ ├── ic_android_black.xml │ │ ├── ic_arrow_back.xml │ │ ├── ic_audiotrack_black.xml │ │ ├── ic_close.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_menu.xml │ │ ├── ic_more_vert.xml │ │ ├── ic_search.xml │ │ ├── ic_search_grey.xml │ │ ├── palm.jpg │ │ ├── palm_2.jpg │ │ ├── sea.jpg │ │ ├── slide.png │ │ ├── smoothie.png │ │ ├── stock_bus_1.jpg │ │ ├── stock_bus_2.jpg │ │ ├── stock_bus_3.jpg │ │ ├── stock_bus_4.jpg │ │ ├── stock_bus_5.jpg │ │ ├── stock_bus_6.jpg │ │ └── stock_bus_7.jpg │ │ ├── layout │ │ ├── activity_begin_delayed_sample.xml │ │ ├── activity_clean_code_delegate_transition.xml │ │ ├── activity_clean_code_transition.xml │ │ ├── activity_content_by_layout_id_scene_sample.xml │ │ ├── activity_content_transition_by_theme_screen_a.xml │ │ ├── activity_content_transition_by_theme_screen_b.xml │ │ ├── activity_enter_and_exit_action_scene_sample.xml │ │ ├── activity_first_content_programmatically.xml │ │ ├── activity_fragments_screen_content_transition.xml │ │ ├── activity_fragments_shared_elements_callback.xml │ │ ├── activity_fragments_shared_elements_callback2.xml │ │ ├── activity_fragments_shared_elements_validator.xml │ │ ├── activity_main.xml │ │ ├── activity_middle_screens_host.xml │ │ ├── activity_mvp_transition_sample.xml │ │ ├── activity_polish_finish.xml │ │ ├── activity_polish_start.xml │ │ ├── activity_scene_topic.xml │ │ ├── activity_screen_transitions_topic.xml │ │ ├── activity_screen_triangle_start.xml │ │ ├── activity_search_bar_scene_sample.xml │ │ ├── activity_second_content_programmatically.xml │ │ ├── activity_shared_elements_a.xml │ │ ├── activity_shared_elements_b.xml │ │ ├── activity_transition_base_overview.xml │ │ ├── activity_transition_topic.xml │ │ ├── activity_transitions_complex_layout_overview.xml │ │ ├── fragment_first.xml │ │ ├── fragment_parent_wrapper_second.xml │ │ ├── fragment_screen_a.xml │ │ ├── fragment_screen_b.xml │ │ ├── fragment_second.xml │ │ ├── fragment_shared_element_a.xml │ │ ├── fragment_shared_element_b.xml │ │ ├── item_simple.xml │ │ ├── layout_base_transition_overview_form.xml │ │ ├── layout_detail_screen.xml │ │ ├── layout_enter_exit_scene_sample_login.xml │ │ ├── layout_enter_exit_scene_sample_logo.xml │ │ ├── layout_enter_exit_scene_sample_register.xml │ │ ├── layout_explode_base_scene_a.xml │ │ ├── layout_explode_base_scene_b.xml │ │ ├── layout_scene_sample_content_by_layout_id.xml │ │ ├── layout_search_bar_scene_sample_first_content.xml │ │ ├── layout_search_bar_scene_sample_second_content.xml │ │ ├── layout_transition_base_overview_scene_a.xml │ │ ├── layout_transition_base_overview_scene_b.xml │ │ ├── layout_transition_change_clip_bounds_overview_scene_a.xml │ │ ├── layout_transition_change_clip_bounds_overview_scene_b.xml │ │ ├── layout_transition_change_image_transform_overview_scene_a.xml │ │ ├── layout_transition_change_image_transform_overview_scene_b.xml │ │ ├── layout_transition_change_scroll_scene.xml │ │ ├── layout_transition_change_transform_overview_scene_a.xml │ │ ├── layout_transition_change_transform_overview_scene_b.xml │ │ ├── layout_transition_icon_image_transition_overview_scene_a.xml │ │ ├── layout_transition_icon_image_transition_overview_scene_b.xml │ │ ├── layout_transition_overview_scene_a.xml │ │ └── layout_transition_overview_scene_b.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── transition │ │ ├── auto_transition.xml │ │ └── slide.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # Intellij 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/dictionaries 41 | .idea/libraries 42 | 43 | # Keystore files 44 | *.jks 45 | 46 | # External native build folder generated in Android Studio 2.2 and later 47 | .externalNativeBuild 48 | 49 | # Google Services (e.g. APIs or Firebase) 50 | google-services.json 51 | 52 | # Freeline 53 | freeline.py 54 | freeline/ 55 | freeline_project_description.json 56 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | 6 | android { 7 | compileSdkVersion 27 8 | defaultConfig { 9 | applicationId "com.shevart.androidtransitions" 10 | minSdkVersion 21 11 | targetSdkVersion 27 12 | versionCode 1 13 | versionName "1.0" 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | androidExtensions { 25 | experimental = true 26 | } 27 | 28 | dependencies { 29 | implementation fileTree(dir: 'libs', include: ['*.jar']) 30 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 31 | implementation 'com.android.support:appcompat-v7:27.1.1' 32 | implementation 'com.android.support:cardview-v7:27.1.1' 33 | implementation 'com.android.support.constraint:constraint-layout:1.1.2' 34 | implementation 'com.android.support:design:27.1.1' 35 | implementation 'com.android.support:support-v4:27.1.1' 36 | implementation 'androidx.core:core-ktx:0.3' 37 | implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' 38 | implementation 'io.reactivex.rxjava2:rxjava:2.1.16' 39 | } 40 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.view.Window 6 | import com.shevart.androidtransitions.base.AbsActivity 7 | import com.shevart.androidtransitions.scene.samples.bylayoutid.ContentByLayoutIdSceneSampleActivity 8 | import com.shevart.androidtransitions.scene.samples.enterexitaction.EnterAndExitActionSceneSampleActivity 9 | import com.shevart.androidtransitions.scene.samples.searchbar.SearchBarSceneSampleActivity 10 | import com.shevart.androidtransitions.util.Launcher 11 | import kotlinx.android.synthetic.main.activity_main.* 12 | 13 | class MainActivity : AbsActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | window.apply { 18 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 19 | } 20 | setContentView(R.layout.activity_main) 21 | 22 | btScene.setOnClickListener { 23 | // todo replace to Launcher 24 | startActivity(Intent(this, SearchBarSceneSampleActivity::class.java)) 25 | startActivity(Intent(this, ContentByLayoutIdSceneSampleActivity::class.java)) 26 | startActivity(Intent(this, EnterAndExitActionSceneSampleActivity::class.java)) 27 | } 28 | btTransition.setOnClickListener { 29 | Launcher.Transition.explodeBoundsTransitionOverview(this) 30 | Launcher.Transition.changeBoundsArcMotionOverview(this) 31 | Launcher.Transition.changeBoundsPatternPathMotionOverview(this) 32 | Launcher.Transition.changeImageTransformOverview(this) 33 | Launcher.Transition.changeScrollOverview(this) 34 | Launcher.Transition.autoTransitionOverview(this) 35 | Launcher.Transition.changeClipBoundsOverview(this) 36 | Launcher.Transition.fadeTransitionOverview(this) 37 | Launcher.Transition.changeBoundsTransitionOverview(this) 38 | Launcher.Transition.slideBoundsTransitionOverview(this) 39 | Launcher.Transition.changeTransformOverview(this) 40 | Launcher.Transition.Custom.changeIconImageTransitionOverview(this) 41 | } 42 | btTransitionManager.setOnClickListener { 43 | Launcher.TransitionManager.beginDelayedSample(this) 44 | } 45 | btScreenTransitions.setOnClickListener { 46 | Launcher.ScreenTransitions.menu(this) 47 | } 48 | btSpecialCases.setOnClickListener { 49 | Launcher.SpecialCases.triangleScreens(this) 50 | } 51 | btAdvanced.setOnClickListener { 52 | // Launcher.Advanced.mvp(this) 53 | Launcher.Advanced.polish(this) 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/Description.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/Description.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/CleanCodeTransitionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean.code 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | 7 | class CleanCodeTransitionActivity : AbsActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | initContentTransition() 12 | initSharedElementsTransition() 13 | setContentView(R.layout.activity_clean_code_transition) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/CleanCodeTransitionUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean.code 2 | 3 | import android.app.Activity 4 | import android.transition.Slide 5 | import android.transition.TransitionInflater 6 | import android.view.Window 7 | 8 | fun Activity.initContentTransition() { 9 | window.apply { 10 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 11 | enterTransition = Slide() 12 | } 13 | } 14 | 15 | fun Activity.initSharedElementsTransition() { 16 | window.apply { 17 | requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) 18 | sharedElementEnterTransition = TransitionInflater 19 | .from(this@initSharedElementsTransition) 20 | .inflateTransition(android.R.transition.move) 21 | } 22 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/delegates/CleanCodeDelegateTransitionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean.code.delegates 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | 7 | class CleanCodeDelegateTransitionActivity : AbsActivity(), 8 | ContentTransitionProvider by SimpleContentTransitionDelegate() { 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | initContentTransitionByDelegate(this) 13 | setContentView(R.layout.activity_clean_code_delegate_transition) 14 | } 15 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/delegates/ContentTransitionProvider.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean.code.delegates 2 | 3 | import android.transition.Transition 4 | 5 | @Suppress("unused") 6 | interface ContentTransitionProvider { 7 | fun provideEnterTransition(): Transition? 8 | 9 | fun provideExitTransition(): Transition? 10 | 11 | fun provideReturnTransition(): Transition? 12 | 13 | fun provideReenterTransition(): Transition? 14 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/delegates/SimpleContentTransitionDelegate.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.clean.code.delegates 2 | 3 | import android.transition.Slide 4 | 5 | @Suppress("ImplicitNullableNothingType", "unused") 6 | class SimpleContentTransitionDelegate : ContentTransitionProvider { 7 | override fun provideEnterTransition() = Slide() 8 | 9 | override fun provideExitTransition() = Slide() 10 | 11 | override fun provideReturnTransition() = null 12 | 13 | override fun provideReenterTransition() = null 14 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/clean/code/delegates/TransitionDelegatesUtil.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused") 2 | 3 | package com.shevart.androidtransitions.advanced.clean.code.delegates 4 | 5 | import android.app.Activity 6 | import android.support.v4.app.Fragment 7 | import android.view.Window 8 | 9 | fun Activity.initContentTransitionByDelegate(tp: ContentTransitionProvider) { 10 | window.apply { 11 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 12 | enterTransition = tp.provideEnterTransition() 13 | exitTransition = tp.provideExitTransition() 14 | reenterTransition = tp.provideReenterTransition() 15 | returnTransition = tp.provideReturnTransition() 16 | } 17 | } 18 | 19 | fun Fragment.initContentTransitionByDelegate(tp: ContentTransitionProvider) { 20 | enterTransition = tp.provideEnterTransition() 21 | exitTransition = tp.provideExitTransition() 22 | reenterTransition = tp.provideReenterTransition() 23 | returnTransition = tp.provideReturnTransition() 24 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/Description.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/MvpTransitionSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp 2 | 3 | import android.os.Bundle 4 | import android.support.transition.Transition 5 | import android.support.v7.widget.LinearLayoutManager 6 | import android.transition.Explode 7 | import android.transition.Slide 8 | import android.transition.TransitionSet 9 | import android.view.Gravity 10 | import androidx.core.view.doOnPreDraw 11 | import androidx.core.view.postDelayed 12 | import com.shevart.androidtransitions.R 13 | import com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base.AbsMvpTransitionActivity 14 | import com.shevart.androidtransitions.common.MockSimpleItemAdapter 15 | import com.shevart.androidtransitions.common.SimpleItem 16 | import com.shevart.androidtransitions.util.nextSimpleItemsList 17 | import kotlinx.android.synthetic.main.activity_mvp_transition_sample.* 18 | 19 | class MvpTransitionSampleActivity : AbsMvpTransitionActivity(), SampleTransitionContract.View { 21 | override fun provideView() = this 22 | 23 | override fun providePresenter() = Presenter() 24 | 25 | override fun displayData(items: List) { 26 | (rvSimpleItems.adapter as? MockSimpleItemAdapter)?.updateItems(items) 27 | rvSimpleItems.doOnPreDraw { 28 | it.postDelayed(55) { startPostponedEnterTransition() } 29 | } 30 | } 31 | 32 | override fun onCreate(savedInstanceState: Bundle?) { 33 | super.onCreate(savedInstanceState) 34 | setContentView(R.layout.activity_mvp_transition_sample) 35 | 36 | postponeEnterTransition() 37 | flSampleMvpTransitionRoot.transitionName = getString(R.string.sample_root_transition_name) 38 | rvSimpleItems.layoutManager = LinearLayoutManager(this) 39 | rvSimpleItems.adapter = MockSimpleItemAdapter() 40 | 41 | presenter.loadData() 42 | } 43 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/Presenter.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import androidx.core.os.postDelayed 6 | import com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base.AbsPresenter 7 | import com.shevart.androidtransitions.util.nextSimpleItemsList 8 | 9 | class Presenter : AbsPresenter(), SampleTransitionContract.Presenter { 10 | private val handler = Handler(Looper.getMainLooper()) 11 | 12 | override fun loadData() { 13 | // remove old requests 14 | handler.removeCallbacksAndMessages(null) 15 | // mock data loading 16 | handler.postDelayed(delayInMillis = 500) { 17 | view?.displayData(nextSimpleItemsList()) 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/SampleTransitionContract.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp 2 | 3 | import com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base.BasePresenter 4 | import com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base.BaseView 5 | import com.shevart.androidtransitions.common.SimpleItem 6 | 7 | interface SampleTransitionContract { 8 | interface View: BaseView { 9 | fun displayData(items: List) 10 | } 11 | 12 | interface Presenter : BasePresenter { 13 | fun loadData() 14 | } 15 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/base/AbsMvpTransitionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.advanced.clean.code.initContentTransition 5 | import com.shevart.androidtransitions.advanced.clean.code.initSharedElementsTransition 6 | import com.shevart.androidtransitions.base.AbsActivity 7 | 8 | abstract class AbsMvpTransitionActivity, V: BaseView> : AbsActivity() { 9 | protected lateinit var presenter: P 10 | 11 | protected abstract fun provideView(): V 12 | 13 | protected abstract fun providePresenter(): P 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | initSharedElementsTransition() 17 | super.onCreate(savedInstanceState) 18 | presenter = providePresenter() 19 | presenter.attachView(provideView()) 20 | } 21 | 22 | override fun onDestroy() { 23 | super.onDestroy() 24 | presenter.detachView() 25 | } 26 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/base/AbsPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base 2 | 3 | abstract class AbsPresenter: BasePresenter { 4 | protected var view: V? = null 5 | 6 | override fun attachView(view: V) { 7 | this.view = view 8 | onViewAttached(view) 9 | } 10 | 11 | override fun detachView() { 12 | view = null 13 | onViewDetached() 14 | } 15 | 16 | protected open fun onViewAttached(view: V) {} 17 | 18 | protected open fun onViewDetached() {} 19 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/mvpandmvvmpatterns/mvp/base/BaseMvp.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused") 2 | 3 | package com.shevart.androidtransitions.advanced.mvpandmvvmpatterns.mvp.base 4 | 5 | interface BasePresenter { 6 | fun attachView(view: V) 7 | 8 | fun detachView() 9 | } 10 | 11 | interface BaseView -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/polish/PolishFinishActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.polish 2 | 3 | import android.os.Bundle 4 | import android.support.v7.widget.LinearLayoutManager 5 | import android.transition.Transition 6 | import android.transition.TransitionInflater 7 | import android.view.View 8 | import android.view.Window 9 | import androidx.core.animation.addListener 10 | import androidx.core.view.forEach 11 | import androidx.core.view.forEachIndexed 12 | import com.shevart.androidtransitions.R 13 | import com.shevart.androidtransitions.base.AbsActivity 14 | import com.shevart.androidtransitions.common.AbsTransitionListener 15 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 16 | import com.shevart.androidtransitions.util.hideWithAlpha 17 | import com.shevart.androidtransitions.util.nextSimpleItemsList 18 | import com.shevart.androidtransitions.util.showWithAlpha 19 | import kotlinx.android.synthetic.main.activity_polish_finish.* 20 | 21 | class PolishFinishActivity : AbsActivity() { 22 | private val enterSharedElementsListener = object : AbsTransitionListener() { 23 | override fun onTransitionStopOrCancel(transition: Transition?) { 24 | llSearchBooksRoot.forEach { it.showWithAlpha() } 25 | } 26 | } 27 | 28 | override fun onCreate(savedInstanceState: Bundle?) { 29 | super.onCreate(savedInstanceState) 30 | initTransitions() 31 | setContentView(R.layout.activity_polish_finish) 32 | supportActionBar?.hide() 33 | 34 | ibClose.setOnClickListener { 35 | closeScreen() 36 | } 37 | llSearchBooksRoot.transitionName = "transition_name_search_books_root" 38 | 39 | rvSearchBooks.layoutManager = LinearLayoutManager(this) 40 | rvSearchBooks.adapter = SharedElementsSimpleIItemAdapter().apply { updateItems(nextSimpleItemsList(30)) } 41 | 42 | llSearchBooksRoot.forEach { it.visibility = View.INVISIBLE } 43 | } 44 | 45 | override fun onBackPressed() { 46 | closeScreen() 47 | } 48 | 49 | private fun closeScreen() { 50 | llSearchBooksRoot.forEachIndexed { index, view -> 51 | if (index == llSearchBooksRoot.childCount - 1) { 52 | view.hideWithAlpha().addListener(onEnd = { 53 | finishAfterTransition() 54 | }) 55 | } else { 56 | view.hideWithAlpha() 57 | } 58 | } 59 | } 60 | 61 | private fun initTransitions() { 62 | window.apply { 63 | requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) 64 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 65 | 66 | sharedElementEnterTransition = TransitionInflater 67 | .from(this@PolishFinishActivity) 68 | .inflateTransition(android.R.transition.move).apply { 69 | addListener(enterSharedElementsListener) 70 | duration = 300L 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/advanced/polish/PolishStartActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.advanced.polish 2 | 3 | import android.app.ActivityOptions 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import android.transition.Explode 7 | import android.transition.Fade 8 | import android.transition.Slide 9 | import android.transition.TransitionSet 10 | import android.view.Gravity 11 | import android.view.View 12 | import android.view.Window 13 | import androidx.core.view.doOnPreDraw 14 | import androidx.core.view.postDelayed 15 | import com.shevart.androidtransitions.R 16 | import com.shevart.androidtransitions.base.AbsActivity 17 | import kotlinx.android.synthetic.main.activity_polish_start.* 18 | 19 | class PolishStartActivity : AbsActivity() { 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | initContentTransition() 24 | setContentView(R.layout.activity_polish_start) 25 | supportActionBar?.hide() 26 | 27 | postponeEnterTransition() 28 | tvBooksTitle.doOnPreDraw { 29 | tvBooksTitle.postDelayed(55) { startPostponedEnterTransition() } 30 | } 31 | 32 | cvSearchBox.transitionName = "transition_name_search_books_root" 33 | cvSearchBox.setOnClickListener { 34 | openSearchBooksScreen(cvSearchBox) 35 | } 36 | } 37 | 38 | private fun openSearchBooksScreen(view: View) { 39 | val intent = Intent(this, PolishFinishActivity::class.java) 40 | val options = ActivityOptions.makeSceneTransitionAnimation(this, 41 | view, view.transitionName).toBundle() 42 | startActivity(intent, options) 43 | } 44 | 45 | private fun initContentTransition() { 46 | window.apply { 47 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 48 | allowEnterTransitionOverlap = true 49 | this.enterTransition = TransitionSet().apply { 50 | addTransition(Slide(Gravity.TOP).addTarget(R.id.tvBooksTitle)) 51 | addTransition(Slide(Gravity.TOP).addTarget(R.id.tvBooksDescription)) 52 | addTransition(Fade().addTarget(R.id.cvSearchBox)) 53 | duration = 300L 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/base/AbsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.base 2 | 3 | import android.support.v7.app.AppCompatActivity 4 | import android.view.MenuItem 5 | import android.widget.Toast 6 | 7 | abstract class AbsActivity : AppCompatActivity() { 8 | protected fun enableToolbarBackButton() { 9 | supportActionBar?.setDisplayHomeAsUpEnabled(true) 10 | supportActionBar?.setDisplayShowHomeEnabled(true) 11 | } 12 | 13 | protected fun disableToolbarBackButton() { 14 | supportActionBar?.setDisplayHomeAsUpEnabled(false) 15 | supportActionBar?.setDisplayShowHomeEnabled(false) 16 | } 17 | 18 | protected fun hideToolbar() { 19 | supportActionBar?.hide() 20 | } 21 | 22 | override fun onOptionsItemSelected(item: MenuItem): Boolean { 23 | if (item.itemId == android.R.id.home) { 24 | onBackPressed() 25 | return true 26 | } 27 | return super.onOptionsItemSelected(item) 28 | } 29 | 30 | protected fun showToast(msg: String) { 31 | Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/base/AbsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.base 2 | 3 | import android.os.Bundle 4 | import android.support.annotation.LayoutRes 5 | import android.support.v4.app.Fragment 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import android.widget.TextView 10 | import android.widget.Toast 11 | import com.shevart.androidtransitions.R 12 | 13 | abstract class AbsFragment : Fragment() { 14 | @LayoutRes 15 | protected abstract fun provideLayoutResId(): Int 16 | 17 | final override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 18 | savedInstanceState: Bundle?): View? { 19 | return inflater.inflate(provideLayoutResId(), container, false) 20 | } 21 | 22 | protected fun showToast(msg: String) { 23 | Toast.makeText(context!!, msg, Toast.LENGTH_SHORT).show() 24 | } 25 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/base/BaseRVAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.base 2 | 3 | import android.support.annotation.LayoutRes 4 | import android.support.v7.widget.RecyclerView 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import com.shevart.androidtransitions.util.inflate 8 | 9 | @Suppress("unused") 10 | abstract class BaseRVAdapter : RecyclerView.Adapter() { 11 | private val items = ArrayList() 12 | protected var itemClickListener: OnItemClickListener? = null 13 | 14 | protected fun inflateView(parent: ViewGroup, @LayoutRes layoutRes: Int): View = 15 | inflate(parent, layoutRes) 16 | 17 | override fun getItemCount() = items.size 18 | 19 | fun setOnItemClickListener(itemClickListener: OnItemClickListener) { 20 | this.itemClickListener = itemClickListener 21 | } 22 | 23 | fun setOnItemClickListener(action: (item: M) -> Unit) { 24 | this.itemClickListener = object : OnItemClickListener { 25 | override fun onItemClick(item: M) { 26 | action(item) 27 | } 28 | } 29 | } 30 | 31 | fun removeOnItemClickListener() { 32 | this.itemClickListener = null 33 | } 34 | 35 | protected open fun getItem(pos: Int) = items[pos] 36 | 37 | open fun updateItems(items: List) { 38 | this.items.clear() 39 | this.items.addAll(items) 40 | notifyDataSetChanged() 41 | } 42 | 43 | interface OnItemClickListener { 44 | fun onItemClick(item: M) 45 | } 46 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/common/AbsTransitionListener.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.common 2 | 3 | import android.transition.Transition 4 | 5 | abstract class AbsTransitionListener : Transition.TransitionListener { 6 | override fun onTransitionEnd(transition: Transition?) { 7 | onTransitionStopOrCancel(transition) 8 | } 9 | 10 | override fun onTransitionResume(transition: Transition?) { 11 | 12 | } 13 | 14 | override fun onTransitionPause(transition: Transition?) { 15 | 16 | } 17 | 18 | override fun onTransitionCancel(transition: Transition?) { 19 | onTransitionStopOrCancel(transition) 20 | } 21 | 22 | override fun onTransitionStart(transition: Transition?) { 23 | 24 | } 25 | 26 | protected open fun onTransitionStopOrCancel(transition: Transition?) { 27 | 28 | } 29 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/common/MockItemListDetailHost.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.common 2 | 3 | import android.support.v4.app.Fragment 4 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 5 | 6 | interface MockItemListDetailHost : SharedElementsSimpleIItemAdapter.OnItemViewClickListener { 7 | fun provideItems(): List 8 | } 9 | 10 | fun Fragment.getItemsHost() = 11 | activity as MockItemListDetailHost -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/common/MockSimpleItemAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.common 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.ImageView 7 | import android.widget.TextView 8 | import com.shevart.androidtransitions.R 9 | import com.shevart.androidtransitions.base.BaseRVAdapter 10 | import com.shevart.androidtransitions.util.imageViewTransitionName 11 | import com.shevart.androidtransitions.util.rootViewTransitionName 12 | 13 | @Suppress("unused") 14 | open class MockSimpleItemAdapter : BaseRVAdapter() { 15 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 16 | ViewHolder(inflateView(parent, R.layout.item_simple)).apply { 17 | rootView.setOnClickListener { 18 | itemClickListener?.onItemClick(getItem(adapterPosition)) 19 | } 20 | } 21 | 22 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 23 | val item = getItem(position) 24 | holder.apply { 25 | ivImage.setImageResource(item.imageResId) 26 | tvTitle.text = item.title 27 | tvText.text = item.text 28 | rootView.transitionName = item.rootViewTransitionName() 29 | ivImage.transitionName = item.imageViewTransitionName() 30 | } 31 | } 32 | 33 | class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 34 | val rootView = itemView.findViewById(R.id.clSimpleItemRoot)!! 35 | val ivImage = itemView.findViewById(R.id.ivSimpleItem)!! 36 | val tvTitle = itemView.findViewById(R.id.tvSimpleItemTitle)!! 37 | val tvText = itemView.findViewById(R.id.tvSimpleItemText)!! 38 | } 39 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/common/SimpleItem.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.common 2 | 3 | import android.os.Parcelable 4 | import android.support.annotation.DrawableRes 5 | import kotlinx.android.parcel.Parcelize 6 | 7 | @Parcelize 8 | data class SimpleItem(val id: Int, 9 | @DrawableRes 10 | val imageResId: Int, 11 | val title: String, 12 | val text: String) : Parcelable -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/customtransitions/Overview.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.customtransitions 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/scene/SceneTopicActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.scene 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | 7 | class SceneTopicActivity : AbsActivity() { 8 | 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | setContentView(R.layout.activity_scene_topic) 12 | 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/scene/samples/bylayoutid/ContentByLayoutIdSceneSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.scene.samples.bylayoutid 2 | 3 | import android.os.Bundle 4 | import android.transition.* 5 | import com.shevart.androidtransitions.R 6 | import com.shevart.androidtransitions.base.AbsActivity 7 | import kotlinx.android.synthetic.main.activity_content_by_layout_id_scene_sample.* 8 | 9 | class ContentByLayoutIdSceneSampleActivity : AbsActivity() { 10 | private lateinit var scene: Scene 11 | 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | setContentView(R.layout.activity_content_by_layout_id_scene_sample) 15 | 16 | ivBack.setOnClickListener { finish() } 17 | ivClearContent.setOnClickListener { cardView.removeAllViews() } 18 | 19 | val scene = Scene.getSceneForLayout(cardView, R.layout.layout_scene_sample_content_by_layout_id, this) 20 | 21 | btEnterNoAnim.setOnClickListener { 22 | scene.enter() 23 | } 24 | btEnterDefAnim.setOnClickListener { 25 | TransitionManager.go(scene) 26 | } 27 | btEnterCustomAnim.setOnClickListener { 28 | val imageFadeTransition = Fade().addTarget(R.id.ivSea) 29 | val textSlideTransition = Slide().addTarget(R.id.tvSea) 30 | 31 | val customAnimTransition = TransitionSet().apply { 32 | duration = 1000L // 1 sec 33 | addTransition(imageFadeTransition) 34 | addTransition(textSlideTransition) 35 | } 36 | 37 | TransitionManager.go(scene, customAnimTransition) 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/scene/samples/enterexitaction/EnterAndExitActionSceneSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.scene.samples.enterexitaction 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | import android.transition.Fade 6 | import android.transition.Scene 7 | import android.transition.TransitionManager 8 | import android.view.View 9 | import com.shevart.androidtransitions.R 10 | import kotlinx.android.synthetic.main.activity_enter_and_exit_action_scene_sample.* 11 | 12 | class EnterAndExitActionSceneSampleActivity : AppCompatActivity() { 13 | private lateinit var logoScene: Scene 14 | private lateinit var loginScene: Scene 15 | private lateinit var registerScene: Scene 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | setContentView(R.layout.activity_enter_and_exit_action_scene_sample) 20 | ivBack.setOnClickListener { finish() } 21 | 22 | logoScene = Scene(rootView) 23 | logoScene.setEnterAction { logoLayout.visibility = View.VISIBLE } 24 | logoScene.setExitAction { logoLayout.visibility = View.GONE } 25 | 26 | // apply logo scene 27 | TransitionManager.go(logoScene, getLogoStartAnimation()) 28 | 29 | loginScene = Scene(rootView) 30 | loginScene.setEnterAction { loginLayout.visibility = View.VISIBLE } 31 | loginScene.setExitAction { loginLayout.visibility = View.GONE } 32 | 33 | registerScene = Scene(rootView) 34 | registerScene.setEnterAction { registerLayout.visibility = View.VISIBLE } 35 | registerScene.setExitAction { registerLayout.visibility = View.GONE } 36 | 37 | btLogin.setOnClickListener { 38 | TransitionManager.go(loginScene) 39 | } 40 | btRegister.setOnClickListener { 41 | TransitionManager.go(registerScene) 42 | } 43 | } 44 | 45 | private fun getLogoStartAnimation() = Fade().apply { 46 | duration = 1000L // 1 sec 47 | startDelay = 500L // 0.5 sec 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/scene/samples/searchbar/SearchBarSceneSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.scene.samples.searchbar 2 | 3 | import android.os.Bundle 4 | import android.transition.* 5 | import android.view.Gravity 6 | import android.widget.ImageView 7 | import com.shevart.androidtransitions.R 8 | import com.shevart.androidtransitions.base.AbsActivity 9 | import kotlinx.android.synthetic.main.activity_search_bar_scene_sample.* 10 | 11 | class SearchBarSceneSampleActivity : AbsActivity() { 12 | private lateinit var sceneFirst: Scene 13 | private lateinit var sceneSecond: Scene 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContentView(R.layout.activity_search_bar_scene_sample) 18 | hideToolbar() 19 | 20 | sceneFirst = Scene.getSceneForLayout(cvSceneRoot, R.layout.layout_search_bar_scene_sample_first_content, this) 21 | sceneSecond = Scene.getSceneForLayout(cvSceneRoot, R.layout.layout_search_bar_scene_sample_second_content, this) 22 | 23 | val startTransition = TransitionSet() 24 | startTransition.startDelay = 500L 25 | startTransition.duration = 300L 26 | startTransition.ordering = TransitionSet.ORDERING_TOGETHER 27 | 28 | val titleEnterTransition = TransitionSet().apply { 29 | addTransition(Fade()) 30 | addTransition(Slide(Gravity.END)) 31 | addTarget(R.id.tvTitle) 32 | } 33 | startTransition.addTransition(titleEnterTransition) 34 | 35 | val slide = Slide(Gravity.END) 36 | .addTarget(R.id.ivSearch) 37 | .addTarget(R.id.ivOptionMenu) 38 | startTransition.addTransition(slide) 39 | startTransition.addTransition(Slide(Gravity.START).addTarget(R.id.ivMenu)) 40 | 41 | TransitionManager.go(sceneFirst, startTransition) 42 | 43 | sceneFirst.sceneRoot.findViewById(R.id.ivMenu).setOnClickListener { 44 | TransitionManager.go(sceneSecond, startTransition) 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/ScreenTransitionsTopicActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | import com.shevart.androidtransitions.util.Launcher 7 | import kotlinx.android.synthetic.main.activity_screen_transitions_topic.* 8 | 9 | class ScreenTransitionsTopicActivity : AbsActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_screen_transitions_topic) 14 | enableToolbarBackButton() 15 | 16 | btFragmentsContentTransition.setOnClickListener { 17 | Launcher.ScreenTransitions.Content.fragmentsSample(this) 18 | } 19 | btActivityContentTransitionByTheme.setOnClickListener { 20 | Launcher.ScreenTransitions.Content.activitySampleByTheme(this) 21 | } 22 | btActivityContentTransitionProgrammatically.setOnClickListener { 23 | Launcher.ScreenTransitions.Content.activitySampleProgrammatically(this) 24 | } 25 | btSharedElementsFragments.setOnClickListener { 26 | Launcher.ScreenTransitions.SharedElements.fragment(this) 27 | } 28 | btSharedElementsActivityByTheme.setOnClickListener { 29 | Launcher.ScreenTransitions.SharedElements.activityByTheme(this) 30 | } 31 | btSharedElementsCallback.setOnClickListener { 32 | Launcher.ScreenTransitions.SharedElements.sharedElementsCallback(this) 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/activity/bytheme/ContentTransitionByThemeScreenAActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.activity.bytheme 2 | 3 | import android.app.ActivityOptions 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import android.support.v7.widget.LinearLayoutManager 7 | import com.shevart.androidtransitions.R 8 | import com.shevart.androidtransitions.base.AbsActivity 9 | import com.shevart.androidtransitions.common.MockSimpleItemAdapter 10 | import com.shevart.androidtransitions.common.SimpleItem 11 | import com.shevart.androidtransitions.screenstransition.screencontents.activity.bytheme.ContentTransitionByThemeScreenBActivity.Companion.SIMPLE_ITEM 12 | import com.shevart.androidtransitions.util.nextSimpleItemsList 13 | import kotlinx.android.synthetic.main.activity_content_transition_by_theme_screen_a.* 14 | 15 | @Suppress("UNUSED_PARAMETER") 16 | class ContentTransitionByThemeScreenAActivity : AbsActivity() { 17 | 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | setContentView(R.layout.activity_content_transition_by_theme_screen_a) 21 | initToolbar() 22 | 23 | val adapter = MockSimpleItemAdapter() 24 | adapter.updateItems(nextSimpleItemsList()) 25 | adapter.setOnItemClickListener(this::onItemSelected) 26 | rvNotifications.layoutManager = LinearLayoutManager(this) 27 | rvNotifications.adapter = adapter 28 | } 29 | 30 | private fun initToolbar() { 31 | enableToolbarBackButton() 32 | setTitle(R.string.activity_content_by_theme) 33 | } 34 | 35 | private fun onItemSelected(item: SimpleItem) { 36 | val intent = Intent(this, ContentTransitionByThemeScreenBActivity::class.java) 37 | intent.putExtra(SIMPLE_ITEM, item) 38 | startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/activity/bytheme/ContentTransitionByThemeScreenBActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.activity.bytheme 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import com.shevart.androidtransitions.R 6 | import com.shevart.androidtransitions.base.AbsActivity 7 | import com.shevart.androidtransitions.common.SimpleItem 8 | import kotlinx.android.synthetic.main.layout_detail_screen.* 9 | 10 | class ContentTransitionByThemeScreenBActivity : AbsActivity() { 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_content_transition_by_theme_screen_b) 14 | initToolbar() 15 | 16 | val item = getSimpleItem(intent) 17 | ivDetailScreenImage.setImageResource(item.imageResId) 18 | tvDetailScreenTitle.text = item.title 19 | tvDetailScreenText.text = item.text 20 | } 21 | 22 | private fun initToolbar() { 23 | enableToolbarBackButton() 24 | setTitle(R.string.activity_content_by_theme) 25 | } 26 | 27 | companion object { 28 | const val SIMPLE_ITEM = "SIMPLE_ITEM" 29 | 30 | fun getSimpleItem(intent: Intent) = intent.getParcelableExtra(SIMPLE_ITEM)!! 31 | } 32 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/activity/programmatically/FirstContentProgrammaticallyActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.activity.programmatically 2 | 3 | import android.app.ActivityOptions 4 | import android.content.Intent 5 | import android.os.Bundle 6 | import android.transition.Explode 7 | import android.support.v7.widget.LinearLayoutManager 8 | import android.view.Window 9 | import com.shevart.androidtransitions.R 10 | import com.shevart.androidtransitions.base.AbsActivity 11 | import com.shevart.androidtransitions.common.MockSimpleItemAdapter 12 | import com.shevart.androidtransitions.common.SimpleItem 13 | import com.shevart.androidtransitions.screenstransition.screencontents.activity.programmatically.SecondContentProgrammaticallyActivity.Companion.SIMPLE_ITEM 14 | import com.shevart.androidtransitions.util.nextSimpleItemsList 15 | import kotlinx.android.synthetic.main.activity_first_content_programmatically.* 16 | 17 | class FirstContentProgrammaticallyActivity : AbsActivity() { 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | // set content transitions 21 | setContentTransition() 22 | setContentView(R.layout.activity_first_content_programmatically) 23 | initToolbar() 24 | 25 | val adapter = MockSimpleItemAdapter() 26 | adapter.updateItems(nextSimpleItemsList()) 27 | adapter.setOnItemClickListener(this::onItemSelected) 28 | rvPCScreenA.adapter = adapter 29 | rvPCScreenA.layoutManager = LinearLayoutManager(this) 30 | } 31 | 32 | private fun setContentTransition() { 33 | window.apply { 34 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 35 | exitTransition = Explode() 36 | } 37 | } 38 | 39 | private fun initToolbar() { 40 | enableToolbarBackButton() 41 | setTitle(R.string.activity_content_programmatically) 42 | } 43 | 44 | private fun onItemSelected(item: SimpleItem) { 45 | val intent = Intent(this, SecondContentProgrammaticallyActivity::class.java) 46 | intent.putExtra(SIMPLE_ITEM, item) 47 | startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/activity/programmatically/SecondContentProgrammaticallyActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.activity.programmatically 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.transition.Fade 6 | import android.view.Window 7 | import com.shevart.androidtransitions.R 8 | import com.shevart.androidtransitions.base.AbsActivity 9 | import com.shevart.androidtransitions.common.SimpleItem 10 | import com.shevart.androidtransitions.screenstransition.screencontents.activity.bytheme.ContentTransitionByThemeScreenBActivity 11 | import kotlinx.android.synthetic.main.layout_detail_screen.* 12 | 13 | @Suppress("unused") 14 | class SecondContentProgrammaticallyActivity : AbsActivity() { 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | // set content transitions 19 | setContentTransition() 20 | setContentView(R.layout.activity_second_content_programmatically) 21 | initToolbar() 22 | 23 | val item = ContentTransitionByThemeScreenBActivity.getSimpleItem(intent) 24 | ivDetailScreenImage.setImageResource(item.imageResId) 25 | tvDetailScreenTitle.text = item.title 26 | tvDetailScreenText.text = item.text 27 | } 28 | 29 | private fun setContentTransition() { 30 | window.apply { 31 | requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 32 | enterTransition = Fade() 33 | } 34 | } 35 | 36 | private fun initToolbar() { 37 | enableToolbarBackButton() 38 | setTitle(R.string.activity_content_programmatically) 39 | } 40 | 41 | companion object { 42 | const val SIMPLE_ITEM = "SIMPLE_ITEM" 43 | 44 | fun getSimpleItem(intent: Intent) = intent.getParcelableExtra(SIMPLE_ITEM)!! 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/fragments/FragmentsScreenContentTransitionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.fragments 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | import com.shevart.androidtransitions.common.SimpleItem 7 | import com.shevart.androidtransitions.util.nextSimpleItemsList 8 | 9 | class FragmentsScreenContentTransitionActivity : AbsActivity(), 10 | SampleContentTransitionsProvider by NoTransitions { 11 | private val simpleItems: List by lazy { nextSimpleItemsList() } 12 | 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | setContentView(R.layout.activity_fragments_screen_content_transition) 16 | enableToolbarBackButton() 17 | 18 | if (supportFragmentManager.findFragmentById(R.id.flFragmentScreenA) == null) { 19 | startContent() 20 | } 21 | } 22 | 23 | fun openDetail(item: SimpleItem) { 24 | val fragment = ScreenBFragment.getInstance(item) 25 | fragment.enterTransition = getDetailScreenEnterTransition() 26 | fragment.returnTransition = getDetailScreenReturnTransition() 27 | 28 | supportFragmentManager 29 | .beginTransaction() 30 | .replace(R.id.flFragmentScreenA, fragment) 31 | .addToBackStack(fragment::class.java.simpleName) 32 | .commit() 33 | } 34 | 35 | fun provideItems() = simpleItems 36 | 37 | private fun startContent() { 38 | val fragment = ScreenAFragment() 39 | fragment.exitTransition = getListScreenExitTransition() 40 | fragment.reenterTransition = getListScreenReenterTransition() 41 | 42 | supportFragmentManager 43 | .beginTransaction() 44 | .add(R.id.flFragmentScreenA, fragment) 45 | .commit() 46 | } 47 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/fragments/SampleContentTransitionsProvider.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.fragments 2 | 3 | import android.support.transition.Transition 4 | 5 | interface SampleContentTransitionsProvider { 6 | fun getListScreenExitTransition(): Transition? 7 | 8 | fun getListScreenReenterTransition(): Transition? 9 | 10 | fun getDetailScreenEnterTransition(): Transition? 11 | 12 | fun getDetailScreenReturnTransition(): Transition? 13 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/fragments/ScreenAFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.v7.widget.LinearLayoutManager 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsFragment 8 | import com.shevart.androidtransitions.common.MockSimpleItemAdapter 9 | import com.shevart.androidtransitions.common.SimpleItem 10 | import kotlinx.android.synthetic.main.fragment_screen_a.* 11 | 12 | class ScreenAFragment : AbsFragment() { 13 | private lateinit var adapter: MockSimpleItemAdapter 14 | 15 | override fun provideLayoutResId() = R.layout.fragment_screen_a 16 | 17 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 18 | super.onViewCreated(view, savedInstanceState) 19 | 20 | adapter = MockSimpleItemAdapter() 21 | adapter.updateItems(getItems()) 22 | adapter.setOnItemClickListener(this::onItemSelected) 23 | rvSimpleItemsScreenA.adapter = adapter 24 | rvSimpleItemsScreenA.layoutManager = LinearLayoutManager(view.context) 25 | } 26 | 27 | private fun onItemSelected(item: SimpleItem) { 28 | (activity as FragmentsScreenContentTransitionActivity).openDetail(item) 29 | } 30 | 31 | private fun getItems() = 32 | (activity as FragmentsScreenContentTransitionActivity).provideItems() 33 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/screencontents/fragments/ScreenBFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.screencontents.fragments 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import com.shevart.androidtransitions.R 6 | import com.shevart.androidtransitions.base.AbsFragment 7 | import com.shevart.androidtransitions.common.SimpleItem 8 | import kotlinx.android.synthetic.main.layout_detail_screen.* 9 | 10 | class ScreenBFragment : AbsFragment() { 11 | override fun provideLayoutResId() = R.layout.fragment_screen_b 12 | 13 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 14 | super.onViewCreated(view, savedInstanceState) 15 | 16 | val simpleItem = getSimpleItem(arguments) 17 | ivDetailScreenImage.setImageResource(simpleItem.imageResId) 18 | tvDetailScreenTitle.text = simpleItem.title 19 | tvDetailScreenText.text = simpleItem.text 20 | } 21 | 22 | companion object { 23 | private const val SIMPLE_ITEM_KEY = "SIMPLE_ITEM_KEY" 24 | 25 | fun getInstance(simpleItem: SimpleItem) = ScreenBFragment().apply { 26 | arguments = Bundle().apply { 27 | putParcelable(SIMPLE_ITEM_KEY, simpleItem) 28 | } 29 | } 30 | 31 | fun getSimpleItem(arg: Bundle?): SimpleItem = arg!!.getParcelable(SIMPLE_ITEM_KEY) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/SharedElementsSimpleIItemAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements 2 | 3 | import android.view.View 4 | import android.view.ViewGroup 5 | import com.shevart.androidtransitions.common.MockSimpleItemAdapter 6 | import com.shevart.androidtransitions.common.SimpleItem 7 | 8 | class SharedElementsSimpleIItemAdapter : MockSimpleItemAdapter() { 9 | var onItemViewClickListener: OnItemViewClickListener? = null 10 | 11 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 12 | super.onCreateViewHolder(parent, viewType).apply { 13 | rootView.setOnClickListener { 14 | onItemViewClickListener?.onItemSelected(getItem(adapterPosition), ivImage) 15 | } 16 | } 17 | 18 | interface OnItemViewClickListener { 19 | fun onItemSelected(item: SimpleItem, view: View) 20 | } 21 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/activity/SharedElementsAActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.activity 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.support.v4.app.ActivityOptionsCompat 6 | import android.support.v7.widget.LinearLayoutManager 7 | import android.transition.ArcMotion 8 | import android.transition.ChangeBounds 9 | import android.transition.Fade 10 | import android.view.View 11 | import android.view.Window 12 | import com.shevart.androidtransitions.R 13 | import com.shevart.androidtransitions.base.AbsActivity 14 | import com.shevart.androidtransitions.common.SimpleItem 15 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 16 | import com.shevart.androidtransitions.util.createDevLogSharedElementCallback 17 | import com.shevart.androidtransitions.util.nextSimpleItemsList 18 | import kotlinx.android.synthetic.main.activity_shared_elements_a.* 19 | 20 | class SharedElementsAActivity : AbsActivity(), SharedElementsSimpleIItemAdapter.OnItemViewClickListener { 21 | private val adapter = SharedElementsSimpleIItemAdapter() 22 | 23 | override fun onCreate(savedInstanceState: Bundle?) { 24 | super.onCreate(savedInstanceState) 25 | sharedElementsInit() 26 | setContentView(R.layout.activity_shared_elements_a) 27 | initToolbar() 28 | 29 | adapter.updateItems(nextSimpleItemsList()) 30 | adapter.onItemViewClickListener = this 31 | rvSimpleItemsScreenA.layoutManager = LinearLayoutManager(this) 32 | rvSimpleItemsScreenA.adapter = adapter 33 | 34 | 35 | // todo remove after test 36 | setEnterSharedElementCallback(createDevLogSharedElementCallback("Enter", "ScreenA")) 37 | setExitSharedElementCallback(createDevLogSharedElementCallback("Exit", "ScreenA")) 38 | } 39 | 40 | override fun onItemSelected(item: SimpleItem, view: View) { 41 | val intent = Intent(this, SharedElementsBActivity::class.java) 42 | intent.putExtra(SharedElementsBActivity.SIMPLE_ITEM, item) 43 | val activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(this, 44 | view, view.transitionName) 45 | startActivity(intent, activityOptions.toBundle()) 46 | } 47 | 48 | private fun initToolbar() { 49 | enableToolbarBackButton() 50 | setTitle(R.string.shared_elements_by_theme) 51 | } 52 | 53 | private fun sharedElementsInit() { 54 | // todo before use stop use SharedElements theme 55 | // window.apply { 56 | // requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) 57 | // requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 58 | // 59 | // sharedElementExitTransition = Fade() 60 | // sharedElementReturnTransition = Fade() 61 | // } 62 | } 63 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/activity/SharedElementsBActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.activity 2 | 3 | import android.content.Intent 4 | import android.graphics.Path 5 | import android.os.Bundle 6 | import android.transition.ArcMotion 7 | import android.transition.ChangeBounds 8 | import android.transition.Fade 9 | import android.transition.PatternPathMotion 10 | import android.view.Window 11 | import android.widget.Button 12 | import android.widget.FrameLayout 13 | import androidx.core.view.doOnPreDraw 14 | import com.shevart.androidtransitions.R 15 | import com.shevart.androidtransitions.base.AbsActivity 16 | import com.shevart.androidtransitions.common.SimpleItem 17 | import com.shevart.androidtransitions.util.createDevLogSharedElementCallback 18 | import com.shevart.androidtransitions.util.imageViewTransitionName 19 | import kotlinx.android.synthetic.main.layout_detail_screen.* 20 | 21 | class SharedElementsBActivity : AbsActivity() { 22 | override fun onCreate(savedInstanceState: Bundle?) { 23 | super.onCreate(savedInstanceState) 24 | sharedElementsInit() 25 | setContentView(R.layout.activity_shared_elements_b) 26 | initToolbar() 27 | 28 | val item = getSimpleItem(intent) 29 | ivDetailScreenImage.setImageResource(item.imageResId) 30 | tvDetailScreenTitle.text = item.title 31 | tvDetailScreenText.text = item.text 32 | 33 | ivDetailScreenImage.transitionName = item.imageViewTransitionName() 34 | 35 | postponeEnterTransition() 36 | ivDetailScreenImage.doOnPreDraw { 37 | startPostponedEnterTransition() 38 | } 39 | 40 | // todo remove after test 41 | setEnterSharedElementCallback(createDevLogSharedElementCallback("Enter", "ScreenB")) 42 | setExitSharedElementCallback(createDevLogSharedElementCallback("Exit", "ScreenB")) 43 | } 44 | 45 | private fun initToolbar() { 46 | enableToolbarBackButton() 47 | setTitle(R.string.shared_elements_by_theme) 48 | } 49 | 50 | private fun sharedElementsInit() { 51 | // todo before use stop use SharedElements theme 52 | window.apply { 53 | requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS) 54 | // requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) 55 | sharedElementEnterTransition = ChangeBounds() 56 | // sharedElementEnterTransition = ChangeBounds().apply { 57 | // pathMotion = PatternPathMotion(createPath()) 58 | // } 59 | // sharedElementReturnTransition = ChangeBounds().apply { pathMotion = ArcMotion() } 60 | } 61 | } 62 | 63 | private fun createPath() = Path().apply { 64 | moveTo(0f,0f) 65 | quadTo(0f,0f, 1f, 0.0f) 66 | quadTo(1f,0.0f, 0.3f, 0.6f) 67 | quadTo(0.3f,0.6f, 1f, 1f) 68 | } 69 | 70 | companion object { 71 | const val SIMPLE_ITEM = "SIMPLE_ITEM" 72 | 73 | fun getSimpleItem(intent: Intent) = intent.getParcelableExtra(SIMPLE_ITEM)!! 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/fragments/FragmentsSharedElementsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.transition.Fade 5 | import android.support.v4.app.SharedElementCallback 6 | import android.view.View 7 | import com.shevart.androidtransitions.R 8 | import com.shevart.androidtransitions.base.AbsActivity 9 | import com.shevart.androidtransitions.common.SimpleItem 10 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 11 | import com.shevart.androidtransitions.util.createDevLogSharedElementCallback 12 | import com.shevart.androidtransitions.util.nextSimpleItemsList 13 | 14 | class FragmentsSharedElementsActivity : AbsActivity(), SharedElementsSimpleIItemAdapter.OnItemViewClickListener { 15 | private val items: List by lazy { nextSimpleItemsList() } 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | setContentView(R.layout.activity_fragments_shared_elements_validator) 20 | enableToolbarBackButton() 21 | 22 | if (findCurrentFragment() == null) { 23 | startContent() 24 | } 25 | } 26 | 27 | override fun onItemSelected(item: SimpleItem, view: View) { 28 | val fragment = SharedElementBFragment.getInstance(item) 29 | fragment.enterTransition = Fade() 30 | fragment.enterTransition = Fade().apply { duration = 100L } 31 | 32 | // todo remove after test! 33 | val prevFragment = supportFragmentManager.findFragmentById(R.id.flFragmentsContainer) 34 | prevFragment?.setEnterSharedElementCallback(createDevLogSharedElementCallback("Enter", "ScreenA")) 35 | prevFragment?.setExitSharedElementCallback(createDevLogSharedElementCallback("Exit", "ScreenA")) 36 | 37 | fragment.setEnterSharedElementCallback(createDevLogSharedElementCallback("Enter", "ScreenB")) 38 | fragment.setExitSharedElementCallback(createDevLogSharedElementCallback("Exit", "ScreenB")) 39 | 40 | 41 | supportFragmentManager 42 | .beginTransaction() 43 | .replace(R.id.flFragmentsContainer, fragment) 44 | .addToBackStack(null) 45 | .addSharedElement(view, view.transitionName) 46 | .commit() 47 | } 48 | 49 | fun getMockItemsList() = items 50 | 51 | private fun startContent() { 52 | supportFragmentManager 53 | .beginTransaction() 54 | .add(R.id.flFragmentsContainer, SharedElementAFragment()) 55 | .commit() 56 | } 57 | 58 | private fun findCurrentFragment() = 59 | supportFragmentManager.findFragmentById(R.id.flFragmentsContainer) 60 | } 61 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/fragments/SharedElementAFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.v7.widget.LinearLayoutManager 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsFragment 8 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 9 | import kotlinx.android.synthetic.main.fragment_shared_element_a.* 10 | 11 | class SharedElementAFragment : AbsFragment(){ 12 | private val itemClickListener: SharedElementsSimpleIItemAdapter.OnItemViewClickListener by lazy { 13 | activity as FragmentsSharedElementsActivity 14 | } 15 | 16 | override fun provideLayoutResId() = R.layout.fragment_shared_element_a 17 | 18 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 19 | super.onViewCreated(view, savedInstanceState) 20 | 21 | val adapter = SharedElementsSimpleIItemAdapter() 22 | adapter.updateItems(getItems()) 23 | adapter.onItemViewClickListener = itemClickListener 24 | rvSimpleItemsScreenA.adapter = adapter 25 | rvSimpleItemsScreenA.layoutManager = LinearLayoutManager(context!!) 26 | } 27 | 28 | private fun getItems() = 29 | (activity as FragmentsSharedElementsActivity).getMockItemsList() 30 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/fragments/SharedElementBFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.transition.TransitionInflater 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsFragment 8 | import com.shevart.androidtransitions.common.SimpleItem 9 | import com.shevart.androidtransitions.util.imageViewTransitionName 10 | import kotlinx.android.synthetic.main.layout_detail_screen.* 11 | 12 | class SharedElementBFragment : AbsFragment() { 13 | override fun provideLayoutResId() = R.layout.fragment_shared_element_b 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | sharedElementEnterTransition = TransitionInflater 18 | .from(context) 19 | .inflateTransition(android.R.transition.move) 20 | } 21 | 22 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 23 | super.onViewCreated(view, savedInstanceState) 24 | 25 | val item = getSimpleItem(arguments) 26 | ivDetailScreenImage.setImageResource(item.imageResId) 27 | tvDetailScreenTitle.text = item.title 28 | tvDetailScreenText.text = item.text 29 | 30 | ivDetailScreenImage.transitionName = item.imageViewTransitionName() 31 | } 32 | 33 | companion object { 34 | private const val SIMPLE_ITEM_KEY = "SIMPLE_ITEM_KEY" 35 | 36 | fun getInstance(simpleItem: SimpleItem) = SharedElementBFragment().apply { 37 | arguments = Bundle().apply { 38 | putParcelable(SIMPLE_ITEM_KEY, simpleItem) 39 | } 40 | } 41 | 42 | fun getSimpleItem(arg: Bundle?): SimpleItem = arg!!.getParcelable(SIMPLE_ITEM_KEY) 43 | } 44 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallback/FragmentsSharedElementsCallbackActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallback 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | 7 | class FragmentsSharedElementsCallbackActivity : AbsActivity() { 8 | override fun onCreate(savedInstanceState: Bundle?) { 9 | super.onCreate(savedInstanceState) 10 | setContentView(R.layout.activity_fragments_shared_elements_callback2) 11 | } 12 | 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallback/SecAFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallback 2 | 3 | import android.os.Bundle 4 | import android.support.v4.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.TextView 9 | import com.shevart.androidtransitions.R 10 | 11 | class SecAFragment : Fragment() { 12 | 13 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 14 | savedInstanceState: Bundle?): View? { 15 | return TextView(activity).apply { 16 | setText(R.string.hello_blank_fragment) 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallback/SecBFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallback 2 | 3 | import android.os.Bundle 4 | import android.support.v4.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.TextView 9 | import com.shevart.androidtransitions.R 10 | 11 | class SecBFragment : Fragment() { 12 | 13 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 14 | savedInstanceState: Bundle?): View? { 15 | return TextView(activity).apply { 16 | setText(R.string.hello_blank_fragment) 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/FragmentsSharedElementsCallbackValidatorActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator 2 | 3 | import android.os.Bundle 4 | import android.support.transition.Fade 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsActivity 8 | import com.shevart.androidtransitions.common.MockItemListDetailHost 9 | import com.shevart.androidtransitions.common.SimpleItem 10 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 11 | import com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper.SharedElementsFragmentsHelper 12 | import com.shevart.androidtransitions.util.nextSimpleItemsList 13 | 14 | class FragmentsSharedElementsCallbackValidatorActivity : AbsActivity(), 15 | MockItemListDetailHost { 16 | private val items: List by lazy { nextSimpleItemsList() } 17 | private val validator = SharedElementsFragmentsHelper() 18 | 19 | override fun provideItems() = items 20 | 21 | override fun onItemSelected(item: SimpleItem, view: View) { 22 | openDetailScreen(item, view) 23 | } 24 | 25 | override fun onCreate(savedInstanceState: Bundle?) { 26 | super.onCreate(savedInstanceState) 27 | setContentView(R.layout.activity_fragments_shared_elements_validator) 28 | enableToolbarBackButton() 29 | 30 | if (findCurrentFragment() == null) { 31 | startContent() 32 | } 33 | } 34 | 35 | private fun openDetailScreen(item: SimpleItem, view: View) { 36 | val fragment = SecvBFragment.getInstance(item) 37 | fragment.enterTransition = Fade() 38 | fragment.enterTransition = Fade().apply { duration = 100L } 39 | 40 | val prevFragment = findCurrentFragment()!! 41 | validator.validateSharedElementsScreenTransition( 42 | screenTransitionName = "A-to-B", 43 | fragmentFrom = prevFragment, 44 | fragmentTo = fragment) 45 | 46 | supportFragmentManager 47 | .beginTransaction() 48 | .replace(R.id.flFragmentsContainer, fragment) 49 | .addToBackStack(null) 50 | .addSharedElement(view, view.transitionName) 51 | .commit() 52 | } 53 | 54 | private fun startContent() { 55 | supportFragmentManager 56 | .beginTransaction() 57 | .add(R.id.flFragmentsContainer, SecvAFragment()) 58 | .setReorderingAllowed(true) 59 | .commit() 60 | } 61 | 62 | private fun findCurrentFragment() = 63 | supportFragmentManager.findFragmentById(R.id.flFragmentsContainer) 64 | } 65 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/SecvAFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator 2 | 3 | import android.os.Bundle 4 | import android.support.v7.widget.LinearLayoutManager 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsFragment 8 | import com.shevart.androidtransitions.common.getItemsHost 9 | import com.shevart.androidtransitions.screenstransition.sharedelements.SharedElementsSimpleIItemAdapter 10 | import kotlinx.android.synthetic.main.fragment_shared_element_a.* 11 | 12 | class SecvAFragment : AbsFragment(){ 13 | override fun provideLayoutResId() = R.layout.fragment_shared_element_a 14 | 15 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 16 | super.onViewCreated(view, savedInstanceState) 17 | 18 | val adapter = SharedElementsSimpleIItemAdapter() 19 | adapter.updateItems(getItems()) 20 | adapter.onItemViewClickListener = getItemsHost() 21 | rvSimpleItemsScreenA.adapter = adapter 22 | rvSimpleItemsScreenA.layoutManager = LinearLayoutManager(context!!) 23 | } 24 | 25 | private fun getItems() = getItemsHost().provideItems() 26 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/SecvBFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator 2 | 3 | import android.os.Bundle 4 | import android.support.transition.TransitionInflater 5 | import android.view.View 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.base.AbsFragment 8 | import com.shevart.androidtransitions.common.SimpleItem 9 | import com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper.validateSharedElementsTransition 10 | import com.shevart.androidtransitions.util.imageViewTransitionName 11 | import kotlinx.android.synthetic.main.layout_detail_screen.* 12 | 13 | class SecvBFragment : AbsFragment() { 14 | override fun provideLayoutResId() = R.layout.fragment_shared_element_b 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | sharedElementEnterTransition = TransitionInflater 19 | .from(context) 20 | .inflateTransition(android.R.transition.move) 21 | 22 | /** 23 | * for invalid transition 24 | */ 25 | // sharedElementEnterTransition = null // there is no transition 26 | // sharedElementEnterTransition = Slide() // this transition cannot to move your sharedElements on the screen 27 | } 28 | 29 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 30 | super.onViewCreated(view, savedInstanceState) 31 | 32 | // check is there sharedElements transition? 33 | this.validateSharedElementsTransition(true) 34 | 35 | val item = getSimpleItem(arguments) 36 | ivDetailScreenImage.setImageResource(item.imageResId) 37 | tvDetailScreenTitle.text = item.title 38 | tvDetailScreenText.text = item.text 39 | 40 | /** 41 | * for transitionNames duplicate problem 42 | */ 43 | // tvDetailScreenTitle.transitionName = "bug" 44 | // tvDetailScreenText.transitionName = "bug" 45 | 46 | ivDetailScreenImage.transitionName = item.imageViewTransitionName() 47 | 48 | 49 | /** 50 | * for viewNotReady problem 51 | */ 52 | // view.visibility = View.GONE 53 | // view.doOnPreDraw { 54 | // view.postDelayed(10) { view.visibility = View.VISIBLE } 55 | // } 56 | } 57 | 58 | companion object { 59 | private const val SIMPLE_ITEM_KEY = "SIMPLE_ITEM_KEY" 60 | 61 | fun getInstance(simpleItem: SimpleItem) = SecvBFragment().apply { 62 | arguments = Bundle().apply { 63 | putParcelable(SIMPLE_ITEM_KEY, simpleItem) 64 | } 65 | } 66 | 67 | fun getSimpleItem(arg: Bundle?): SimpleItem = arg!!.getParcelable(SIMPLE_ITEM_KEY) 68 | } 69 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/helper/FragmentSharedElementsTransition.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper 2 | 3 | data class FragmentSharedElementsTransition( 4 | val screenTransitionName: String, 5 | var screenRecordA: FragmentSharedElementsTransitionRecord?, 6 | var screenRecordB: FragmentSharedElementsTransitionRecord?) -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/helper/FragmentSharedElementsTransitionRecord.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper 2 | 3 | data class FragmentSharedElementsTransitionRecord(val viewNames: Set) -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/helper/SupportTransitionValidateUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper 2 | 3 | import android.support.transition.ChangeBounds 4 | import android.support.transition.TransitionSet 5 | import android.support.v4.app.Fragment 6 | 7 | fun Fragment.isSupportChangeBoundsExists(): Boolean { 8 | val transition = this.sharedElementEnterTransition 9 | return if (transition is TransitionSet) { 10 | transition.isChangeBoundsExists() 11 | } else { 12 | transition is ChangeBounds 13 | } 14 | } 15 | 16 | private fun TransitionSet.isChangeBoundsExists(): Boolean { 17 | for (i in 0..this.transitionCount) { 18 | if (this.getTransitionAt(i) is ChangeBounds) { 19 | return true 20 | } 21 | } 22 | return true 23 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/screenstransition/sharedelements/sharedelementscallbackvalidator/helper/TransitionValidateUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.screenstransition.sharedelements.sharedelementscallbackvalidator.helper 2 | 3 | import android.support.v4.app.Fragment 4 | import android.transition.ChangeBounds 5 | import android.transition.TransitionSet 6 | 7 | fun Fragment.isChangeBoundsExists(): Boolean { 8 | val transition = this.sharedElementEnterTransition 9 | return if (transition is TransitionSet) { 10 | transition.isChangeBoundsExists() 11 | } else { 12 | transition is ChangeBounds 13 | } 14 | } 15 | 16 | private fun TransitionSet.isChangeBoundsExists(): Boolean { 17 | for (i in 0..this.transitionCount) { 18 | if (this.getTransitionAt(i) is ChangeBounds) { 19 | return true 20 | } 21 | } 22 | return true 23 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/specialcases/Description.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.specialcases 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/specialcases/screentriangle/fragments/FirstFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.specialcases.screentriangle.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.v4.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | 9 | import com.shevart.androidtransitions.R 10 | import com.shevart.androidtransitions.specialcases.screentriangle.ScreenTriangleStartActivity 11 | import kotlinx.android.synthetic.main.fragment_first.* 12 | 13 | class FirstFragment : Fragment() { 14 | 15 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 16 | savedInstanceState: Bundle?): View? { 17 | // Inflate the layout for this fragment 18 | return inflater.inflate(R.layout.fragment_first, container, false) 19 | } 20 | 21 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 22 | super.onViewCreated(view, savedInstanceState) 23 | 24 | flTriangleSharedElementA.setOnClickListener { 25 | (activity as ScreenTriangleStartActivity).openMiddleActivity(flTriangleSharedElementA) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/specialcases/screentriangle/fragments/ParentWrapperSecondFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.specialcases.screentriangle.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.transition.TransitionInflater 5 | import android.support.v4.app.Fragment 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | 10 | import com.shevart.androidtransitions.R 11 | 12 | class ParentWrapperSecondFragment : Fragment() { 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | sharedElementEnterTransition = TransitionInflater 16 | .from(context) 17 | .inflateTransition(android.R.transition.move) 18 | } 19 | 20 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 21 | savedInstanceState: Bundle?): View? { 22 | return inflater.inflate(R.layout.fragment_parent_wrapper_second, container, false) 23 | } 24 | 25 | @Suppress("ReplaceSingleLineLet") 26 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 27 | super.onViewCreated(view, savedInstanceState) 28 | 29 | childFragmentManager.let { fm -> 30 | fm 31 | .beginTransaction() 32 | .add(R.id.flParentWrapperSecondContainer, SecondFragment()) 33 | .commitAllowingStateLoss() 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/specialcases/screentriangle/fragments/SecondFragment.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.specialcases.screentriangle.fragments 2 | 3 | import android.os.Bundle 4 | import android.support.transition.TransitionInflater 5 | import android.support.v4.app.Fragment 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import androidx.core.view.doOnPreDraw 10 | import com.shevart.androidtransitions.R 11 | import com.shevart.androidtransitions.util.getDebuggingSharedElementsCallback 12 | import kotlinx.android.synthetic.main.fragment_second.* 13 | 14 | class SecondFragment : Fragment() { 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move) 19 | setEnterSharedElementCallback(getDebuggingSharedElementsCallback("FRAGMENT")) 20 | } 21 | 22 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 23 | savedInstanceState: Bundle?): View? { 24 | return inflater.inflate(R.layout.fragment_second, container, false) 25 | } 26 | 27 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 28 | super.onViewCreated(view, savedInstanceState) 29 | 30 | // todo comment this if you want start postponedEnterTransition from Activity 31 | flTriangleSharedElementB.doOnPreDraw { 32 | activity?.startPostponedEnterTransition() 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/TransitionTopicActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition 2 | 3 | import android.os.Bundle 4 | import com.shevart.androidtransitions.R 5 | import com.shevart.androidtransitions.base.AbsActivity 6 | 7 | class TransitionTopicActivity : AbsActivity() { 8 | 9 | 10 | override fun onCreate(savedInstanceState: Bundle?) { 11 | super.onCreate(savedInstanceState) 12 | setContentView(R.layout.activity_transition_topic) 13 | enableToolbarBackButton() 14 | 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/TransitionsOverviewComplexLayoutActivity.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("PrivatePropertyName") 2 | 3 | package com.shevart.androidtransitions.transition.overview 4 | 5 | import android.os.Bundle 6 | import android.support.transition.* 7 | 8 | import com.shevart.androidtransitions.R 9 | import com.shevart.androidtransitions.base.AbsActivity 10 | import kotlinx.android.synthetic.main.activity_transitions_complex_layout_overview.* 11 | 12 | // todo add transition constructor! 13 | class TransitionsOverviewComplexLayoutActivity : AbsActivity() { 14 | private val TWO_SECONDS = 2000L 15 | 16 | private lateinit var sceneA: Scene 17 | private lateinit var sceneB: Scene 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.activity_transitions_complex_layout_overview) 22 | enableToolbarBackButton() 23 | 24 | sceneA = Scene.getSceneForLayout(flTransitionOverviewContainer, 25 | R.layout.layout_transition_overview_scene_a, this) 26 | sceneB = Scene.getSceneForLayout(flTransitionOverviewContainer, 27 | R.layout.layout_transition_overview_scene_b, this) 28 | 29 | btGoToSceneA.setOnClickListener { 30 | TransitionManager.go(sceneA, getCurrentTransition()) 31 | } 32 | btGoToSceneB.setOnClickListener { 33 | TransitionManager.go(sceneB, getCurrentTransition()) 34 | } 35 | 36 | } 37 | 38 | private fun getCurrentTransition() = TransitionSet().apply { 39 | val changeBound = ChangeBounds() 40 | addTransition(changeBound) 41 | 42 | // val changeClipBound = ChangeClipBounds() 43 | // addTransition(changeClipBound) 44 | 45 | addTransition(ChangeTransform()) 46 | 47 | // Slide 48 | // addTransition(Slide()) // whole layout 49 | // addTransition(Slide().excludeTarget(ConstraintLayout::class.java, true)) // only child views 50 | 51 | duration = TWO_SECONDS 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/AbsTransitionBaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.os.Bundle 4 | import android.support.annotation.DrawableRes 5 | import android.support.annotation.LayoutRes 6 | import android.support.transition.Scene 7 | import android.support.transition.Transition 8 | import android.support.transition.TransitionManager 9 | 10 | 11 | import com.shevart.androidtransitions.R 12 | import com.shevart.androidtransitions.base.AbsActivity 13 | import kotlinx.android.synthetic.main.activity_transition_base_overview.* 14 | import kotlinx.android.synthetic.main.layout_base_transition_overview_form.* 15 | 16 | abstract class AbsTransitionBaseActivity : AbsActivity() { 17 | private lateinit var sceneA: Scene 18 | private lateinit var sceneB: Scene 19 | 20 | @DrawableRes 21 | abstract fun provideIcon(): Int 22 | 23 | abstract fun provideTitle(): String 24 | 25 | abstract fun provideTransition(): Transition 26 | 27 | protected fun provideRootView() = flSceneConteiner!! 28 | 29 | @LayoutRes 30 | protected open fun provideLayoutIdSceneA(): Int = R.layout.layout_transition_base_overview_scene_a 31 | 32 | @LayoutRes 33 | protected open fun provideLayoutIdSceneB(): Int = R.layout.layout_transition_base_overview_scene_b 34 | 35 | protected open fun provideSceneA() = 36 | Scene.getSceneForLayout(provideRootView(), provideLayoutIdSceneA(), this) 37 | 38 | protected open fun provideSceneB() = 39 | Scene.getSceneForLayout(provideRootView(), provideLayoutIdSceneB(), this) 40 | 41 | override fun onCreate(savedInstanceState: Bundle?) { 42 | super.onCreate(savedInstanceState) 43 | setContentView(R.layout.activity_transition_base_overview) 44 | enableToolbarBackButton() 45 | 46 | tvBaseTransitionTitle.text = provideTitle() 47 | ivBaseTransitionLogo.setImageResource(provideIcon()) 48 | 49 | sceneA = provideSceneA() 50 | sceneB = provideSceneB() 51 | 52 | btSceneA.setOnClickListener { 53 | TransitionManager.go(sceneA, provideTransition().setBaseParams()) 54 | } 55 | btSceneB.setOnClickListener { 56 | TransitionManager.go(sceneB, provideTransition().setBaseParams()) 57 | } 58 | 59 | sceneA.enter() 60 | } 61 | 62 | private fun Transition.setBaseParams(): Transition { 63 | duration = DURATION 64 | return this 65 | } 66 | 67 | companion object { 68 | private const val DURATION = 1000L 69 | } 70 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/AutoTransitionOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.AutoTransition 4 | import android.support.transition.Transition 5 | import com.shevart.androidtransitions.R 6 | 7 | class AutoTransitionOverviewActivity : AbsTransitionBaseActivity() { 8 | override fun provideIcon() = R.drawable.auto_transition 9 | 10 | override fun provideTitle() = getString(R.string.auto_transition)!! 11 | 12 | override fun provideTransition(): Transition { 13 | return AutoTransition() 14 | } 15 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeBoundsArcMotionOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.ArcMotion 4 | import android.support.transition.ChangeBounds 5 | import android.support.transition.Transition 6 | import com.shevart.androidtransitions.R 7 | 8 | class ChangeBoundsArcMotionOverviewActivity : AbsTransitionBaseActivity() { 9 | override fun provideIcon() = R.drawable.change_bounds_arch_motion 10 | 11 | override fun provideTitle() = getString(R.string.change_bounds_plus_arc_motion)!! 12 | 13 | override fun provideTransition(): Transition { 14 | return ChangeBounds().apply { 15 | setPathMotion(ArcMotion()) 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeBoundsOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.ChangeBounds 4 | import android.support.transition.Transition 5 | import com.shevart.androidtransitions.R 6 | 7 | class ChangeBoundsOverviewActivity : AbsTransitionBaseActivity() { 8 | override fun provideTitle() = getString(R.string.change_bounds)!! 9 | 10 | override fun provideIcon() = R.drawable.change_bounds 11 | 12 | override fun provideTransition(): Transition { 13 | return ChangeBounds() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeBoundsPatternMotionOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.graphics.Path 4 | import android.support.transition.ChangeBounds 5 | import android.support.transition.PatternPathMotion 6 | import android.support.transition.Transition 7 | import com.shevart.androidtransitions.R 8 | 9 | class ChangeBoundsPatternMotionOverviewActivity : AbsTransitionBaseActivity() { 10 | override fun provideIcon() = R.drawable.change_bounds_pattern_path_motion 11 | 12 | override fun provideTitle() = getString(R.string.change_bounds_plus_pattern_path_motion)!! 13 | 14 | override fun provideTransition(): Transition { 15 | val path = createPath() 16 | return ChangeBounds().apply { 17 | setPathMotion(PatternPathMotion(path)) 18 | } 19 | } 20 | 21 | /** 22 | * Create Path with custom motion for transition 23 | * Something like: 24 | * Start 25 | * ----------- 26 | * / 27 | * / 28 | * / 29 | * / 30 | * / 31 | * /___________ End 32 | * 33 | */ 34 | private fun createPath() = Path().apply { 35 | moveTo(0f,0f) 36 | quadTo(0f,0f, 1f, 0.0f) 37 | quadTo(1f,0.0f, 0.3f, 0.6f) 38 | quadTo(0.3f,0.6f, 1f, 1f) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeClipBoundsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.graphics.Rect 4 | import android.support.transition.ChangeClipBounds 5 | import android.support.transition.Scene 6 | import android.support.transition.Transition 7 | import android.widget.ImageView 8 | import com.shevart.androidtransitions.R 9 | 10 | class ChangeClipBoundsActivity : AbsTransitionBaseActivity() { 11 | override fun provideIcon() = R.drawable.change_clip_bounds 12 | 13 | override fun provideTitle() = getString(R.string.change_clip_bounds)!! 14 | 15 | override fun provideLayoutIdSceneA() = R.layout.layout_transition_change_clip_bounds_overview_scene_a 16 | 17 | override fun provideLayoutIdSceneB() = R.layout.layout_transition_change_clip_bounds_overview_scene_b 18 | 19 | override fun provideSceneB(): Scene { 20 | return Scene(provideRootView()).apply { 21 | setEnterAction { 22 | val imageView = findViewById(R.id.ivForChangeClipBounds)!! 23 | var clipBounds = imageView.clipBounds 24 | if (clipBounds == null) { 25 | clipBounds = Rect() 26 | imageView.getWindowVisibleDisplayFrame(clipBounds) 27 | } 28 | clipBounds.bottom /= 2 29 | clipBounds.top /= 2 30 | clipBounds.left /= 2 31 | clipBounds.right /= 2 32 | imageView.clipBounds = clipBounds 33 | } 34 | } 35 | } 36 | 37 | override fun provideTransition(): Transition { 38 | return ChangeClipBounds() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeImageTransformOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.ChangeBounds 4 | import android.support.transition.ChangeImageTransform 5 | import android.support.transition.Transition 6 | import android.support.transition.TransitionSet 7 | import com.shevart.androidtransitions.R 8 | 9 | class ChangeImageTransformOverviewActivity : AbsTransitionBaseActivity() { 10 | override fun provideIcon() = R.drawable.change_image_transform 11 | 12 | override fun provideTitle() = getString(R.string.change_image_transform)!! 13 | 14 | override fun provideLayoutIdSceneA() = R.layout.layout_transition_change_image_transform_overview_scene_a 15 | 16 | override fun provideLayoutIdSceneB() = R.layout.layout_transition_change_image_transform_overview_scene_b 17 | 18 | override fun provideTransition(): Transition { 19 | // return ChangeImageTransform() 20 | return TransitionSet().apply { 21 | addTransition(ChangeImageTransform()) 22 | addTransition(ChangeBounds()) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeScrollOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.ChangeScroll 4 | import android.support.transition.Scene 5 | import android.support.transition.Transition 6 | import android.widget.ScrollView 7 | import com.shevart.androidtransitions.R 8 | 9 | class ChangeScrollOverviewActivity : AbsTransitionBaseActivity() { 10 | override fun provideIcon() = R.drawable.change_scroll 11 | 12 | override fun provideTitle() = getString(R.string.change_scroll)!! 13 | 14 | override fun provideLayoutIdSceneA() = R.layout.layout_transition_change_scroll_scene 15 | 16 | override fun provideSceneB(): Scene { 17 | return Scene(provideRootView()).apply { 18 | setEnterAction { 19 | val scrollView = findViewById(R.id.svChangeScroll)!! 20 | scrollView.scrollTo(0, scrollView.height * 3) 21 | } 22 | } 23 | } 24 | 25 | override fun provideTransition(): Transition { 26 | return ChangeScroll() 27 | } 28 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/ChangeTransformOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.ChangeBounds 4 | import android.support.transition.ChangeTransform 5 | import android.support.transition.Transition 6 | import android.support.transition.TransitionSet 7 | import com.shevart.androidtransitions.R 8 | 9 | class ChangeTransformOverviewActivity : AbsTransitionBaseActivity() { 10 | override fun provideIcon() = R.drawable.change_transform 11 | 12 | override fun provideTitle() = getString(R.string.change_transform)!! 13 | 14 | override fun provideLayoutIdSceneA() = R.layout.layout_transition_change_transform_overview_scene_a 15 | 16 | override fun provideLayoutIdSceneB() = R.layout.layout_transition_change_transform_overview_scene_b 17 | 18 | override fun provideTransition(): Transition { 19 | // return ChangeTransform() // if you return only ChangeTransform the View will be rotate only! 20 | 21 | return TransitionSet().apply { 22 | addTransition(ChangeTransform()) 23 | addTransition(ChangeBounds()) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/FadeOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.Fade 4 | import android.support.transition.Transition 5 | import com.shevart.androidtransitions.R 6 | 7 | class FadeOverviewActivity : AbsTransitionBaseActivity() { 8 | override fun provideIcon() = R.drawable.fade 9 | 10 | override fun provideTitle() = getString(R.string.fade)!! 11 | 12 | override fun provideTransition(): Transition { 13 | return Fade() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/base/SlideOverviewActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.base 2 | 3 | import android.support.transition.Slide 4 | import android.support.transition.Transition 5 | import com.shevart.androidtransitions.R 6 | 7 | class SlideOverviewActivity : AbsTransitionBaseActivity() { 8 | override fun provideIcon() = R.drawable.slide 9 | 10 | override fun provideTitle() = getString(R.string.slide)!! 11 | 12 | override fun provideTransition(): Transition { 13 | return Slide() 14 | } 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transition/overview/custom/ChangeIconImageTransitionActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transition.overview.custom 2 | 3 | import android.support.transition.ChangeBounds 4 | import android.support.transition.Transition 5 | import android.support.transition.TransitionSet 6 | import com.shevart.androidtransitions.R 7 | import com.shevart.androidtransitions.customtransitions.changeicontransitions.ChangeIconImageTransition 8 | import com.shevart.androidtransitions.transition.overview.base.AbsTransitionBaseActivity 9 | 10 | class ChangeIconImageTransitionActivity : AbsTransitionBaseActivity() { 11 | override fun provideIcon() = R.drawable.change_clip_bounds 12 | 13 | override fun provideTitle() = "ChangeIconImageTransition" 14 | 15 | override fun provideLayoutIdSceneA() = R.layout.layout_transition_icon_image_transition_overview_scene_a 16 | 17 | override fun provideLayoutIdSceneB() = R.layout.layout_transition_icon_image_transition_overview_scene_b 18 | 19 | override fun provideTransition(): Transition { 20 | return TransitionSet().apply { 21 | addTransition(ChangeBounds()) 22 | addTransition(ChangeIconImageTransition().addTarget(R.id.ivIcon)) 23 | 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transitionmanager/Temp.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transitionmanager 2 | 3 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/transitionmanager/begindelayedsample/BeginDelayedSampleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.transitionmanager.begindelayedsample 2 | 3 | import android.os.Bundle 4 | import android.support.transition.AutoTransition 5 | import android.support.transition.TransitionManager 6 | import android.view.View 7 | import com.shevart.androidtransitions.R 8 | import com.shevart.androidtransitions.base.AbsActivity 9 | import com.shevart.androidtransitions.util.doOnEnd 10 | import com.shevart.androidtransitions.util.setHeight 11 | import com.shevart.androidtransitions.util.dpToPx 12 | import kotlinx.android.synthetic.main.activity_begin_delayed_sample.* 13 | import java.util.* 14 | 15 | class BeginDelayedSampleActivity : AbsActivity() { 16 | private val oneDpInPixels: Int by lazy { 1.dpToPx() } 17 | private val random = Random() 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.activity_begin_delayed_sample) 22 | enableToolbarBackButton() 23 | 24 | cvLayoutChangesAnim.setOnClickListener { 25 | updateView() 26 | } 27 | } 28 | 29 | private fun updateView() { 30 | flTestContent.visibility = View.INVISIBLE 31 | // create transition and set listener 32 | val transition = AutoTransition() 33 | transition.doOnEnd { showWithAlpha() } 34 | // schedule animation 35 | TransitionManager.beginDelayedTransition(cvLayoutChangesAnim, transition) 36 | // change view 37 | flTestContent.setHeight(nextRandomHeightPx()) 38 | } 39 | 40 | private fun showWithAlpha() { 41 | TransitionManager.beginDelayedTransition(cvLayoutChangesAnim) 42 | flTestContent.visibility = View.VISIBLE 43 | } 44 | 45 | private fun nextRandomHeightPx() = oneDpInPixels * (50 + random.nextInt(250)) 46 | } 47 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/ActivityUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.app.Activity 4 | 5 | fun Int.resultCodeStr(): String = 6 | when(this) { 7 | Activity.RESULT_OK -> "RESULT_OK" 8 | Activity.RESULT_CANCELED -> "RESULT_CANCELED" 9 | else -> "$this" 10 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/MockItemsUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.support.annotation.DrawableRes 4 | import com.shevart.androidtransitions.common.SimpleItem 5 | import java.util.* 6 | import kotlin.collections.ArrayList 7 | 8 | private val random = Random() 9 | 10 | private var id = 1 11 | 12 | fun nextSimpleItemsList(size: Int = 25): List { 13 | return ArrayList().apply { 14 | for (i in 0..size) { 15 | add(nextSimpleItem(i)) 16 | } 17 | } 18 | } 19 | 20 | fun nextSimpleItem(number: Int) = SimpleItem( 21 | id = id++, 22 | imageResId = nextImageResId(), 23 | title = nextTitle(number), 24 | text = longText) 25 | 26 | @DrawableRes 27 | private fun nextImageResId() = 28 | stockImagesMap[random.nextInt(stockImagesMap.size)]!! 29 | 30 | private fun nextTitle(number: Int) = titlesList[random.nextInt(titlesList.size)] -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/MockResourcesPlace.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import com.shevart.androidtransitions.R 4 | 5 | const val longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" + 6 | " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud " + 7 | "exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " + 8 | "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. " + 9 | "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit " + 10 | "anim id est laborum." 11 | 12 | val stockImagesMap: Map = HashMap().apply { 13 | put(0, R.drawable.stock_bus_1) 14 | put(1, R.drawable.stock_bus_2) 15 | put(2, R.drawable.stock_bus_3) 16 | put(3, R.drawable.stock_bus_4) 17 | put(4, R.drawable.stock_bus_5) 18 | put(5, R.drawable.stock_bus_6) 19 | put(6, R.drawable.stock_bus_7) 20 | } 21 | 22 | val titlesList = listOf( 23 | "Important news", 24 | "Great news", 25 | "Uninteresting news", 26 | "Daily News", 27 | "Incredible news") -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/SharedElementsCallbackUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.content.Context 4 | import android.graphics.Matrix 5 | import android.graphics.RectF 6 | import android.os.Parcelable 7 | import android.support.v4.app.SharedElementCallback 8 | import android.util.Log 9 | import android.view.View 10 | 11 | fun createDevLogSharedElementCallback(transitionType: String, screenName: String) = object : SharedElementCallback() { 12 | override fun onCaptureSharedElementSnapshot(sharedElement: View?, 13 | viewToGlobalMatrix: Matrix?, 14 | screenBounds: RectF?): Parcelable { 15 | logMsg(transitionType, screenName, "onCaptureSharedElementSnapshot()") 16 | return super.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix, screenBounds) 17 | } 18 | 19 | override fun onCreateSnapshotView(context: Context?, snapshot: Parcelable?): View { 20 | logMsg(transitionType, screenName, "onCreateSnapshotView()") 21 | return super.onCreateSnapshotView(context, snapshot) 22 | } 23 | 24 | override fun onMapSharedElements(names: MutableList?, 25 | sharedElements: MutableMap?) { 26 | super.onMapSharedElements(names, sharedElements) 27 | logMsg(transitionType, screenName, "onMapSharedElements()") 28 | } 29 | 30 | override fun onRejectSharedElements(rejectedSharedElements: MutableList?) { 31 | super.onRejectSharedElements(rejectedSharedElements) 32 | logMsg(transitionType, screenName, "onRejectSharedElements()") 33 | } 34 | 35 | override fun onSharedElementEnd(sharedElementNames: MutableList?, 36 | sharedElements: MutableList?, 37 | sharedElementSnapshots: MutableList?) { 38 | super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots) 39 | logMsg(transitionType, screenName, "onSharedElementEnd()") 40 | } 41 | 42 | override fun onSharedElementStart(sharedElementNames: MutableList?, 43 | sharedElements: MutableList?, 44 | sharedElementSnapshots: MutableList?) { 45 | super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots) 46 | logMsg(transitionType, screenName, "onSharedElementStart()") 47 | } 48 | 49 | override fun onSharedElementsArrived(sharedElementNames: MutableList?, 50 | sharedElements: MutableList?, 51 | listener: OnSharedElementsReadyListener?) { 52 | super.onSharedElementsArrived(sharedElementNames, sharedElements, listener) 53 | logMsg(transitionType, screenName, "onSharedElementsArrived()") 54 | } 55 | } 56 | 57 | private fun logMsg(transitionType: String, screenName: String, msg: String) { 58 | Log.e("SHARED_ELEM_CALLBACK", "Event: $transitionType, Screen=$screenName, msg=$msg") 59 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/TransitionNameUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import com.shevart.androidtransitions.common.SimpleItem 4 | 5 | fun SimpleItem.rootViewTransitionName() = "root_id=$id" 6 | 7 | fun SimpleItem.imageViewTransitionName() = "image_id=$id" -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/TransitionUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.support.transition.Transition 4 | import android.support.v4.app.SharedElementCallback 5 | import android.util.Log 6 | import android.view.View 7 | 8 | fun Transition.doOnEnd(action: () -> Unit): Transition.TransitionListener { 9 | val listener = object : Transition.TransitionListener { 10 | override fun onTransitionEnd(transition: Transition) { 11 | action() 12 | } 13 | 14 | override fun onTransitionResume(transition: Transition) { 15 | } 16 | 17 | override fun onTransitionPause(transition: Transition) { 18 | } 19 | 20 | override fun onTransitionCancel(transition: Transition) { 21 | } 22 | 23 | override fun onTransitionStart(transition: Transition) { 24 | } 25 | } 26 | this.addListener(listener) 27 | return listener 28 | } 29 | 30 | fun getDebuggingSharedElementsCallback(tag: String) = object : SharedElementCallback() { 31 | override fun onMapSharedElements(names: MutableList?, sharedElements: MutableMap?) { 32 | super.onMapSharedElements(names, sharedElements) 33 | 34 | if (names != null) { 35 | Log.e(tag, "-- Names --") 36 | names.forEach { Log.e(tag, it) } 37 | Log.e(tag, "-- --") 38 | } 39 | if (sharedElements != null) { 40 | Log.e(tag, "-- SharedElements --") 41 | sharedElements.entries.forEach { Log.e(tag, it.toString()) } 42 | Log.e(tag, "-- --") 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/UiUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.content.res.Resources 4 | import android.support.annotation.LayoutRes 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import android.widget.FrameLayout 9 | 10 | fun Int.dpToPx() = (this * Resources.getSystem().displayMetrics.density).toInt() 11 | 12 | fun FrameLayout.setHeight(heightPx: Int) { 13 | this.layoutParams = this.layoutParams.apply { 14 | height = heightPx 15 | } 16 | } 17 | 18 | fun inflate(parent: ViewGroup, @LayoutRes layoutRes: Int): View { 19 | return LayoutInflater.from(parent.context).inflate(layoutRes, parent, false) 20 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/java/com/shevart/androidtransitions/util/ViewUtil.kt: -------------------------------------------------------------------------------- 1 | package com.shevart.androidtransitions.util 2 | 3 | import android.animation.Animator 4 | import android.animation.ValueAnimator 5 | import android.view.View 6 | import androidx.core.animation.addListener 7 | 8 | fun View.showWithAlpha(): Animator { 9 | this.visibility = View.VISIBLE 10 | this.alpha = 0.0f 11 | val animator = ValueAnimator.ofFloat(0.0f, 1.0f) 12 | animator.addUpdateListener { value -> 13 | this.alpha = value.animatedValue as Float 14 | } 15 | animator.addListener(onEnd = { 16 | this.alpha = 1.0f 17 | }) 18 | animator.duration = 300L 19 | animator.start() 20 | return animator 21 | } 22 | 23 | fun View.hideWithAlpha(): Animator { 24 | val animator = ValueAnimator.ofFloat(1.0f, 0.0f) 25 | animator.addUpdateListener { value -> 26 | this.alpha = value.animatedValue as Float 27 | } 28 | animator.addListener(onEnd = { 29 | this.visibility = View.INVISIBLE 30 | }) 31 | animator.duration = 300L 32 | animator.start() 33 | return animator 34 | } -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/auto_transition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/auto_transition.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/bg_one.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/bg_one.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_bounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_bounds.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_bounds_arch_motion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_bounds_arch_motion.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_bounds_pattern_path_motion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_bounds_pattern_path_motion.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_clip_bounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_clip_bounds.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_image_transform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_image_transform.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_scroll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_scroll.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/change_transform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/change_transform.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/city_one.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/city_one.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/explode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/explode.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/fade.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_android_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_audiotrack_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_more_vert.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/ic_search_grey.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/palm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/palm.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/palm_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/palm_2.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/sea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/sea.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/slide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/slide.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/smoothie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/smoothie.png -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_1.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_2.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_3.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_4.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_5.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_6.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shevart/AndroidTransitions/41071f419effae08a9cf542bd5ff63a0999baa9f/AndroidTransitionsProject/app/src/main/res/drawable/stock_bus_7.jpg -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_begin_delayed_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 22 | 23 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_clean_code_delegate_transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_clean_code_transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_content_transition_by_theme_screen_a.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_content_transition_by_theme_screen_b.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /AndroidTransitionsProject/app/src/main/res/layout/activity_enter_and_exit_action_scene_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 21 | 22 | 35 | 36 | 40 | 41 | 45 | 46 | 50 | 51 | 52 | 53 |