├── settings.gradle
├── Introduction
├── 1.gif
├── 1.png
├── 2.gif
├── 2.png
├── 3.gif
├── demo_qrcode.png
└── mtransition_demo.apk
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── app
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── mipmap-xhdpi
│ │ │ │ ├── back.png
│ │ │ │ ├── icon_1.png
│ │ │ │ ├── icon_10.png
│ │ │ │ ├── icon_11.png
│ │ │ │ ├── icon_12.png
│ │ │ │ ├── icon_13.png
│ │ │ │ ├── icon_14.png
│ │ │ │ ├── icon_15.png
│ │ │ │ ├── icon_16.png
│ │ │ │ ├── icon_17.png
│ │ │ │ ├── icon_18.png
│ │ │ │ ├── icon_19.png
│ │ │ │ ├── icon_2.png
│ │ │ │ ├── icon_20.png
│ │ │ │ ├── icon_3.png
│ │ │ │ ├── icon_4.png
│ │ │ │ ├── icon_5.png
│ │ │ │ ├── icon_6.png
│ │ │ │ ├── icon_7.png
│ │ │ │ ├── icon_8.png
│ │ │ │ ├── icon_9.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ ├── ding.png
│ │ │ │ ├── github.jpg
│ │ │ │ ├── head0.jpeg
│ │ │ │ ├── head1.jpg
│ │ │ │ ├── head2.jpeg
│ │ │ │ ├── head3.jpeg
│ │ │ │ ├── img0.jpeg
│ │ │ │ ├── img1.jpeg
│ │ │ │ ├── img2.jpeg
│ │ │ │ ├── img3.jpeg
│ │ │ │ ├── img4.jpg
│ │ │ │ ├── menu.png
│ │ │ │ ├── star.png
│ │ │ │ ├── custom1.jpg
│ │ │ │ ├── location.png
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ ├── ic_launcher.png
│ │ │ │ └── ic_launcher_round.png
│ │ │ ├── drawable
│ │ │ │ ├── circle_bg.xml
│ │ │ │ ├── roundrect.xml
│ │ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ │ ├── example8.xml
│ │ │ │ ├── example9.xml
│ │ │ │ ├── example4_1.xml
│ │ │ │ ├── example51_detail.xml
│ │ │ │ ├── example51_entry.xml
│ │ │ │ ├── example41_1.xml
│ │ │ │ ├── example6_detail.xml
│ │ │ │ ├── example6_entry.xml
│ │ │ │ ├── applist_page.xml
│ │ │ │ ├── example7_entry.xml
│ │ │ │ ├── example7_detail.xml
│ │ │ │ ├── app_item_view.xml
│ │ │ │ ├── example10_entry.xml
│ │ │ │ ├── enter_activity.xml
│ │ │ │ └── appdetail_page.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── values
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── styles.xml
│ │ │ │ ├── datas.xml
│ │ │ │ └── strings.xml
│ │ │ ├── drawable-v24
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ └── values-en
│ │ │ │ └── strings.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── mjun
│ │ │ │ └── demo
│ │ │ │ ├── example2
│ │ │ │ ├── AppBean.java
│ │ │ │ ├── AppListPage.java
│ │ │ │ ├── AppDetailPage.java
│ │ │ │ ├── Example2DetailActivity.java
│ │ │ │ └── Example2EntryActivity.java
│ │ │ │ ├── TestActivityAnimtaionActivity.java
│ │ │ │ ├── example10
│ │ │ │ ├── com
│ │ │ │ │ └── view
│ │ │ │ │ │ └── jameson
│ │ │ │ │ │ ├── library
│ │ │ │ │ │ ├── CardLinearSnapHelper.java
│ │ │ │ │ │ ├── SpeedRecyclerView.java
│ │ │ │ │ │ └── CardAdapterHelper.java
│ │ │ │ │ │ └── util
│ │ │ │ │ │ ├── ViewSwitchUtils.java
│ │ │ │ │ │ ├── BitmapUtils.java
│ │ │ │ │ │ └── BlurBitmapUtils.java
│ │ │ │ ├── Example10EntryActivity.java
│ │ │ │ └── CardAdapter.java
│ │ │ │ ├── model
│ │ │ │ └── AppModel.java
│ │ │ │ ├── example6
│ │ │ │ ├── CatLottieView.java
│ │ │ │ ├── Example6EntryActivity.java
│ │ │ │ └── Example6DetailActivity.java
│ │ │ │ ├── example7
│ │ │ │ └── Example7EntryActivity.java
│ │ │ │ ├── example41
│ │ │ │ ├── Example41EntryActivity1.java
│ │ │ │ ├── Example41EntryActivity4.java
│ │ │ │ ├── Example41EntryActivity2.java
│ │ │ │ └── Example41EntryActivity3.java
│ │ │ │ ├── example51
│ │ │ │ ├── Example51EntryActivity.java
│ │ │ │ ├── ActionBtn.java
│ │ │ │ └── Example51DetailActivity.java
│ │ │ │ ├── example4
│ │ │ │ ├── Example4EntryActivity1.java
│ │ │ │ ├── Example4EntryActivity4.java
│ │ │ │ ├── Example4EntryActivity3.java
│ │ │ │ └── Example4EntryActivity2.java
│ │ │ │ ├── example8
│ │ │ │ ├── Example8Activity.java
│ │ │ │ ├── Fragment2.java
│ │ │ │ └── Fragment1.java
│ │ │ │ ├── example9
│ │ │ │ ├── Page2.java
│ │ │ │ ├── Example9Activity.java
│ │ │ │ └── Page1.java
│ │ │ │ ├── example3
│ │ │ │ └── Example3DetailActivity.java
│ │ │ │ ├── example1
│ │ │ │ ├── Example1DetailActivity.java
│ │ │ │ └── Example1EntryActivity.java
│ │ │ │ └── example0
│ │ │ │ ├── Example0DetailActivity.java
│ │ │ │ └── Example0EntryActivity.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── mjun
│ │ │ └── mtransition
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── mjun
│ │ └── mtransition
│ │ └── ExampleInstrumentedTest.java
├── .gitignore
├── proguard-rules.pro
└── build.gradle
├── mtransition
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── values
│ │ │ │ ├── strings.xml
│ │ │ │ └── style.xml
│ │ │ └── anim
│ │ │ │ └── no_anim.xml
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── mjun
│ │ │ └── mtransition
│ │ │ ├── anim
│ │ │ ├── IAnimFactor.java
│ │ │ ├── ScaleXFactor.java
│ │ │ ├── ScaleYFactor.java
│ │ │ ├── RotateXFactor.java
│ │ │ ├── RotateYFactor.java
│ │ │ ├── RotateZFactor.java
│ │ │ ├── TranslateXFactor.java
│ │ │ ├── TranslateYFactor.java
│ │ │ ├── AlphaFactor.java
│ │ │ └── BaseAnimFactor.java
│ │ │ ├── ITransitPrepareListener.java
│ │ │ ├── bundle
│ │ │ └── MTransitionBundle.java
│ │ │ ├── Log.java
│ │ │ ├── TransitListenerAdapter.java
│ │ │ ├── ITransitional.java
│ │ │ ├── OnTransitListener.java
│ │ │ ├── MTransitionManager.java
│ │ │ ├── view
│ │ │ └── CloneView.java
│ │ │ └── MTranstionUtil.java
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── mjun
│ │ │ └── mtransition
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── mjun
│ │ └── mtransition
│ │ └── ExampleInstrumentedTest.java
├── .gitignore
├── build.gradle
└── proguard-rules.pro
├── .gitignore
├── gradle.properties
├── gradlew.bat
└── README_cn.md
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':mtransition'
2 |
--------------------------------------------------------------------------------
/Introduction/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/1.gif
--------------------------------------------------------------------------------
/Introduction/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/1.png
--------------------------------------------------------------------------------
/Introduction/2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/2.gif
--------------------------------------------------------------------------------
/Introduction/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/2.png
--------------------------------------------------------------------------------
/Introduction/3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/3.gif
--------------------------------------------------------------------------------
/Introduction/demo_qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/demo_qrcode.png
--------------------------------------------------------------------------------
/Introduction/mtransition_demo.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/Introduction/mtransition_demo.apk
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/back.png
--------------------------------------------------------------------------------
/mtransition/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | mtransition
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_1.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_10.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_11.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_12.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_13.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_14.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_15.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_16.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_17.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_18.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_19.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_2.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_20.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_3.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_4.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_5.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_6.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_7.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_8.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/icon_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/icon_9.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ding.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/ding.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/github.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/github.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/head0.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/head0.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/head1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/head1.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/head2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/head2.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/head3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/head3.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/img0.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/img0.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/img1.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/img1.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/img2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/img2.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/img3.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/img3.jpeg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/img4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/img4.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/menu.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/star.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/custom1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/custom1.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/location.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/location.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HJ-Money/MTransition/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/mtransition/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/circle_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example2/AppBean.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example2;
2 |
3 | import java.io.*;
4 |
5 | public class AppBean implements Serializable {
6 |
7 | public String mName;
8 | public String mSnapshot;
9 | public int mIconId;
10 | }
11 |
--------------------------------------------------------------------------------
/mtransition/src/main/res/anim/no_anim.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Jun 17 19:41:32 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example8.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example9.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 | #ffffff
7 | #00ffffff
8 |
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 | /.idea
11 | /.idea/.name
12 | /.idea/compiler.xml
13 | /.idea/encodings.xml
14 | /.idea/gradle.xml
15 | /.idea/misc.xml
16 | /.idea/modules.xml
17 | /.idea/runConfigurations.xml
18 | /.idea/vcs.xml
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 | /.idea
11 | /.idea/.name
12 | /.idea/compiler.xml
13 | /.idea/encodings.xml
14 | /.idea/gradle.xml
15 | /.idea/misc.xml
16 | /.idea/modules.xml
17 | /.idea/runConfigurations.xml
18 | /.idea/vcs.xml
--------------------------------------------------------------------------------
/mtransition/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 | /.idea
11 | /.idea/.name
12 | /.idea/compiler.xml
13 | /.idea/encodings.xml
14 | /.idea/gradle.xml
15 | /.idea/misc.xml
16 | /.idea/modules.xml
17 | /.idea/runConfigurations.xml
18 | /.idea/vcs.xml
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/IAnimFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | import android.view.animation.LinearInterpolator;
4 |
5 | /**
6 | * @author huijun.zhj
7 | */
8 | public interface IAnimFactor {
9 |
10 | LinearInterpolator sBaseInterpolator = new LinearInterpolator();
11 |
12 | T getCurrentAnimValue(long playTime, float animProgress);
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
7 | 40dp
8 | 360dp
9 | 234dp
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/roundrect.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/test/java/com/mjun/mtransition/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/mtransition/src/test/java/com/mjun/mtransition/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/ITransitPrepareListener.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * @author huijun.zhj
7 | * {@link MTransitionPage#setContainer(View, ITransitPrepareListener)}参数所用
8 | * {@link MTransitionPage#setContainer(View, ITransitPrepareListener)} parameters used
9 | */
10 | public interface ITransitPrepareListener {
11 | /**
12 | * 当 {@link MTransitionPage} 设置好Container时回调
13 | * Callback when {@link MTransitionPage} sets Container
14 | *
15 | * @param container
16 | */
17 | void onPrepare(MTransitionView container);
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/TestActivityAnimtaionActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.widget.TextView;
7 |
8 |
9 | /**
10 | * Created by huijun on 2018/6/8.
11 | */
12 |
13 | public class TestActivityAnimtaionActivity extends Activity {
14 |
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState) {
17 | super.onCreate(savedInstanceState);
18 | TextView textView = new TextView(this);
19 | textView.setText(getString(R.string.test_tip));
20 | setContentView(textView);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/bundle/MTransitionBundle.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.bundle;
2 |
3 | import com.mjun.mtransition.MTransition;
4 | /**
5 | * @author huijun.zhj
6 | *
7 | * 传递数据所用 {@link MTransition#getBundle()},其用法和{@link android.os.Bundle}一致
8 | * Used to pass data {@link MTransition#getBundle()},Its usage is the same as {@link android.os.Bundle}
9 | */
10 | public class MTransitionBundle extends Bundle {
11 |
12 | public void putObject(String key, Object value) {
13 | mMap.put(key, value);
14 | }
15 |
16 | public Object getObject(String key) {
17 | Object o = mMap.get(key);
18 | return o;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/Log.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | /**
4 | * @author huijun.zhj
5 | * 日志工具类
6 | * Log Util
7 | */
8 | class Log {
9 |
10 | public static final boolean DEBUG = false;
11 |
12 | static void v(String tag, String msg) {
13 | if (DEBUG) {
14 | android.util.Log.v(tag, msg);
15 | }
16 | }
17 |
18 | static void d(String tag, String msg) {
19 | if (DEBUG) {
20 | android.util.Log.d(tag, msg);
21 | }
22 | }
23 |
24 | static void e(String tag, String msg) {
25 | if (DEBUG) {
26 | android.util.Log.e(tag, msg);
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/TransitListenerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | /**
4 | * @author huijun.zhj
5 | *
6 | * 对{@link OnTransitListener}空实现
7 | * Empty implementation of {@link OnTransitListener}
8 | */
9 | public class TransitListenerAdapter implements OnTransitListener {
10 |
11 | @Override
12 | public void onTransitStart(MTransition transition, boolean reverse) {
13 |
14 | }
15 |
16 | @Override
17 | public void onTransitProgress(MTransition transition, boolean reverse, float progress) {
18 |
19 | }
20 |
21 | @Override
22 | public void onTransitEnd(MTransition transition, boolean reverse) {
23 |
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/ScaleXFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class ScaleXFactor extends BaseAnimFactor {
7 |
8 | float mFrom = 1f;
9 | float mTo = 1f;
10 |
11 | @Override
12 | public Float getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | float result = (mTo - mFrom) * progress + mFrom;
15 | return result;
16 | }
17 |
18 | public void setFrom(float mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(float mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/ScaleYFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class ScaleYFactor extends BaseAnimFactor {
7 |
8 | float mFrom = 1f;
9 | float mTo = 1f;
10 |
11 | @Override
12 | public Float getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | float result = (mTo - mFrom) * progress + mFrom;
15 | return result;
16 | }
17 |
18 | public void setFrom(float mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(float mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/RotateXFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class RotateXFactor extends BaseAnimFactor {
7 |
8 | int mFrom = 0;
9 | int mTo = 0;
10 |
11 | @Override
12 | public Integer getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | int result = (int) ((mTo - mFrom) * progress + mFrom);
15 | return result;
16 | }
17 |
18 | public void setFrom(int mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(int mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/RotateYFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class RotateYFactor extends BaseAnimFactor {
7 |
8 | int mFrom = 0;
9 | int mTo = 0;
10 |
11 | @Override
12 | public Integer getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | int result = (int) ((mTo - mFrom) * progress + mFrom);
15 | return result;
16 | }
17 |
18 | public void setFrom(int mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(int mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/RotateZFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class RotateZFactor extends BaseAnimFactor {
7 |
8 | int mFrom = 0;
9 | int mTo = 0;
10 |
11 | @Override
12 | public Integer getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | int result = (int) ((mTo - mFrom) * progress + mFrom);
15 | return result;
16 | }
17 |
18 | public void setFrom(int mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(int mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/TranslateXFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class TranslateXFactor extends BaseAnimFactor {
7 |
8 | int mFrom = 0;
9 | int mTo = 0;
10 |
11 | @Override
12 | public Integer getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | int result = (int) ((mTo - mFrom) * progress + mFrom);
15 | return result;
16 | }
17 |
18 | public void setFrom(int mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(int mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/TranslateYFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class TranslateYFactor extends BaseAnimFactor {
7 |
8 | int mFrom = 0;
9 | int mTo = 0;
10 |
11 | @Override
12 | public Integer getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | int result = (int) ((mTo - mFrom) * progress + mFrom);
15 | return result;
16 | }
17 |
18 | public void setFrom(int mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(int mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mtransition/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 26
5 |
6 |
7 |
8 | defaultConfig {
9 | minSdkVersion 14
10 | targetSdkVersion 26
11 | versionCode 1
12 | versionName "1.0"
13 |
14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
15 |
16 | }
17 |
18 | buildTypes {
19 | release {
20 | minifyEnabled false
21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
22 | }
23 | }
24 |
25 | }
26 |
27 | dependencies {
28 | implementation fileTree(dir: 'libs', include: ['*.jar'])
29 |
30 | compile 'com.android.support:support-annotations:27.1.1'
31 | }
32 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/AlphaFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | /**
4 | * @author huijun.zhj
5 | */
6 | public class AlphaFactor extends BaseAnimFactor {
7 |
8 | float mFrom = 1f;
9 | float mTo = 1f;
10 |
11 | @Override
12 | public Float getCurrentAnimValue(long playTime, float animProgress) {
13 | float progress = mInterpolator.getInterpolation(getAnimProgress(playTime, animProgress));
14 | float result = (mTo - mFrom) * progress + mFrom;
15 | return result;
16 | }
17 |
18 | public void setFrom(float mFrom) {
19 | this.mFrom = mFrom;
20 | }
21 |
22 | public void setTo(float mTo) {
23 | this.mTo = mTo;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/mtransition/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 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example4_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example2/AppListPage.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example2;
2 |
3 | import android.content.Context;
4 | import android.graphics.Color;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.widget.FrameLayout;
8 | import android.widget.ListView;
9 | import com.mjun.demo.R;
10 |
11 | public class AppListPage extends FrameLayout {
12 |
13 | public ListView mListView = null;
14 | public View mHeader = null;
15 |
16 | public AppListPage(Context context) {
17 | super(context);
18 | initViews();
19 | }
20 |
21 | private void initViews() {
22 | LayoutInflater.from(getContext()).inflate(R.layout.applist_page, this, true);
23 | mHeader = findViewById(R.id.header);
24 | mListView = (ListView) findViewById(R.id.listview);
25 | setBackgroundColor(Color.WHITE);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/mjun/mtransition/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.mjun.mtransition", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/mtransition/src/androidTest/java/com/mjun/mtransition/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.mjun.mtransition.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example51_detail.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example51_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/ITransitional.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | /**
4 | * @author huijun.zhj
5 | * 动画元素的基础接口,自定义动画必须要实现该接口,请参考Demo5,6,7
6 | * Basic interface for animated elements,custom Transition must implement this interface,Please refer to Demo5,6,7
7 | */
8 | public interface ITransitional {
9 |
10 | /**
11 | * 动画执行时回调
12 | * Callback when Transition is executed
13 | * @param playTime 动画已经执行的时长 The time of long the Transition has been performed
14 | * @param progress 动画已经执行的进度 The progress of the Transition has been performed
15 | */
16 | void onTransitProgress(long playTime, float progress);
17 |
18 | /**
19 | * 动画开始时回调
20 | * Callback when Transition start
21 | */
22 | void onTransitStart();
23 |
24 | /**
25 | * 动画结束时回调
26 | * Callback when Transition end
27 | */
28 | void onTransitEnd();
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/library/CardLinearSnapHelper.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.library;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.support.v7.widget.LinearSnapHelper;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.view.View;
7 |
8 | /**
9 | * 防止卡片在第一页和最后一页因无法"居中"而一直循环调用onScrollStateChanged-->SnapHelper.snapToTargetExistingView-->onScrollStateChanged
10 | * Created by jameson on 9/3/16.
11 | */
12 | public class CardLinearSnapHelper extends LinearSnapHelper {
13 | public boolean mNoNeedToScroll = false;
14 |
15 | @Override
16 | public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) {
17 | if (mNoNeedToScroll) {
18 | return new int[]{0, 0};
19 | } else {
20 | return super.calculateDistanceToFinalSnap(layoutManager, targetView);
21 | }
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/model/AppModel.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.model;
2 |
3 | import android.content.Context;
4 | import com.mjun.demo.R;
5 |
6 | public class AppModel {
7 | private static AppModel sInstance = new AppModel();
8 |
9 | private String[] mTitleArray;
10 | private String[] mCategoryArray;
11 |
12 | private AppModel() {
13 | }
14 |
15 | public static AppModel getInstance() {
16 | return sInstance;
17 | }
18 |
19 | public String[] getTitleArray(Context context) {
20 | if (mTitleArray == null) {
21 | int resID = R.array.app_titles;
22 | mTitleArray = context.getResources().getStringArray(resID);
23 | }
24 | return mTitleArray;
25 | }
26 |
27 | public String[] getCategoryArray(Context context) {
28 | if (mCategoryArray == null) {
29 | int resID = R.array.app_categorys;
30 | mCategoryArray = context.getResources().getStringArray(resID);
31 | }
32 | return mCategoryArray;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example6/CatLottieView.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example6;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import com.airbnb.lottie.LottieAnimationView;
6 | import com.mjun.mtransition.ITransitional;
7 |
8 | /**
9 | * Created by huijun on 2018/4/9.
10 | */
11 |
12 | public class CatLottieView extends LottieAnimationView implements ITransitional {
13 |
14 | public CatLottieView(Context context) {
15 | super(context);
16 | init();
17 | }
18 |
19 | public CatLottieView(Context context, AttributeSet attrs) {
20 | super(context, attrs);
21 | init();
22 | }
23 |
24 | private void init() {
25 | useHardwareAcceleration();
26 | setAnimation("anubis.json");
27 | setProgress(0f);
28 | }
29 |
30 | @Override
31 | public void onTransitProgress(long playTime, float progress) {
32 | setProgress(progress);
33 | }
34 |
35 | @Override
36 | public void onTransitStart() {
37 |
38 | }
39 |
40 | @Override
41 | public void onTransitEnd() {
42 |
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example41_1.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
21 |
22 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/OnTransitListener.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | /**
4 | * @author huijun.zhj
5 | *
6 | * 动画监听器,通过{@link MTransition#setOnTransitListener(OnTransitListener)}设置
7 | * Set via {@link MTransition#setOnTransitListener(OnTransitListener)}
8 | */
9 | public interface OnTransitListener {
10 | /**
11 | * 当动画开始时回调
12 | * Callback when Transition start
13 | *
14 | * @param transition 动画对应的{@link MTransition}实例
15 | * @param reverse 动画是否反向进行
16 | */
17 | void onTransitStart(MTransition transition, boolean reverse);
18 |
19 | /**
20 | * 动画进度回调
21 | * Callback when Transition progress updated
22 | *
23 | * @param transition 动画对应的{@link MTransition}实例
24 | * @param reverse 动画是否反向进行
25 | * @param progress 当前的动画进度
26 | */
27 | void onTransitProgress(MTransition transition, boolean reverse, float progress);
28 |
29 | /**
30 | * 当动画结束时回调
31 | * Callback when Transition end
32 | *
33 | * @param transition 动画对应的{@link MTransition}实例
34 | * @param reverse 动画是否反向进行
35 | */
36 | void onTransitEnd(MTransition transition, boolean reverse);
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example6_detail.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
24 |
25 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example6_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
24 |
25 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example2/AppDetailPage.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example2;
2 |
3 | import android.content.Context;
4 | import android.graphics.Color;
5 | import android.view.LayoutInflater;
6 | import android.widget.ImageView;
7 | import android.widget.ScrollView;
8 | import android.widget.TextView;
9 | import com.mjun.demo.R;
10 |
11 | public class AppDetailPage extends ScrollView {
12 |
13 | public ImageView mImage;
14 | public TextView mName;
15 | public TextView mContent;
16 | public int mImgId;
17 |
18 | public AppDetailPage(Context context) {
19 | super(context);
20 | initViews();
21 | }
22 |
23 | private void initViews() {
24 | LayoutInflater.from(getContext()).inflate(R.layout.appdetail_page, this, true);
25 | mImage = (ImageView) findViewById(R.id.app_detail_icon);
26 | mName = (TextView) findViewById(R.id.app_detail_name);
27 | mContent = (TextView) findViewById(R.id.app_detail_content);
28 | setBackgroundColor(Color.WHITE);
29 | }
30 |
31 | public void setImageId(int imgId) {
32 | mImgId = imgId;
33 | mImage.setImageResource(imgId);
34 | }
35 |
36 | public void setName(String name) {
37 | mName.setText(name);
38 | }
39 |
40 | public void setContent(String name) {
41 | mContent.setText(name);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 26
5 | buildToolsVersion "26.0.2"
6 | defaultConfig {
7 | applicationId "com.mjun.mtransition"
8 | minSdkVersion 17
9 | targetSdkVersion 26
10 | versionCode 1
11 | versionName "1.0"
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | implementation fileTree(dir: 'libs', include: ['*.jar'])
24 | testImplementation 'junit:junit:4.12'
25 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
26 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
27 |
28 | implementation 'com.android.support:appcompat-v7:25.3.1'
29 | implementation 'com.android.support:recyclerview-v7:24.2.0'
30 | implementation 'com.android.support:cardview-v7:24.2.0'
31 | implementation ('jameson.io.library:library:0.0.1') {
32 | exclude group: "com.android.support", module: "support-v4"
33 | }
34 | implementation 'com.airbnb.android:lottie:2.5.3'
35 | implementation 'de.hdodenhof:circleimageview:2.2.0'
36 | compile project(path: ':mtransition')
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/res/values/datas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 微信
5 | - 支付宝
6 | - UC浏览器
7 | - 抖音
8 | - 淘宝
9 | - 天猫
10 | - QQ
11 | - 爱奇艺
12 | - 新浪微博
13 | - 高德地图
14 | - 优酷
15 | - 京东
16 | - 网易云音乐
17 | - 哔哩哔哩
18 | - 今日头条
19 | - 王者荣耀
20 | - 美团
21 | - 滴滴出行
22 | - Faceu
23 | - 荒野行动
24 |
25 |
26 | - 分类1
27 | - 分类2
28 | - 分类3
29 | - 分类4
30 | - 分类5
31 | - 分类1
32 | - 分类2
33 | - 分类3
34 | - 分类4
35 | - 分类5
36 | - 分类1
37 | - 分类2
38 | - 分类3
39 | - 分类4
40 | - 分类5
41 | - 分类1
42 | - 分类2
43 | - 分类3
44 | - 分类4
45 | - 分类5
46 |
47 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/applist_page.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
17 |
22 |
23 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/library/SpeedRecyclerView.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.library;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.util.AttributeSet;
7 |
8 | /**
9 | * 控制fling速度的RecyclerView
10 | *
11 | * Created by jameson on 9/1/16.
12 | */
13 | public class SpeedRecyclerView extends RecyclerView {
14 | private static final float FLING_SCALE_DOWN_FACTOR = 0.5f; // 减速因子
15 | private static final int FLING_MAX_VELOCITY = 8000; // 最大顺时滑动速度
16 |
17 | public SpeedRecyclerView(Context context) {
18 | super(context);
19 | }
20 |
21 | public SpeedRecyclerView(Context context, @Nullable AttributeSet attrs) {
22 | super(context, attrs);
23 | }
24 |
25 | public SpeedRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
26 | super(context, attrs, defStyle);
27 | }
28 |
29 | @Override
30 | public boolean fling(int velocityX, int velocityY) {
31 | velocityX = solveVelocity(velocityX);
32 | velocityY = solveVelocity(velocityY);
33 | return super.fling(velocityX, velocityY);
34 | }
35 |
36 | private int solveVelocity(int velocity) {
37 | if (velocity > 0) {
38 | return Math.min(velocity, FLING_MAX_VELOCITY);
39 | } else {
40 | return Math.max(velocity, -FLING_MAX_VELOCITY);
41 | }
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example7_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
24 |
25 |
32 |
33 |
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example7_detail.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
24 |
25 |
32 |
33 |
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/app_item_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
19 |
20 |
25 |
26 |
33 |
34 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example7/Example7EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example7;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 |
9 | import com.mjun.demo.R;
10 | import com.mjun.mtransition.ITransitPrepareListener;
11 | import com.mjun.mtransition.MTransition;
12 | import com.mjun.mtransition.MTransitionManager;
13 | import com.mjun.mtransition.MTransitionView;
14 | import com.mjun.mtransition.MTranstionUtil;
15 |
16 | /**
17 | * Created by huijun on 2018/4/8.
18 | */
19 |
20 | public class Example7EntryActivity extends Activity {
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.example7_entry);
26 | init();
27 | }
28 |
29 | private void init() {
30 | final View myContainer = findViewById(R.id.container);
31 | final Button btn = findViewById(R.id.btn);
32 | btn.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
36 | transition.fromPage().setContainer(myContainer, new ITransitPrepareListener() {
37 | @Override
38 | public void onPrepare(MTransitionView container) {
39 | transition.fromPage().addTransitionView("image", findViewById(R.id.image));
40 | }
41 | });
42 | Intent intent = new Intent(Example7EntryActivity.this, Example7DetailActivity.class);
43 | startActivity(intent);
44 | MTranstionUtil.removeActivityAnimation(Example7EntryActivity.this);
45 | }
46 | });
47 |
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example6/Example6EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example6;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 |
8 | import com.mjun.demo.R;
9 | import com.mjun.mtransition.ITransitPrepareListener;
10 | import com.mjun.mtransition.MTransition;
11 | import com.mjun.mtransition.MTransitionManager;
12 | import com.mjun.mtransition.MTransitionView;
13 | import com.mjun.mtransition.MTranstionUtil;
14 |
15 | /**
16 | * Created by huijun on 2018/4/8.
17 | */
18 |
19 | public class Example6EntryActivity extends Activity {
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.example6_entry);
25 | init();
26 | }
27 |
28 | private void init() {
29 | final View myContainer = findViewById(R.id.container);
30 | final CatLottieView animView = findViewById(R.id.anim_view);
31 | animView.setProgress(0f);
32 | animView.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
36 | transition.fromPage().setContainer(myContainer, new ITransitPrepareListener() {
37 | @Override
38 | public void onPrepare(MTransitionView container) {
39 | transition.fromPage().addTransitionView("animView", animView);
40 | }
41 | });
42 | Intent intent = new Intent(Example6EntryActivity.this, Example6DetailActivity.class);
43 | startActivity(intent);
44 | MTranstionUtil.removeActivityAnimation(Example6EntryActivity.this);
45 | }
46 | });
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example41/Example41EntryActivity1.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example41;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.TextView;
9 |
10 | import com.mjun.demo.R;
11 | import com.mjun.mtransition.ITransitPrepareListener;
12 | import com.mjun.mtransition.MTransition;
13 | import com.mjun.mtransition.MTransitionManager;
14 | import com.mjun.mtransition.MTransitionView;
15 | import com.mjun.mtransition.MTranstionUtil;
16 |
17 | public class Example41EntryActivity1 extends Activity {
18 |
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.example41_1);
23 | init();
24 | }
25 |
26 | private void init() {
27 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example41_tip11));
28 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example41_tip12));
29 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
30 | @Override
31 | public void onClick(View v) {
32 | final MTransition transition = MTransitionManager.getInstance().createTransition("Activity1");
33 | transition.fromPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
34 | @Override
35 | public void onPrepare(MTransitionView container) {
36 | // donothing
37 | }
38 | });
39 | Intent intent = new Intent(Example41EntryActivity1.this, Example41EntryActivity2.class);
40 | startActivity(intent);
41 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity1.this);
42 | }
43 | });
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example51/Example51EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example51;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 |
8 | import com.mjun.demo.R;
9 | import com.mjun.mtransition.ITransitPrepareListener;
10 | import com.mjun.mtransition.MTransition;
11 | import com.mjun.mtransition.MTransitionManager;
12 | import com.mjun.mtransition.MTransitionView;
13 | import com.mjun.mtransition.MTranstionUtil;
14 |
15 | /**
16 | * Created by huijun on 2018/4/8.
17 | */
18 |
19 | public class Example51EntryActivity extends Activity {
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.example51_entry);
25 | init();
26 | }
27 |
28 | private void init() {
29 | final View myContainer = findViewById(R.id.container);
30 | final ActionBtn btn = (ActionBtn) findViewById(R.id.enter_btn);
31 | btn.setProgress(0f);
32 | btn.setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
36 | transition.fromPage().setContainer(myContainer, new ITransitPrepareListener() {
37 | @Override
38 | public void onPrepare(MTransitionView container) {
39 | transition.fromPage().addTransitionView("btn", findViewById(R.id.enter_btn));
40 | }
41 | });
42 | Intent intent = new Intent(Example51EntryActivity.this, Example51DetailActivity.class);
43 | startActivity(intent);
44 | MTranstionUtil.removeActivityAnimation(Example51EntryActivity.this);
45 | }
46 | });
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/util/ViewSwitchUtils.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.util;
2 |
3 | import android.graphics.Bitmap;
4 | import android.graphics.drawable.BitmapDrawable;
5 | import android.graphics.drawable.ColorDrawable;
6 | import android.graphics.drawable.Drawable;
7 | import android.graphics.drawable.TransitionDrawable;
8 | import android.widget.ImageView;
9 |
10 | /**
11 | * 图片背景切换动画帮助类
12 | *
13 | * Created by jameson on 9/3/16.
14 | */
15 | public class ViewSwitchUtils {
16 |
17 | public static void startSwitchBackgroundAnim(ImageView view, Bitmap bitmap) {
18 | Drawable oldDrawable = view.getDrawable();
19 | Drawable oldBitmapDrawable ;
20 | TransitionDrawable oldTransitionDrawable = null;
21 | if (oldDrawable instanceof TransitionDrawable) {
22 | oldTransitionDrawable = (TransitionDrawable) oldDrawable;
23 | oldBitmapDrawable = oldTransitionDrawable.findDrawableByLayerId(oldTransitionDrawable.getId(1));
24 | } else if (oldDrawable instanceof BitmapDrawable) {
25 | oldBitmapDrawable = oldDrawable;
26 | } else {
27 | oldBitmapDrawable = new ColorDrawable(0xffc2c2c2);
28 | }
29 |
30 | if (oldTransitionDrawable == null) {
31 | oldTransitionDrawable = new TransitionDrawable(new Drawable[]{oldBitmapDrawable, new BitmapDrawable(bitmap)});
32 | oldTransitionDrawable.setId(0, 0);
33 | oldTransitionDrawable.setId(1, 1);
34 | oldTransitionDrawable.setCrossFadeEnabled(true);
35 | view.setImageDrawable(oldTransitionDrawable);
36 | } else {
37 | oldTransitionDrawable.setDrawableByLayerId(oldTransitionDrawable.getId(0), oldBitmapDrawable);
38 | oldTransitionDrawable.setDrawableByLayerId(oldTransitionDrawable.getId(1), new BitmapDrawable(bitmap));
39 | }
40 | oldTransitionDrawable.startTransition(50);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example4/Example4EntryActivity1.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example4;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.TextView;
9 | import com.mjun.demo.R;
10 | import com.mjun.mtransition.ITransitPrepareListener;
11 | import com.mjun.mtransition.MTransition;
12 | import com.mjun.mtransition.MTransitionManager;
13 | import com.mjun.mtransition.MTransitionView;
14 | import com.mjun.mtransition.MTranstionUtil;
15 |
16 | public class Example4EntryActivity1 extends Activity {
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | super.onCreate(savedInstanceState);
21 | setContentView(R.layout.example4_1);
22 | init();
23 | startAnim();
24 | }
25 |
26 | private void init() {
27 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example4_tip11));
28 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example4_tip12));
29 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
30 | @Override
31 | public void onClick(View v) {
32 | MTransition transition = MTransitionManager.getInstance().createTransition("Example4EntryActivity1");
33 | transition.fromPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
34 | @Override
35 | public void onPrepare(MTransitionView container) {
36 |
37 | }
38 | });
39 | Intent intent = new Intent(Example4EntryActivity1.this, Example4EntryActivity2.class);
40 | startActivity(intent);
41 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity1.this);
42 | }
43 | });
44 | }
45 |
46 | private void startAnim() {
47 |
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/anim/BaseAnimFactor.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.anim;
2 |
3 | import android.view.animation.Interpolator;
4 |
5 | /**
6 | * @author huijun.zhj
7 | */
8 | public class BaseAnimFactor implements IAnimFactor {
9 |
10 | Interpolator mInterpolator = IAnimFactor.sBaseInterpolator;
11 | long mDuration = 0;
12 | long mStartDelay = 0;
13 | boolean mHasSet = false;
14 |
15 | @Override
16 | public T getCurrentAnimValue(long playTime, float animProgress) {
17 | return null;
18 | }
19 |
20 | public void setInterpolator(Interpolator mInterpolator) {
21 | this.mInterpolator = mInterpolator;
22 | }
23 |
24 | public void setDuration(long duration) {
25 | setDuration(duration, true);
26 | }
27 |
28 | void setDuration(long duration, boolean byUser) {
29 | if (!mHasSet) {
30 | mHasSet = true;
31 | } else if (!byUser) {
32 | return;
33 | }
34 | mDuration = duration;
35 | }
36 |
37 | public void setStartDelay(long startDelay) {
38 | this.mStartDelay = startDelay;
39 | }
40 |
41 | /**
42 | * 获取真实的动画进度,考虑Duration和StartDelay的因素
43 | * @param playTime
44 | * @param progress
45 | * @return
46 | */
47 | float getAnimProgress(long playTime, float progress) {
48 | if (mDuration == 0) {
49 | return progress;
50 | }
51 | long time = playTime;
52 | if (mStartDelay > 0) {
53 | time = playTime - mStartDelay;
54 | }
55 | if (time < 0) {
56 | // 还没开始动画
57 | return 0f;
58 | } else if (time > mDuration) {
59 | // 动画已经结束
60 | return 1f;
61 | } else {
62 | return time / (float) mDuration;
63 | }
64 | }
65 |
66 | long getAnimTime() {
67 | return mDuration + mStartDelay;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example8/Example8Activity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example8;
2 |
3 | import java.util.*;
4 |
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.support.v4.app.FragmentActivity;
9 | import android.support.v4.app.FragmentManager;
10 | import com.mjun.demo.R;
11 |
12 | /**
13 | * Created by huijun on 2018/4/12.
14 | */
15 |
16 | public class Example8Activity extends FragmentActivity {
17 |
18 |
19 | @Override
20 | protected void onCreate(@Nullable Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.example8);
23 | init();
24 | }
25 |
26 | private void init() {
27 | getSupportFragmentManager().beginTransaction()
28 | .add(R.id.container, Fragment1.newInstance(), "f1")
29 | .commit();
30 | }
31 |
32 | public void enterOtherFragment() {
33 | getSupportFragmentManager().beginTransaction()
34 | .add(R.id.container, Fragment2.newInstance(), "f2").addToBackStack("f2")
35 | .commit();
36 | }
37 |
38 | @Override
39 | public void onBackPressed() {
40 | if (!handleBackPress()) {
41 | super.onBackPressed();
42 | }
43 | }
44 |
45 | private boolean handleBackPress() {
46 | List fragments = getSupportFragmentManager().getFragments();
47 |
48 | if (fragments == null) return false;
49 |
50 | for (int i = fragments.size() - 1; i >= 0; i--) {
51 | Fragment child = fragments.get(i);
52 |
53 | if (child instanceof IHandleBack &&
54 | ((IHandleBack) child).onBackPressed(getSupportFragmentManager())) {
55 | return true;
56 | }
57 | }
58 |
59 | return false;
60 | }
61 |
62 | public interface IHandleBack {
63 | boolean onBackPressed(FragmentManager manager);
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/mtransition/src/main/res/values/style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
14 |
15 |
19 |
20 |
26 |
27 |
31 |
32 |
36 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example9/Page2.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example9;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.widget.FrameLayout;
6 | import com.mjun.mtransition.ITransitPrepareListener;
7 | import com.mjun.mtransition.MTransition;
8 | import com.mjun.mtransition.MTransitionManager;
9 | import com.mjun.mtransition.MTransitionView;
10 | import com.mjun.demo.example2.AppBean;
11 | import com.mjun.demo.example2.AppDetailPage;
12 |
13 | /**
14 | * Created by huijun on 2018/4/16.
15 | */
16 |
17 | public class Page2 extends FrameLayout {
18 |
19 | AppDetailPage mAppDetailPage;
20 |
21 | public Page2(@NonNull Context context) {
22 | super(context);
23 | mAppDetailPage = new AppDetailPage(context);
24 | AppBean bean = (AppBean) MTransitionManager.getInstance().getTransition("example").getBundle().getObject("bean");
25 | mAppDetailPage.setImageId(bean.mIconId);
26 | mAppDetailPage.setName(bean.mName);
27 | addView(mAppDetailPage);
28 | initTranstion();
29 | }
30 |
31 | private void initTranstion() {
32 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
33 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
34 | @Override
35 | public void onPrepare(MTransitionView container) {
36 | container.alpha(0f, 1f);
37 | MTransitionView icon = transition.toPage().addTransitionView("icon", mAppDetailPage.mImage);
38 | MTransitionView name = transition.toPage().addTransitionView("name", mAppDetailPage.mName);
39 | transition.fromPage().getTransitionView("icon").above(icon).transitTo(icon, true);
40 | transition.fromPage().getTransitionView("name").above(name).transitTo(name)/*.setDuration(1000).setStartDelay(500)*/;
41 | }
42 | });
43 | transition.setDuration(500);
44 | transition.start();
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MTranstionDemo
3 | 示例0:基础示例
4 | 示例1:随时改变动画
5 | 示例2:基础示例2
6 | 示例3:基础示例3
7 | 示例4:多Activity示例
8 | 示例41:多Activity示例2
9 | 示例5:自定义动画View示例
10 | 示例6:自定义动画View示例2,Lottie
11 | 示例7:自定义动画View示例3
12 | 示例8:Fragment之间的切换动画
13 | 示例9:同一个Activity下的切换动画
14 | 示例10:一个不错的示例
15 |
16 | Back键返回或者尝试向右滑动
17 | 该页面用来测试默认的进退场动画
18 |
19 | 这是Activit 1
20 | 点击前往Activity 2
21 | 这是Activit 2
22 | 点击前往Activity 3
23 | 这是Activit 3
24 | 点击前往Activity 4
25 | 这是Activit 4
26 |
27 | 这是Activit 1
28 | 点击前往Activity 2
29 | 这是Activit 2,可以滑动返回
30 | 点击前往Activity 3
31 | 这是Activit 3,可以滑动返回
32 | 点击前往Activity 4
33 | 这是Activit 4,可以滑动返回
34 |
35 | 试下点击那只猫,素材来自http://www.lottiefiles.com/
36 | 该动画效果来源于https://github.com/7heaven/CurtainSlidingMenu
37 | Exit或者滑动返回
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/library/CardAdapterHelper.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.library;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import jameson.io.library.util.ScreenUtil;
7 |
8 | /**
9 | * adapter中调用onCreateViewHolder, onBindViewHolder
10 | * Created by jameson on 9/1/16.
11 | */
12 | public class CardAdapterHelper {
13 | private int mPagePadding = 15;
14 | private int mShowLeftCardWidth = 15;
15 |
16 | public void onCreateViewHolder(ViewGroup parent, View itemView) {
17 | RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) itemView.getLayoutParams();
18 | lp.width = parent.getWidth() - ScreenUtil.dip2px(itemView.getContext(), 2 * (mPagePadding + mShowLeftCardWidth));
19 | itemView.setLayoutParams(lp);
20 | }
21 |
22 | public void onBindViewHolder(View itemView, final int position, int itemCount) {
23 | int padding = ScreenUtil.dip2px(itemView.getContext(), mPagePadding);
24 | itemView.setPadding(padding, 0, padding, 0);
25 | int leftMarin = position == 0 ? padding + ScreenUtil.dip2px(itemView.getContext(), mShowLeftCardWidth) : 0;
26 | int rightMarin = position == itemCount - 1 ? padding + ScreenUtil.dip2px(itemView.getContext(), mShowLeftCardWidth) : 0;
27 | setViewMargin(itemView, leftMarin, 0, rightMarin, 0);
28 | }
29 |
30 | private void setViewMargin(View view, int left, int top, int right, int bottom) {
31 | ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
32 | if (lp.leftMargin != left || lp.topMargin != top || lp.rightMargin != right || lp.bottomMargin != bottom) {
33 | lp.setMargins(left, top, right, bottom);
34 | view.setLayoutParams(lp);
35 | }
36 | }
37 |
38 | public void setPagePadding(int pagePadding) {
39 | mPagePadding = pagePadding;
40 | }
41 |
42 | public void setShowLeftCardWidth(int showLeftCardWidth) {
43 | mShowLeftCardWidth = showLeftCardWidth;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/util/BitmapUtils.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.util;
2 |
3 | import android.content.res.Resources;
4 | import android.graphics.Bitmap;
5 | import android.graphics.BitmapFactory;
6 |
7 | public class BitmapUtils {
8 | public static int MIN_WIDTH = 100;
9 |
10 | /**
11 | * 按最大边按一定大小缩放图片
12 | *
13 | * @param resources
14 | * @param resId
15 | * @param maxSize 压缩后最大长度
16 | * @return
17 | */
18 | public static Bitmap scaleImage(Resources resources, int resId, int maxSize) {
19 | BitmapFactory.Options options = new BitmapFactory.Options();
20 | options.inJustDecodeBounds = true;
21 | BitmapFactory.decodeResource(resources, resId, options);
22 | options.inSampleSize = calculateInSampleSize(options, maxSize, maxSize);
23 | options.inJustDecodeBounds = false;
24 |
25 | return BitmapFactory.decodeResource(resources, resId, options);
26 | }
27 |
28 | /**
29 | * 计算inSampleSize
30 | * @param options
31 | * @param reqWidth
32 | * @param reqHeight
33 | * @return
34 | */
35 | private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
36 | int height = options.outHeight;
37 | int width = options.outWidth;
38 | int inSampleSize = 1;
39 | if (width < MIN_WIDTH) {
40 | return inSampleSize;
41 | } else {
42 | int heightRatio;
43 | if (width > height && reqWidth < reqHeight || width < height && reqWidth > reqHeight) {
44 | heightRatio = reqWidth;
45 | reqWidth = reqHeight;
46 | reqHeight = heightRatio;
47 | }
48 |
49 | if (height > reqHeight || width > reqWidth) {
50 | heightRatio = Math.round((float) height / (float) reqHeight);
51 | int widthRatio = Math.round((float) width / (float) reqWidth);
52 | inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
53 | }
54 |
55 | return inSampleSize;
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example9/Example9Activity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example9;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.widget.FrameLayout;
7 |
8 | import com.mjun.demo.R;
9 | import com.mjun.mtransition.MTransition;
10 | import com.mjun.mtransition.MTransitionManager;
11 | import com.mjun.mtransition.TransitListenerAdapter;
12 |
13 | /**
14 | * Created by huijun on 2018/4/12.
15 | */
16 |
17 | public class Example9Activity extends Activity {
18 |
19 | private Page1 mPage1;
20 | private Page2 mPage2;
21 |
22 | @Override
23 | protected void onCreate(@Nullable Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.example9);
26 | init();
27 | }
28 |
29 | private void init() {
30 | mPage1 = new Page1(this);
31 | FrameLayout cotainer = findViewById(R.id.container);
32 | cotainer.addView(mPage1);
33 | }
34 |
35 | public void enterOtherPage() {
36 | mPage2 = new Page2(this);
37 | FrameLayout cotainer = findViewById(R.id.container);
38 | cotainer.addView(mPage2);
39 | }
40 |
41 | @Override
42 | public void onBackPressed() {
43 | if (mPage2 != null) {
44 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
45 | transition.reverse();
46 | transition.setOnTransitListener(new TransitListenerAdapter() {
47 | @Override
48 | public void onTransitEnd(MTransition transition, boolean reverse) {
49 | if (reverse) {
50 | if (mPage2.getParent() != null) {
51 | FrameLayout cotainer = findViewById(R.id.container);
52 | cotainer.removeView(mPage2);
53 | mPage2 = null;
54 | }
55 | }
56 | }
57 | });
58 | } else {
59 | super.onBackPressed();
60 | }
61 | }
62 |
63 | @Override
64 | protected void onDestroy() {
65 | super.onDestroy();
66 | MTransitionManager.getInstance().destoryTransition("example");
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/app/src/main/res/values-en/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MTranstionDemo
3 | Demo0:Basic example
4 | Demo1:Change Transition at any time
5 | Demo2:Basic example2
6 | Demo3:Basic example3
7 | Demo4:Multiple Activity example
8 | Demo41:Multiple Activity example2
9 | Demo5:Custom Transition Example
10 | Demo6:Custom Transition Example2,Lottie
11 | Demo7:Custom Transition Example3
12 | Demo8:Transition between Fragment
13 | Demo9:Transition in the same Activity
14 | Demo10:A wounderful example
15 |
16 | Back key to return or try to slide to the right
17 | This page is used to test the default android activity transitions
18 |
19 | This is Activit 1
20 | Click to Activity 2
21 | This is Activit 2
22 | Click to Activity 3
23 | This is Activit 3
24 | Click to Activity 4
25 | This is Activit 4
26 |
27 | This is Activit 1
28 | Click to Activity 2
29 | This is Activit 2, Or slide back
30 | Click to Activity 3
31 | This is Activit 3, Or slide back
32 | Click to Activity 4
33 | This is Activit 4, Or slide back
34 |
35 | Try to click on the cat, the material comes from http://www.lottiefiles.com/
36 | The effect comes from https://github.com/7heaven/CurtainSlidingMenu
37 | Exit or slide back
38 |
39 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/MTransitionManager.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import java.util.*;
4 |
5 | import android.support.annotation.NonNull;
6 | import android.support.annotation.Nullable;
7 |
8 | /**
9 | * @author huijun.zhj
10 | *
11 | * 用于创建、销毁、获取{@link MTransition}实例
12 | * Used to create, destroy or get {@link MTransition} instances
13 | */
14 | public class MTransitionManager {
15 |
16 | /**
17 | * 存储所有{@link MTransition}数据
18 | * Store all {@link MTransition} data
19 | */
20 | private static Map sTransitionMap = new HashMap<>();
21 |
22 | private static class LAZY_HOLDER {
23 | static MTransitionManager sInstance = null;
24 | static {
25 | sInstance = new MTransitionManager();
26 | }
27 | }
28 |
29 | private MTransitionManager() {
30 | }
31 |
32 | public static MTransitionManager getInstance() {
33 | return LAZY_HOLDER.sInstance;
34 | }
35 |
36 | /**
37 | * 根据name创建{@link MTransition},存储到{@link #sTransitionMap}, key是name,value是MTransition
38 | * Create {@link MTransition} by name, store to {@link #sTransitionMap},
39 | * key is name, and value is MTransition
40 | *
41 | * @param name 该MTransition的name
42 | * @return {@link MTransition}实例
43 | */
44 | public @NonNull MTransition createTransition(String name) {
45 | if (sTransitionMap.containsKey(name)) {
46 | MTransition transition = sTransitionMap.get(name);
47 | if (transition != null) {
48 | transition.clear();
49 | return transition;
50 | }
51 | }
52 | MTransition transition = new MTransition(name);
53 | sTransitionMap.put(name, transition);
54 | return transition;
55 | }
56 |
57 | /**
58 | * 获取已经创建的{@link MTransition}实例
59 | * Get the instance of {@link MTransition} that has been created
60 | *
61 | * @param name {@link MTransition}实例对应的name
62 | * @return 如果存在name对应的{@link MTransition}实例,则返回这个实例;否则,返回null;
63 | */
64 | public @Nullable MTransition getTransition(String name) {
65 | return sTransitionMap.get(name);
66 | }
67 |
68 | /**
69 | * 清除已经创建的{@link MTransition}实例
70 | * Clear the already created {@link MTransition} instance
71 | *
72 | * @param name {@link MTransition}实例对应的name
73 | */
74 | public void destoryTransition(String name) {
75 | sTransitionMap.remove(name);
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example4/Example4EntryActivity4.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example4;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.Button;
7 | import android.widget.TextView;
8 |
9 | import com.mjun.demo.R;
10 | import com.mjun.mtransition.ITransitPrepareListener;
11 | import com.mjun.mtransition.MTransition;
12 | import com.mjun.mtransition.MTransitionManager;
13 | import com.mjun.mtransition.MTransitionView;
14 | import com.mjun.mtransition.MTranstionUtil;
15 | import com.mjun.mtransition.TransitListenerAdapter;
16 |
17 | public class Example4EntryActivity4 extends Activity {
18 |
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.example4_1);
23 | init();
24 | startAnim();
25 | }
26 |
27 | private void init() {
28 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example4_tip41));
29 | ((Button) findViewById(R.id.button)).setText("不要点啦");
30 | ((Button) findViewById(R.id.button)).setVisibility(View.GONE);
31 | }
32 |
33 | private void startAnim() {
34 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity3");
35 | transition.toPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
36 | @Override
37 | public void onPrepare(MTransitionView container) {
38 | container.translateY(container.getHeight(), 0);
39 | }
40 | });
41 | transition.setDuration(500);
42 | transition.start();
43 | findViewById(R.id.container).setBackgroundColor(0xffe9ae6a);
44 | }
45 |
46 | @Override
47 | protected void onDestroy() {
48 | super.onDestroy();
49 | MTransitionManager.getInstance().destoryTransition("Example4EntryActivity3");
50 | }
51 |
52 | @Override
53 | public void onBackPressed() {
54 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity3");
55 | transition.reverse();
56 | transition.setOnTransitListener(new TransitListenerAdapter() {
57 | @Override
58 | public void onTransitEnd(MTransition transition, boolean reverse) {
59 | if (reverse) {
60 | finish();
61 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity4.this);
62 | }
63 | }
64 | });
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/com/view/jameson/util/BlurBitmapUtils.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10.com.view.jameson.util;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import android.renderscript.Allocation;
6 | import android.renderscript.Element;
7 | import android.renderscript.RenderScript;
8 | import android.renderscript.ScriptIntrinsicBlur;
9 | import android.widget.ImageView;
10 |
11 | /**
12 | * RenderScript图片高斯模糊
13 | * Created by jameson on 9/2/16.
14 | */
15 | public class BlurBitmapUtils {
16 | /**
17 | * 建议模糊度(在0.0到25.0之间)
18 | */
19 | private static final int BLUR_RADIUS = 20;
20 | private static final int SCALED_WIDTH = 100;
21 | private static final int SCALED_HEIGHT = 100;
22 |
23 | public static void blur(ImageView imageView, Bitmap bitmap) {
24 | blur(imageView, bitmap, BLUR_RADIUS);
25 | }
26 |
27 | public static void blur(ImageView imageView, Bitmap bitmap, int radius) {
28 | imageView.setImageBitmap(getBlurBitmap(imageView.getContext(), bitmap, radius));
29 | }
30 |
31 | public static Bitmap getBlurBitmap(Context context, Bitmap bitmap) {
32 | return getBlurBitmap(context, bitmap, BLUR_RADIUS);
33 | }
34 |
35 | /**
36 | * 得到模糊后的bitmap
37 | * thanks http://wl9739.github.io/2016/07/14/教你一分钟实现模糊效果/
38 | *
39 | * @param context
40 | * @param bitmap
41 | * @param radius
42 | * @return
43 | */
44 | public static Bitmap getBlurBitmap(Context context, Bitmap bitmap, int radius) {
45 | // 将缩小后的图片做为预渲染的图片。
46 | Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, SCALED_WIDTH, SCALED_HEIGHT, false);
47 | // 创建一张渲染后的输出图片。
48 | Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
49 |
50 | // 创建RenderScript内核对象
51 | RenderScript rs = RenderScript.create(context);
52 | // 创建一个模糊效果的RenderScript的工具对象
53 | ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
54 |
55 | // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。
56 | // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。
57 | Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
58 | Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
59 |
60 | // 设置渲染的模糊程度, 25f是最大模糊度
61 | blurScript.setRadius(radius);
62 | // 设置blurScript对象的输入内存
63 | blurScript.setInput(tmpIn);
64 | // 将输出数据保存到输出内存中
65 | blurScript.forEach(tmpOut);
66 |
67 | // 将数据填充到Allocation中
68 | tmpOut.copyTo(outputBitmap);
69 |
70 | return outputBitmap;
71 | }
72 |
73 | }
74 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example51/ActionBtn.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example51;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.graphics.Color;
6 | import android.graphics.Paint;
7 | import android.support.annotation.Nullable;
8 | import android.util.AttributeSet;
9 | import android.view.View;
10 | import com.mjun.mtransition.ITransitional;
11 |
12 | /**
13 | * Created by huijun on 2018/4/8.
14 | */
15 |
16 | public class ActionBtn extends View implements ITransitional {
17 |
18 | private int mBgColor = 0xfffee388;
19 | private String mText = "Enter";
20 |
21 | private int mBgColor2 = 0xffFF576B;
22 | private String mText2 = "Exit";
23 |
24 | private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
25 | private float mProgress = 0;
26 |
27 | public ActionBtn(Context context) {
28 | super(context);
29 | }
30 |
31 | public ActionBtn(Context context, @Nullable AttributeSet attrs) {
32 | super(context, attrs);
33 | }
34 |
35 | @Override
36 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
37 | super.onMeasure(widthMeasureSpec, heightMeasureSpec);
38 | }
39 |
40 | @Override
41 | protected void onDraw(Canvas canvas) {
42 | int width = getMeasuredWidth();
43 | int height = getMeasuredHeight();
44 | int alpha = 255 - (int) (mProgress * 255);
45 | canvas.save();
46 | // 画背景
47 | mPaint.setColor(mBgColor);
48 | canvas.drawCircle(width / 2, height / 2, width / 2, mPaint);
49 | mPaint.setColor(mBgColor2);
50 | mPaint.setAlpha(alpha);
51 | canvas.drawCircle(width / 2, height / 2, width / 2, mPaint);
52 | // 画文字
53 | mPaint.setColor(Color.WHITE);
54 | mPaint.setAlpha(alpha);
55 | mPaint.setTextSize(width / 5);
56 | int textWidth = (int) mPaint.measureText(mText);
57 | canvas.drawText(mText, (width - textWidth) / 2, height / 2 + width / 10, mPaint);
58 | mPaint.setColor(Color.WHITE);
59 | mPaint.setAlpha(255 - alpha);
60 | textWidth = (int) mPaint.measureText(mText2);
61 | canvas.drawText(mText2, (width - textWidth) / 2, height / 2 + width / 10, mPaint);
62 | canvas.restore();
63 | }
64 |
65 | public void setProgress(float mProgress) {
66 | this.mProgress = mProgress;
67 | }
68 |
69 | @Override
70 | public void onTransitProgress(long playTime, float progress) {
71 | setProgress(progress);
72 | }
73 |
74 | @Override
75 | public void onTransitStart() {
76 |
77 | }
78 |
79 | @Override
80 | public void onTransitEnd() {
81 |
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example2/Example2DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example2;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import com.mjun.mtransition.ITransitPrepareListener;
6 | import com.mjun.mtransition.MTransition;
7 | import com.mjun.mtransition.MTransitionManager;
8 | import com.mjun.mtransition.MTransitionView;
9 | import com.mjun.mtransition.MTranstionUtil;
10 | import com.mjun.mtransition.TransitListenerAdapter;
11 |
12 | public class Example2DetailActivity extends Activity {
13 |
14 | AppDetailPage mAppDetailPage;
15 |
16 | @Override
17 | protected void onCreate(Bundle savedInstanceState) {
18 | super.onCreate(savedInstanceState);
19 | mAppDetailPage = new AppDetailPage(this);
20 | AppBean bean = (AppBean) MTransitionManager.getInstance().getTransition("example").getBundle().getObject("bean");
21 | mAppDetailPage.setImageId(bean.mIconId);
22 | mAppDetailPage.setName(bean.mName);
23 | setContentView(mAppDetailPage);
24 | initTranstion();
25 | }
26 |
27 | private void initTranstion() {
28 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
29 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
30 | @Override
31 | public void onPrepare(MTransitionView container) {
32 | container.alpha(0f, 1f);
33 | MTransitionView icon = transition.toPage().addTransitionView("icon", mAppDetailPage.mImage);
34 | MTransitionView name = transition.toPage().addTransitionView("name", mAppDetailPage.mName);
35 | transition.fromPage().getTransitionView("icon").above(icon).transitTo(icon, true);
36 | transition.fromPage().getTransitionView("name").above(name).transitTo(name)/*.setDuration(1000).setStartDelay(500)*/;
37 | }
38 | });
39 | transition.setOnTransitListener(new TransitListenerAdapter() {
40 | @Override
41 | public void onTransitEnd(MTransition transition, boolean reverse) {
42 | if (reverse) {
43 | finish();
44 | MTranstionUtil.removeActivityAnimation(Example2DetailActivity.this);
45 | }
46 | }
47 | });
48 |
49 | transition.setDuration(500);
50 | transition.start();
51 | }
52 |
53 |
54 | @Override
55 | public void onBackPressed() {
56 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
57 | transition.reverse();
58 | }
59 |
60 | @Override
61 | protected void onDestroy() {
62 | super.onDestroy();
63 | MTransitionManager.getInstance().destoryTransition("example");
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/Example10EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.graphics.Bitmap;
7 | import android.graphics.BitmapFactory;
8 | import android.os.Bundle;
9 | import android.support.v7.widget.LinearLayoutManager;
10 | import android.support.v7.widget.RecyclerView;
11 | import android.widget.ImageView;
12 | import com.mjun.demo.R;
13 | import com.mjun.demo.example10.com.view.jameson.library.CardScaleHelper;
14 | import com.mjun.demo.example10.com.view.jameson.util.BlurBitmapUtils;
15 | import com.mjun.demo.example10.com.view.jameson.util.ViewSwitchUtils;
16 |
17 |
18 | /**
19 | * Created by huijun on 2018/4/8.
20 | */
21 |
22 | public class Example10EntryActivity extends Activity {
23 |
24 | private RecyclerView mRecyclerView;
25 | private ImageView mBlurView;
26 | private CardScaleHelper mCardScaleHelper = null;
27 | private Runnable mBlurRunnable;
28 | private int mLastPos = -1;
29 | private List mImgIds = new ArrayList<>();
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | setContentView(R.layout.example10_entry);
35 | init();
36 | }
37 |
38 | private void init() {
39 | mImgIds.add(R.mipmap.img0);
40 | mImgIds.add(R.mipmap.img1);
41 | mImgIds.add(R.mipmap.img2);
42 | mImgIds.add(R.mipmap.img3);
43 | mImgIds.add(R.mipmap.img4);
44 |
45 | mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
46 | final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
47 | mRecyclerView.setLayoutManager(linearLayoutManager);
48 | mRecyclerView.setAdapter(new CardAdapter(this, mImgIds));
49 | // mRecyclerView绑定scale效果
50 | mCardScaleHelper = new CardScaleHelper();
51 | mCardScaleHelper.setCurrentItemPos(2);
52 | mCardScaleHelper.attachToRecyclerView(mRecyclerView);
53 |
54 | initBlurBackground();
55 | }
56 |
57 | private void initBlurBackground() {
58 | mBlurView = (ImageView) findViewById(R.id.blurView);
59 | notifyBackgroundChange();
60 | }
61 |
62 | private void notifyBackgroundChange() {
63 | mLastPos++;
64 | mLastPos = mLastPos % mImgIds.size();
65 | final int resId = mImgIds.get(mLastPos);
66 | mBlurView.removeCallbacks(mBlurRunnable);
67 | mBlurRunnable = new Runnable() {
68 | @Override
69 | public void run() {
70 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId);
71 | ViewSwitchUtils.startSwitchBackgroundAnim(mBlurView, BlurBitmapUtils.getBlurBitmap(mBlurView.getContext(), bitmap, 15));
72 | }
73 | };
74 | mBlurView.post(mBlurRunnable);
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example51/Example51DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example51;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 |
7 | import com.mjun.demo.R;
8 | import com.mjun.mtransition.ITransitPrepareListener;
9 | import com.mjun.mtransition.MTransition;
10 | import com.mjun.mtransition.MTransitionManager;
11 | import com.mjun.mtransition.MTransitionView;
12 | import com.mjun.mtransition.MTranstionUtil;
13 | import com.mjun.mtransition.TransitListenerAdapter;
14 |
15 | /**
16 | * Created by huijun on 2018/4/8.
17 | */
18 |
19 | public class Example51DetailActivity extends Activity {
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.example51_detail);
25 | init();
26 | }
27 |
28 | private void init() {
29 | final View myContainer = findViewById(R.id.container);
30 | final ActionBtn btn = (ActionBtn) findViewById(R.id.exit_btn);
31 | btn.setProgress(1f);
32 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
33 | transition.toPage().setContainer(myContainer, new ITransitPrepareListener() {
34 | @Override
35 | public void onPrepare(MTransitionView container) {
36 | int width = container.getWidth();
37 | container.above(transition.fromPage().getContainer());
38 | container.alpha(0f, 1f);
39 | MTransitionView toBtn = transition.toPage().addTransitionView("btn", btn);
40 | toBtn.hideDuringTrasition();
41 | MTransitionView fromBtn = transition.fromPage().getTransitionView("btn");
42 | ActionBtn replace = new ActionBtn(Example51DetailActivity.this);
43 | fromBtn.replaceBy(replace);
44 | fromBtn.translateYTo(toBtn.getSourceView().getBottom() - fromBtn.getSourceView().getBottom());
45 | }
46 | });
47 |
48 | transition.setOnTransitListener(new TransitListenerAdapter() {
49 | @Override
50 | public void onTransitEnd(MTransition transition, boolean reverse) {
51 | if (reverse) {
52 | finish();
53 | MTranstionUtil.removeActivityAnimation(Example51DetailActivity.this);
54 | }
55 | }
56 | });
57 |
58 | transition.setDuration(500);
59 | transition.start();
60 |
61 | btn.setOnClickListener(new View.OnClickListener() {
62 | @Override
63 | public void onClick(View v) {
64 | reverse();
65 | }
66 | });
67 | }
68 |
69 | private void reverse() {
70 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
71 | transition.reverse();
72 | }
73 |
74 | @Override
75 | public void onBackPressed() {
76 | reverse();
77 | }
78 |
79 | @Override
80 | protected void onDestroy() {
81 | super.onDestroy();
82 | MTransitionManager.getInstance().destoryTransition("example");
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example6/Example6DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example6;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.view.ViewGroup.LayoutParams;
7 |
8 | import com.mjun.demo.R;
9 | import com.mjun.mtransition.ITransitPrepareListener;
10 | import com.mjun.mtransition.MTransition;
11 | import com.mjun.mtransition.MTransitionManager;
12 | import com.mjun.mtransition.MTransitionView;
13 | import com.mjun.mtransition.MTranstionUtil;
14 | import com.mjun.mtransition.TransitListenerAdapter;
15 |
16 | /**
17 | * Created by huijun on 2018/4/8.
18 | */
19 |
20 | public class Example6DetailActivity extends Activity {
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.example6_detail);
26 | init();
27 | }
28 |
29 | private void init() {
30 | final View myContainer = findViewById(R.id.container);
31 | final CatLottieView animView = findViewById(R.id.anim_view);
32 | animView.setProgress(1f);
33 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
34 | transition.toPage().setContainer(myContainer, new ITransitPrepareListener() {
35 | @Override
36 | public void onPrepare(MTransitionView container) {
37 | int width = container.getWidth();
38 | container.translateX(width, 0);
39 | MTransitionView toAnimView = transition.toPage().addTransitionView("animView", animView);
40 | toAnimView.hideDuringTrasition();
41 | MTransitionView fromAnimView = transition.fromPage().getTransitionView("animView");
42 | CatLottieView replace = new CatLottieView(Example6DetailActivity.this);
43 | fromAnimView.replaceBy(replace, new LayoutParams(animView.getWidth(), animView.getHeight()));
44 | fromAnimView.translateXTo(toAnimView.getSourceView().getLeft() - fromAnimView.getSourceView().getLeft());
45 | fromAnimView.above(container);
46 | transition.setDuration(animView.getDuration());
47 | transition.start();
48 | }
49 | });
50 |
51 | transition.setOnTransitListener(new TransitListenerAdapter() {
52 | @Override
53 | public void onTransitEnd(MTransition transition, boolean reverse) {
54 | if (reverse) {
55 | finish();
56 | MTranstionUtil.removeActivityAnimation(Example6DetailActivity.this);
57 | }
58 | }
59 | });
60 |
61 | animView.setOnClickListener(new View.OnClickListener() {
62 | @Override
63 | public void onClick(View v) {
64 | reverse();
65 | }
66 | });
67 | }
68 |
69 | private void reverse() {
70 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
71 | transition.reverse();
72 | }
73 |
74 | @Override
75 | public void onBackPressed() {
76 | reverse();
77 | }
78 |
79 | @Override
80 | protected void onDestroy() {
81 | super.onDestroy();
82 | MTransitionManager.getInstance().destoryTransition("example");
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example4/Example4EntryActivity3.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example4;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.TextView;
9 |
10 | import com.mjun.demo.R;
11 | import com.mjun.mtransition.ITransitPrepareListener;
12 | import com.mjun.mtransition.MTransition;
13 | import com.mjun.mtransition.MTransitionManager;
14 | import com.mjun.mtransition.MTransitionView;
15 | import com.mjun.mtransition.MTranstionUtil;
16 | import com.mjun.mtransition.TransitListenerAdapter;
17 |
18 | public class Example4EntryActivity3 extends Activity {
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.example4_1);
24 | init();
25 | startAnim();
26 | }
27 |
28 | private void init() {
29 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example4_tip31));
30 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example4_tip32));
31 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
32 | @Override
33 | public void onClick(View v) {
34 | MTransition transition = MTransitionManager.getInstance().createTransition("Example4EntryActivity3");
35 | transition.fromPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
36 | @Override
37 | public void onPrepare(MTransitionView container) {
38 |
39 | }
40 | });
41 | Intent intent = new Intent(Example4EntryActivity3.this, Example4EntryActivity4.class);
42 | startActivity(intent);
43 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity3.this);
44 | }
45 | });
46 | findViewById(R.id.container).setBackgroundColor(0xfffee388);
47 | }
48 |
49 | private void startAnim() {
50 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity2");
51 | transition.toPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
52 | @Override
53 | public void onPrepare(MTransitionView container) {
54 | container.alpha(0f, 1f);
55 | }
56 | });
57 | transition.setDuration(500);
58 | transition.start();
59 | }
60 | @Override
61 | protected void onDestroy() {
62 | super.onDestroy();
63 | MTransitionManager.getInstance().destoryTransition("Example4EntryActivity2");
64 | }
65 |
66 | @Override
67 | public void onBackPressed() {
68 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity2");
69 | transition.reverse();
70 | transition.setOnTransitListener(new TransitListenerAdapter() {
71 | @Override
72 | public void onTransitEnd(MTransition transition, boolean reverse) {
73 | if (reverse) {
74 | finish();
75 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity3.this);
76 | }
77 | }
78 | });
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example4/Example4EntryActivity2.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example4;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.TextView;
9 |
10 | import com.mjun.demo.R;
11 | import com.mjun.mtransition.ITransitPrepareListener;
12 | import com.mjun.mtransition.MTransition;
13 | import com.mjun.mtransition.MTransitionManager;
14 | import com.mjun.mtransition.MTransitionView;
15 | import com.mjun.mtransition.MTranstionUtil;
16 | import com.mjun.mtransition.TransitListenerAdapter;
17 |
18 | public class Example4EntryActivity2 extends Activity {
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.example4_1);
24 | init();
25 | startAnim();
26 | }
27 |
28 | private void init() {
29 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example4_tip21));
30 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example4_tip22));
31 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
32 | @Override
33 | public void onClick(View v) {
34 | MTransition transition = MTransitionManager.getInstance().createTransition("Example4EntryActivity2");
35 | transition.fromPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
36 | @Override
37 | public void onPrepare(MTransitionView container) {
38 |
39 | }
40 | });
41 | Intent intent = new Intent(Example4EntryActivity2.this, Example4EntryActivity3.class);
42 | startActivity(intent);
43 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity2.this);
44 | }
45 | });
46 | findViewById(R.id.container).setBackgroundColor(0xfffffea0);
47 | }
48 |
49 | private void startAnim() {
50 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity1");
51 | transition.toPage().setContainer(findViewById(R.id.container), new ITransitPrepareListener() {
52 | @Override
53 | public void onPrepare(MTransitionView container) {
54 | container.translateX(container.getWidth(), 0);
55 | }
56 | });
57 | transition.setDuration(500);
58 | transition.start();
59 | }
60 |
61 | @Override
62 | protected void onDestroy() {
63 | super.onDestroy();
64 | MTransitionManager.getInstance().destoryTransition("Example4EntryActivity1");
65 | }
66 |
67 | @Override
68 | public void onBackPressed() {
69 | final MTransition transition = MTransitionManager.getInstance().getTransition("Example4EntryActivity1");
70 | transition.reverse();
71 | transition.setOnTransitListener(new TransitListenerAdapter() {
72 | @Override
73 | public void onTransitEnd(MTransition transition, boolean reverse) {
74 | if (reverse) {
75 | finish();
76 | MTranstionUtil.removeActivityAnimation(Example4EntryActivity2.this);
77 | }
78 | }
79 | });
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example8/Fragment2.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example8;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.os.Bundle;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v4.app.FragmentManager;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import com.mjun.mtransition.ITransitPrepareListener;
12 | import com.mjun.mtransition.MTransition;
13 | import com.mjun.mtransition.MTransitionManager;
14 | import com.mjun.mtransition.MTransitionView;
15 | import com.mjun.mtransition.TransitListenerAdapter;
16 | import com.mjun.demo.example2.AppBean;
17 | import com.mjun.demo.example2.AppDetailPage;
18 |
19 | /**
20 | * Created by huijun on 2018/4/12.
21 | */
22 |
23 | public class Fragment2 extends Fragment implements Example8Activity.IHandleBack {
24 |
25 | private Activity mActivity;
26 | AppDetailPage mAppDetailPage;
27 |
28 | @Override
29 | public void onAttach(Context context) {
30 | super.onAttach(context);
31 | mActivity = (Activity) context;
32 | }
33 |
34 | @Override
35 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36 | mAppDetailPage = new AppDetailPage(mActivity);
37 | AppBean bean = (AppBean) MTransitionManager.getInstance().getTransition("example").getBundle().getObject("bean");
38 | mAppDetailPage.setImageId(bean.mIconId);
39 | mAppDetailPage.setName(bean.mName);
40 | initTranstion();
41 | return mAppDetailPage;
42 | }
43 |
44 | private void initTranstion() {
45 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
46 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
47 | @Override
48 | public void onPrepare(MTransitionView container) {
49 | container.alpha(0f, 1f);
50 | MTransitionView icon = transition.toPage().addTransitionView("icon", mAppDetailPage.mImage);
51 | MTransitionView name = transition.toPage().addTransitionView("name", mAppDetailPage.mName);
52 | transition.fromPage().getTransitionView("icon").above(icon).transitTo(icon, true);
53 | transition.fromPage().getTransitionView("name").above(name).transitTo(name)/*.setDuration(1000).setStartDelay(500)*/;
54 | }
55 | });
56 |
57 | transition.setDuration(500);
58 | transition.start();
59 | }
60 |
61 | public static Fragment2 newInstance() {
62 | Fragment2 fragment = new Fragment2();
63 | return fragment;
64 | }
65 |
66 | @Override
67 | public void onDetach() {
68 | super.onDetach();
69 | MTransitionManager.getInstance().destoryTransition("example");
70 | }
71 |
72 | @Override
73 | public boolean onBackPressed(final FragmentManager manager) {
74 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
75 | transition.reverse();
76 | transition.setOnTransitListener(new TransitListenerAdapter() {
77 | @Override
78 | public void onTransitEnd(MTransition transition, boolean reverse) {
79 | if (reverse) {
80 | manager.popBackStackImmediate();
81 | }
82 | }
83 | });
84 | return true;
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/example10_entry.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
20 |
21 |
30 |
31 |
37 |
38 |
46 |
47 |
52 |
53 |
58 |
63 |
64 |
65 |
70 |
75 |
76 |
77 |
82 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example3/Example3DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example3;
2 |
3 | import android.app.Activity;
4 | import android.graphics.Color;
5 | import android.os.Bundle;
6 | import android.view.animation.AccelerateInterpolator;
7 | import com.mjun.mtransition.ITransitPrepareListener;
8 | import com.mjun.mtransition.MTransition;
9 | import com.mjun.mtransition.MTransitionManager;
10 | import com.mjun.mtransition.MTransitionView;
11 | import com.mjun.mtransition.MTranstionUtil;
12 | import com.mjun.mtransition.TransitListenerAdapter;
13 | import com.mjun.demo.example2.AppBean;
14 | import com.mjun.demo.example2.AppDetailPage;
15 |
16 | public class Example3DetailActivity extends Activity {
17 |
18 | AppDetailPage mAppDetailPage;
19 | private int mDownX = 0;
20 | private int mClickItemPos = 0;
21 | private int mItemCount = 0;
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | mAppDetailPage = new AppDetailPage(this);
27 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
28 | AppBean bean = (AppBean) transition.getBundle().getObject("bean");
29 | mAppDetailPage.setImageId(bean.mIconId);
30 | mAppDetailPage.setName(bean.mName);
31 | mClickItemPos = transition.getBundle().getInt("clickItemPos", 0);
32 | mItemCount = transition.getBundle().getInt("itemCount", 0);
33 | setContentView(mAppDetailPage);
34 | initTranstion();
35 | }
36 |
37 | private void initTranstion() {
38 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
39 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
40 | @Override
41 | public void onPrepare(MTransitionView container) {
42 | MTransitionView fromContainer = transition.fromPage().getContainer();
43 | fromContainer.setBgColor(Color.TRANSPARENT);
44 | for (int i = 0; i < mItemCount; i++) {
45 | MTransitionView child = transition.fromPage().getTransitionView("item" + i);
46 | if (i <= mClickItemPos) {
47 | child.translateY(0, -container.getHeight()).translateYInterpolator(new AccelerateInterpolator());
48 | } else if (i > mClickItemPos) {
49 | child.translateY(0, container.getHeight()).translateYInterpolator(new AccelerateInterpolator());
50 | }
51 | }
52 | MTransitionView header = transition.fromPage().getTransitionView("header");
53 | header.translateY(0, -header.getHeight()).setDuration(500);
54 | container.below(fromContainer);
55 | }
56 | });
57 |
58 | transition.setOnTransitListener(new TransitListenerAdapter() {
59 | @Override
60 | public void onTransitEnd(MTransition transition, boolean reverse) {
61 | if (reverse) {
62 | finish();
63 | MTranstionUtil.removeActivityAnimation(Example3DetailActivity.this);
64 | }
65 | }
66 | });
67 |
68 | transition.setDuration(800);
69 | transition.start();
70 | }
71 |
72 | @Override
73 | public void onBackPressed() {
74 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
75 | transition.reverse();
76 | }
77 |
78 | @Override
79 | protected void onDestroy() {
80 | super.onDestroy();
81 | MTransitionManager.getInstance().destoryTransition("example");
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/view/CloneView.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition.view;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.graphics.Bitmap;
6 | import android.graphics.Bitmap.Config;
7 | import android.graphics.Canvas;
8 | import android.graphics.Paint;
9 | import android.graphics.Rect;
10 | import android.graphics.drawable.BitmapDrawable;
11 | import android.graphics.drawable.Drawable;
12 | import android.view.View;
13 |
14 | public class CloneView extends View {
15 | private View mSourceView;
16 | private Drawable mDrawable;
17 | private Bitmap mBitmap;
18 | private Paint mPaint = new Paint();
19 | private Rect mBitmapSrcRect = new Rect();
20 | private Rect mBitmapDstRect = new Rect();
21 | private boolean mUseBtmap;
22 | private int mBgColor = -999;
23 |
24 | private boolean mContentChanged = true;
25 |
26 | public CloneView(Context context) {
27 | super(context);
28 | init();
29 | }
30 |
31 | private void init() {
32 | mUseBtmap = false;
33 | mPaint.setAntiAlias(true);
34 | mPaint.setFilterBitmap(true);
35 | }
36 |
37 | public void setUseBitmap(boolean useBitmap) {
38 | mUseBtmap = useBitmap;
39 | }
40 |
41 | public void setSourceView(View view) {
42 | mSourceView = view;
43 | }
44 |
45 | private Bitmap createBitmap(View view, int width, int height) {
46 | if (width == 0 || height == 0) {
47 | return null;
48 | }
49 | Bitmap bitmap = null;
50 | try {
51 | bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
52 | Canvas canvas = new Canvas(bitmap);
53 | view.draw(canvas);
54 | } catch (Throwable ta) {
55 | ta.printStackTrace();
56 | }
57 | return bitmap;
58 | }
59 |
60 | @SuppressLint("MissingSuperCall")
61 | @Override
62 | public void draw(Canvas canvas) {
63 | if (mBgColor != -999) {
64 | canvas.drawColor(mBgColor);
65 | }
66 | createBitmap();
67 | if (mUseBtmap) {
68 | if (mBitmap != null) {
69 | canvas.drawBitmap(mBitmap, 0, 0, mPaint);
70 | }
71 | } else {
72 | if (mSourceView != null) {
73 | mSourceView.draw(canvas);
74 | }
75 | }
76 | }
77 |
78 | private void createBitmap() {
79 | if (mUseBtmap && mContentChanged) {
80 | Bitmap bmp = createBitmap(mSourceView, mSourceView.getWidth(), mSourceView.getHeight());
81 | if (bmp != null) {
82 | mBitmap = bmp;
83 | mBitmapSrcRect.set(0, 0, bmp.getWidth(), bmp.getHeight());
84 | mDrawable = new BitmapDrawable(getContext().getResources(), bmp);
85 | }
86 | mContentChanged = false;
87 | }
88 | }
89 |
90 | public void setSourceDrawableRes(Drawable drawable) {
91 | if (drawable != null) {
92 | mDrawable = drawable;
93 | if (mDrawable != null) {
94 | mBitmapSrcRect.set(0, 0, mDrawable.getIntrinsicWidth(),
95 | mDrawable.getIntrinsicHeight());
96 | }
97 | }
98 | }
99 |
100 | public View getSourceView() {
101 | return mSourceView;
102 | }
103 |
104 | @Override
105 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
106 | setMeasuredDimension(mSourceView.getMeasuredWidth(), mSourceView.getMeasuredHeight());
107 | }
108 |
109 | public void hasChanged() {
110 | mContentChanged = true;
111 | }
112 |
113 | public void setBgColor(int mBgColor) {
114 | this.mBgColor = mBgColor;
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/enter_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
18 |
19 |
25 |
26 |
32 |
33 |
39 |
40 |
46 |
47 |
53 |
54 |
60 |
61 |
67 |
68 |
74 |
75 |
81 |
82 |
88 |
89 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/README_cn.md:
--------------------------------------------------------------------------------
1 | MTransition
2 | ===========================
3 | MTransition是一个Android上的页面切换动画库,它可以让一些复杂的、自定义的页面切换动画更加简单地实现出来,节省开发成本。
4 |
5 | ## Demo Apk
6 | 下载链接:https://github.com/HJ-Money/MTransition/raw/master/Introduction/mtransition_demo.apk
7 | 
8 |
9 | ## 示例
10 | 
11 |
12 | `该交互设计来源于:https://dribbble.com/shots/2493845-ToFind-Transition-Test`
13 |
14 | 在上面的动图示例中,动画执行前后分别是**两个不同的Activity**。如下图:
15 |  
16 |
17 | 像这种跨Activity的切换动画是现有技术比较难实现的,并且还需要**响应用户的跟手操作**。MTransition非常适合这种情况。
18 |
19 | **作为开发者的你,只需要完成两个Activity的UI开发即可,中间的过渡动画交给MTransiton处理,MTransiton可以完美实现你需要的各种页面切换\过渡动画,节省你的开发时间。**
20 |
21 | 更多示例请看本仓库代码或者[SlidingActivity](https://github.com/HJ-Money/SlidingActivity)
22 |
23 | ## 使用MTransition
24 |
25 | MTransition适用于**所有页面的切换动画,这里的页面不一定是Activity,也可以是Fragment、Window或者是同一个Activity的两个View,但是页面必须是占满整个屏幕的**,否则可能会出现效果不符合预期。
26 |
27 | #### 你可以通过Gradle引用它:
28 | ```Java
29 | compile 'com.mjun:mtransition:0.1.3'
30 | ```
31 |
32 | 现假设我们需要实现一个从页面A(FromPage)到页面B(ToPage)的过渡动画,首先我们先完成页面A和页面B本身的UI开发,然后可以用MTransition完成过渡动画。
33 | #### 基础用法
34 |
35 | **step1**、在页面A打开页面B之前创建MTransition,并设置页面A最外层的View给MTransition:
36 | ```Java
37 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
38 | transition.fromPage().setContainer(mContainerView, new ITransitPrepareListener() {
39 | @Override
40 | public void onPrepare(MTransitionView container) {
41 | // 传递需要做动画的View
42 | transition.fromPage().addTransitionView("icon", mIconView);
43 | ...
44 | }
45 | });
46 | ```
47 |
48 | **step2**、在页面B创建之后,且在页面显示之前,设置页面B最外层的View给MTransition,同时告诉MTransition页面的View要做哪些动画,调整View顺序等:
49 | ```Java
50 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
51 | transition.toPage().setContainer(mContainerView, new ITransitPrepareListener() {
52 | @Override
53 | public void onPrepare(MTransitionView container) {
54 | container.alpha(0f, 1f);
55 | MTransitionView icon = transition.toPage().addTransitionView("icon", mImageView);
56 | transition.fromPage().getTransitionView("icon").above(icon).transitTo(icon, true);
57 | }
58 | });
59 | ```
60 |
61 | **step3**、设置动画时长,然后start MTransition,一个过渡动画即完成
62 | ```Java
63 | transition.setDuration(500);
64 | transition.start();
65 | ```
66 |
67 | ##### NOTE:
68 | **1**、如果页面A和B是Activity的话,因为Activity默认是有Activity的进场退场动画,所以需要在startActivity()和finish()之后调用以下代码:
69 | ```Java
70 | startActivity(intent);
71 | MTranstionUtil.removeActivityAnimation(this);
72 | ```
73 |
74 | ```Java
75 | finish();
76 | MTranstionUtil.removeActivityAnimation(this);
77 | ```
78 |
79 | **2**、在确定不再需要当前页面的MTransition时,请务必调用destoryTransition()来销毁MTransition,不然会内存泄漏:
80 | ```Java
81 | MTransitionManager.getInstance().destoryTransition("example");
82 | ```
83 |
84 | #### 进阶用法
85 | ##### 反向动画
86 | 在页面B返回页面A时,你很有可能需要刚才的过渡动画反向执行一次,这时候可以调用reverse(),执行一遍反向动画,当然你可以随时改变动画路径,
87 | 例如你可以改变动画时长、甚至完全换一个过渡动画;
88 | ```Java
89 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
90 | transition.reverse();
91 | ```
92 |
93 | ##### 定格动画
94 | 你可以调用setProgress()让动画停留在你想要的地方,因此你可以利用这点实现跟手动画,具体请参考本仓库代码;
95 |
96 | ##### 自定义动画
97 | MTransition已经提供了一堆基础的动画api,例如平移、旋转、缩放、透明度等。这些api已经可以满足大部分需求,但是如果你需要一些形变或者更加复杂的动画,
98 | 你就需要自定义动画。
99 |
100 | **step1**、将你的自定义动画View实现ITransitional接口
101 |
102 | **step2**、调用replaceBy()接口,将你的自定义动画View替换原本的View,让它在过渡动画过程中做动画
103 |
104 | 该方案可以**结合Lottie或者其他动画库**,实现一些非常酷炫的效果,如下图,具体请参考本仓库代码中的Demo5、6、7;
105 |
106 |  
107 |
108 | ## 其他说明
109 | 目前该库处在探索优化阶段,接下来一方面会去优化性能,尝试更优的实现方案,另一方面将往“解除页面必须占满屏幕的限制”方向进发,让MTransition可以服务
110 | 任意区域的过渡动画。
111 |
112 |
113 | ## 更详细的使用介绍请看这里:https://www.jianshu.com/p/c9c3a1de2e1c
114 |
115 |
116 | --------------------------------
117 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/appdetail_page.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
21 |
22 |
30 |
31 |
32 |
33 |
39 |
40 |
48 |
49 |
53 |
54 |
61 |
62 |
68 |
69 |
70 |
71 |
81 |
82 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example41/Example41EntryActivity4.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example41;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.MotionEvent;
6 | import android.view.View;
7 | import android.widget.TextView;
8 |
9 | import com.mjun.demo.R;
10 | import com.mjun.mtransition.ITransitPrepareListener;
11 | import com.mjun.mtransition.MTransition;
12 | import com.mjun.mtransition.MTransitionManager;
13 | import com.mjun.mtransition.MTransitionView;
14 | import com.mjun.mtransition.MTranstionUtil;
15 | import com.mjun.mtransition.TransitListenerAdapter;
16 |
17 | public class Example41EntryActivity4 extends Activity {
18 |
19 | private int mDownX = 0;
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.example41_1);
25 | init();
26 | startAnim();
27 | }
28 |
29 | private void init() {
30 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example41_tip41));
31 | findViewById(R.id.button).setVisibility(View.GONE);
32 | findViewById(R.id.content).setBackgroundColor(0xffe9ae6a);
33 | }
34 |
35 | private void startAnim() {
36 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity3");
37 | transition.toPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
38 | @Override
39 | public void onPrepare(MTransitionView container) {
40 | MTransitionView content = transition.toPage().addTransitionView("content", findViewById(R.id.content));
41 | int width = container.getWidth();
42 | transition.fromPage().getContainer().translateX(0, -width / 4);
43 | content.translateX(container.getWidth(), 0);
44 | container.alpha(0f, 1f);
45 | }
46 | });
47 |
48 | transition.setOnTransitListener(new TransitListenerAdapter() {
49 | @Override
50 | public void onTransitEnd(MTransition transition, boolean reverse) {
51 | if (reverse) {
52 | finish();
53 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity4.this);
54 | }
55 | }
56 | });
57 |
58 | transition.setDuration(500);
59 | transition.start();
60 |
61 | // 滑动返回
62 | findViewById(R.id.wrapper).setOnTouchListener(new View.OnTouchListener() {
63 | @Override
64 | public boolean onTouch(View v, MotionEvent event) {
65 | int action = event.getAction();
66 | if (action == MotionEvent.ACTION_DOWN) {
67 | transition.onBeginDrag();
68 | mDownX = (int) event.getX();
69 | } else if (action == MotionEvent.ACTION_MOVE) {
70 | int delta = (int) (event.getX() - mDownX);
71 | transition.setProgress(1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth());
72 | } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
73 | int delta = (int) (event.getX() - mDownX);
74 | float progress = 1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth();
75 | if (progress < 0.5f) {
76 | transition.gotoCeil();
77 | } else {
78 | transition.gotoFloor();
79 | }
80 | }
81 | return true;
82 | }
83 | });
84 | }
85 |
86 | @Override
87 | protected void onDestroy() {
88 | super.onDestroy();
89 | MTransitionManager.getInstance().destoryTransition("Activity3");
90 | }
91 |
92 | @Override
93 | public void onBackPressed() {
94 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity3");
95 | transition.reverse();
96 | }
97 |
98 | }
99 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example10/CardAdapter.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example10;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Intent;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.ImageView;
12 | import com.mjun.demo.R;
13 | import com.mjun.mtransition.ITransitPrepareListener;
14 | import com.mjun.mtransition.MTransition;
15 | import com.mjun.mtransition.MTransitionManager;
16 | import com.mjun.mtransition.MTransitionView;
17 | import com.mjun.mtransition.MTranstionUtil;
18 |
19 | /**
20 | * Created by huijun on 2018/4/16.
21 | */
22 |
23 | public class CardAdapter extends RecyclerView.Adapter {
24 |
25 | private Activity mActivity;
26 | private List mImgIds = new ArrayList<>();
27 |
28 | public CardAdapter(Activity mActivity, List imgIds) {
29 | this.mActivity = mActivity;
30 | mImgIds = imgIds;
31 | }
32 |
33 | @Override
34 | public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
35 | View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.example10_card_item,
36 | parent, false);
37 | return new ViewHolder(itemView);
38 | }
39 |
40 | @Override
41 | public void onBindViewHolder(ViewHolder holder, final int position) {
42 | holder.mImage.setImageResource(mImgIds.get(position));
43 | holder.mContent.setOnClickListener(new View.OnClickListener() {
44 | @Override
45 | public void onClick(View v) {
46 | initTransition(v);
47 | MTransitionManager.getInstance().getTransition("example").getBundle().putInt("imgId", mImgIds.get(position));
48 | Intent intent = new Intent(mActivity, Example10DetailActivity.class);
49 | mActivity.startActivity(intent);
50 | MTranstionUtil.removeActivityAnimation(mActivity);
51 | }
52 | });
53 | }
54 |
55 |
56 | private void initTransition(final View card) {
57 | View myContainer = mActivity.findViewById(R.id.container);
58 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
59 | transition.fromPage().setContainer(myContainer, new ITransitPrepareListener() {
60 | @Override
61 | public void onPrepare(MTransitionView container) {
62 | transition.fromPage().addTransitionView("header", mActivity.findViewById(R.id.header));
63 | transition.fromPage().addTransitionView("footer", mActivity.findViewById(R.id.footer));
64 | transition.fromPage().addTransitionView("image", card.findViewById(R.id.image));
65 | transition.fromPage().addTransitionView("title", card.findViewById(R.id.title));
66 | transition.fromPage().addTransitionView("number", card.findViewById(R.id.number));
67 | transition.fromPage().addTransitionView("stars", card.findViewById(R.id.stars));
68 | transition.fromPage().addTransitionView("head0", card.findViewById(R.id.head0));
69 | transition.fromPage().addTransitionView("head1", card.findViewById(R.id.head1));
70 | transition.fromPage().addTransitionView("head2", card.findViewById(R.id.head2));
71 | transition.fromPage().addTransitionView("head3", card.findViewById(R.id.head3));
72 | transition.fromPage().addTransitionView("card_bg", card.findViewById(R.id.card_bg));
73 | }
74 | });
75 | }
76 |
77 | @Override
78 | public int getItemCount() {
79 | return mImgIds.size();
80 | }
81 |
82 | public class ViewHolder extends RecyclerView.ViewHolder {
83 |
84 | private View mContent;
85 | private ImageView mImage;
86 |
87 | public ViewHolder(final View itemView) {
88 | super(itemView);
89 | mContent = itemView;
90 | mImage = itemView.findViewById(R.id.image);
91 | }
92 |
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example1/Example1DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example1;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.view.MotionEvent;
6 | import android.view.View;
7 | import com.mjun.demo.R;
8 | import com.mjun.mtransition.ITransitPrepareListener;
9 | import com.mjun.mtransition.MTransition;
10 | import com.mjun.mtransition.MTransitionManager;
11 | import com.mjun.mtransition.MTransitionView;
12 |
13 | import com.mjun.mtransition.MTranstionUtil;
14 | import com.mjun.mtransition.TransitListenerAdapter;
15 | import com.mjun.demo.example2.AppBean;
16 | import com.mjun.demo.example2.AppDetailPage;
17 |
18 | public class Example1DetailActivity extends Activity {
19 |
20 | AppDetailPage mAppDetailPage;
21 | private int mDownX = 0;
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | mAppDetailPage = new AppDetailPage(this);
27 | AppBean bean = (AppBean) MTransitionManager.getInstance().getTransition("example").getBundle().getObject("bean");
28 | mAppDetailPage.setImageId(bean.mIconId);
29 | mAppDetailPage.setName(bean.mName);
30 | setContentView(mAppDetailPage);
31 | mAppDetailPage.setContent(getString(R.string.example0_tip));
32 | initTranstion();
33 | }
34 |
35 | private void initTranstion() {
36 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
37 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
38 | @Override
39 | public void onPrepare(MTransitionView container) {
40 | int width = container.getWidth();
41 | transition.fromPage().getTransitionView("container").translateX(0, -width / 4);
42 | container.translateX(width, 0);
43 | }
44 | });
45 |
46 | transition.setOnTransitListener(new TransitListenerAdapter() {
47 |
48 | @Override
49 | public void onTransitEnd(MTransition transition, boolean reverse) {
50 | if (!reverse) {
51 | // 修改动画
52 | transition.fromPage().getTransitionView("container").translateX(0, 0);
53 | transition.toPage().getContainer().translateX(0, 0).alpha(0f, 1f);
54 | } else {
55 | finish();
56 | MTranstionUtil.removeActivityAnimation(Example1DetailActivity.this);
57 | }
58 | }
59 | });
60 |
61 | transition.setDuration(500);
62 | transition.start();
63 |
64 | // 滑动返回
65 | mAppDetailPage.setOnTouchListener(new View.OnTouchListener() {
66 | @Override
67 | public boolean onTouch(View v, MotionEvent event) {
68 | int action = event.getAction();
69 | if (action == MotionEvent.ACTION_DOWN) {
70 | transition.onBeginDrag();
71 | mDownX = (int) event.getX();
72 | } else if (action == MotionEvent.ACTION_MOVE) {
73 | int delta = (int) (event.getX() - mDownX);
74 | transition.setProgress(1f - delta / (float) mAppDetailPage.getMeasuredWidth());
75 | } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
76 | int delta = (int) (event.getX() - mDownX);
77 | float progress = 1f - delta / (float) mAppDetailPage.getMeasuredWidth();
78 | if (progress < 0.5f) {
79 | transition.gotoCeil();
80 | } else {
81 | transition.gotoFloor();
82 | }
83 | }
84 | return true;
85 | }
86 | });
87 | }
88 |
89 | @Override
90 | public void onBackPressed() {
91 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
92 | transition.reverse();
93 | }
94 |
95 | @Override
96 | protected void onDestroy() {
97 | super.onDestroy();
98 | MTransitionManager.getInstance().destoryTransition("example");
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example1/Example1EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example1;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.AdapterView;
12 | import android.widget.BaseAdapter;
13 | import android.widget.ImageView;
14 | import android.widget.TextView;
15 | import com.mjun.demo.R;
16 | import com.mjun.mtransition.ITransitPrepareListener;
17 | import com.mjun.mtransition.MTransition;
18 | import com.mjun.mtransition.MTransitionManager;
19 | import com.mjun.mtransition.MTransitionView;
20 | import com.mjun.demo.example2.AppBean;
21 | import com.mjun.demo.example2.AppListPage;
22 | import com.mjun.demo.model.AppModel;
23 | import com.mjun.mtransition.MTranstionUtil;
24 |
25 | public class Example1EntryActivity extends Activity{
26 |
27 |
28 | private AppListPage mPage;
29 | // 数据
30 | private List mBeans = new ArrayList<>();
31 |
32 | @Override
33 | protected void onCreate(Bundle savedInstanceState) {
34 | super.onCreate(savedInstanceState);
35 | mPage = new AppListPage(this);
36 | setContentView(mPage);
37 | init();
38 | }
39 |
40 | private void init() {
41 | genDatas();
42 | mPage.mListView.setAdapter(new Example1EntryActivity.DemoListAdapter());
43 | mPage.mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
44 | @Override
45 | public void onItemClick(AdapterView> parent, final View view, int position, long id) {
46 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
47 | transition.fromPage().setContainer(mPage, new ITransitPrepareListener() {
48 | @Override
49 | public void onPrepare(MTransitionView container) {
50 | transition.fromPage().addTransitionView("container", mPage);
51 | }
52 | });
53 | transition.getBundle().putObject("bean", mBeans.get(position));
54 | Intent intent = new Intent(mPage.getContext(), Example1DetailActivity.class);
55 | mPage.getContext().startActivity(intent);
56 | MTranstionUtil.removeActivityAnimation(Example1EntryActivity.this);
57 | }
58 | });
59 | }
60 |
61 | private void genDatas() {
62 | for (int i = 0 ; i < 20; i++) {
63 | AppBean bean = new AppBean();
64 | String iconId = "icon_" + (i + 1);
65 | int identify = getResources().getIdentifier(iconId, "mipmap", "com.mjun.mtransition");
66 | if (identify == 0) {
67 | identify = R.mipmap.icon_1;
68 | }
69 | bean.mIconId = identify;
70 | bean.mName = AppModel.getInstance().getTitleArray(this)[i];
71 | bean.mSnapshot = AppModel.getInstance().getCategoryArray(this)[i];
72 | mBeans.add(bean);
73 | }
74 | }
75 |
76 | private class DemoListAdapter extends BaseAdapter {
77 |
78 | @Override
79 | public int getCount() {
80 | return mBeans.size();
81 | }
82 |
83 | @Override
84 | public Object getItem(int position) {
85 | return mBeans.get(position);
86 | }
87 |
88 | @Override
89 | public long getItemId(int position) {
90 | return position;
91 | }
92 |
93 | @Override
94 | public View getView(int position, View convertView, ViewGroup parent) {
95 | if (convertView == null) {
96 | convertView = LayoutInflater.from(mPage.getContext()).inflate(R.layout.app_item_view, parent, false);
97 | }
98 | AppBean bean = mBeans.get(position);
99 | ((ImageView) convertView.findViewById(R.id.item_icon)).setImageResource(bean.mIconId);
100 | ((TextView) convertView.findViewById(R.id.item_name)).setText(bean.mName);
101 | ((TextView) convertView.findViewById(R.id.item_snapshot)).setText(bean.mSnapshot);
102 | return convertView;
103 | }
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example9/Page1.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example9;
2 |
3 | import java.util.*;
4 |
5 | import android.content.Context;
6 | import android.support.annotation.NonNull;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.AdapterView;
11 | import android.widget.BaseAdapter;
12 | import android.widget.FrameLayout;
13 | import android.widget.ImageView;
14 | import android.widget.TextView;
15 |
16 | import com.mjun.demo.R;
17 | import com.mjun.mtransition.ITransitPrepareListener;
18 | import com.mjun.mtransition.MTransition;
19 | import com.mjun.mtransition.MTransitionManager;
20 | import com.mjun.mtransition.MTransitionView;
21 | import com.mjun.demo.example2.AppBean;
22 | import com.mjun.demo.example2.AppListPage;
23 | import com.mjun.demo.model.AppModel;
24 |
25 | /**
26 | * Created by huijun on 2018/4/16.
27 | */
28 |
29 | public class Page1 extends FrameLayout {
30 |
31 |
32 | private AppListPage mPage;
33 | // 数据
34 | private List mBeans = new ArrayList<>();
35 |
36 | public Page1(@NonNull Context context) {
37 | super(context);
38 | mPage = new AppListPage(context);
39 | addView(mPage);
40 | init();
41 | }
42 |
43 | private void init() {
44 | genDatas();
45 | mPage.mListView.setAdapter(new Page1.DemoListAdapter());
46 | mPage.mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
47 | @Override
48 | public void onItemClick(AdapterView> parent, final View view, int position, long id) {
49 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
50 | transition.fromPage().setContainer(mPage, new ITransitPrepareListener() {
51 | @Override
52 | public void onPrepare(MTransitionView container) {
53 | transition.fromPage().addTransitionView("icon", view.findViewById(R.id.item_icon));
54 | transition.fromPage().addTransitionView("name", view.findViewById(R.id.item_name));
55 | transition.fromPage().addTransitionView("snapshot", view.findViewById(R.id.item_snapshot));
56 | transition.fromPage().addTransitionView("container", mPage);
57 | }
58 | });
59 | transition.getBundle().putObject("bean", mBeans.get(position));
60 | ((Example9Activity) getContext()).enterOtherPage();
61 | }
62 | });
63 | }
64 |
65 | private void genDatas() {
66 | for (int i = 0 ; i < 20; i++) {
67 | AppBean bean = new AppBean();
68 | String iconId = "icon_" + (i + 1);
69 | int identify = getResources().getIdentifier(iconId, "mipmap", "com.mjun.mtransition");
70 | if (identify == 0) {
71 | identify = R.mipmap.icon_1;
72 | }
73 | bean.mIconId = identify;
74 | bean.mName = AppModel.getInstance().getTitleArray(getContext())[i];
75 | bean.mSnapshot = AppModel.getInstance().getCategoryArray(getContext())[i];
76 | mBeans.add(bean);
77 | }
78 | }
79 |
80 | private class DemoListAdapter extends BaseAdapter {
81 |
82 | @Override
83 | public int getCount() {
84 | return mBeans.size();
85 | }
86 |
87 | @Override
88 | public Object getItem(int position) {
89 | return mBeans.get(position);
90 | }
91 |
92 | @Override
93 | public long getItemId(int position) {
94 | return position;
95 | }
96 |
97 | @Override
98 | public View getView(int position, View convertView, ViewGroup parent) {
99 | if (convertView == null) {
100 | convertView = LayoutInflater.from(mPage.getContext()).inflate(R.layout.app_item_view, parent, false);
101 | }
102 | AppBean bean = mBeans.get(position);
103 | ((ImageView) convertView.findViewById(R.id.item_icon)).setImageResource(bean.mIconId);
104 | ((TextView) convertView.findViewById(R.id.item_name)).setText(bean.mName);
105 | ((TextView) convertView.findViewById(R.id.item_snapshot)).setText(bean.mSnapshot);
106 | return convertView;
107 | }
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example0/Example0DetailActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example0;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 | import android.view.View.OnClickListener;
9 | import com.mjun.demo.R;
10 | import com.mjun.mtransition.ITransitPrepareListener;
11 | import com.mjun.mtransition.MTransition;
12 | import com.mjun.mtransition.MTransitionManager;
13 | import com.mjun.mtransition.MTransitionView;
14 |
15 | import com.mjun.mtransition.MTranstionUtil;
16 | import com.mjun.mtransition.TransitListenerAdapter;
17 | import com.mjun.demo.TestActivityAnimtaionActivity;
18 | import com.mjun.demo.example2.AppBean;
19 | import com.mjun.demo.example2.AppDetailPage;
20 |
21 | public class Example0DetailActivity extends Activity {
22 |
23 | AppDetailPage mAppDetailPage;
24 | private int mDownX = 0;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | mAppDetailPage = new AppDetailPage(this);
30 | AppBean bean = (AppBean) MTransitionManager.getInstance().getTransition("example").getBundle().getObject("bean");
31 | mAppDetailPage.setImageId(bean.mIconId);
32 | mAppDetailPage.setName(bean.mName);
33 | setContentView(mAppDetailPage);
34 | mAppDetailPage.setContent(getString(R.string.example0_tip));
35 | initTranstion();
36 | }
37 |
38 | private void initTranstion() {
39 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
40 | transition.toPage().setContainer(mAppDetailPage, new ITransitPrepareListener() {
41 | @Override
42 | public void onPrepare(MTransitionView container) {
43 | int width = container.getWidth();
44 | transition.fromPage().getTransitionView("container").translateX(0, -width / 4);
45 | container.translateX(width, 0);
46 | }
47 | });
48 | transition.setOnTransitListener(new TransitListenerAdapter() {
49 | @Override
50 | public void onTransitEnd(MTransition transition, boolean reverse) {
51 | if (reverse) {
52 | finish();
53 | MTranstionUtil.removeActivityAnimation(Example0DetailActivity.this);
54 | }
55 | }
56 | });
57 | transition.setDuration(500);
58 | transition.start();
59 |
60 | mAppDetailPage.mImage.setOnClickListener(new OnClickListener() {
61 | @Override
62 | public void onClick(View v) {
63 | Intent intent = new Intent(Example0DetailActivity.this, TestActivityAnimtaionActivity.class);
64 | startActivity(intent);
65 | }
66 | });
67 |
68 | // 滑动返回
69 | mAppDetailPage.setOnTouchListener(new View.OnTouchListener() {
70 | @Override
71 | public boolean onTouch(View v, MotionEvent event) {
72 | int action = event.getAction();
73 | if (action == MotionEvent.ACTION_DOWN) {
74 | transition.onBeginDrag();
75 | mDownX = (int) event.getX();
76 | } else if (action == MotionEvent.ACTION_MOVE) {
77 | int delta = (int) (event.getX() - mDownX);
78 | transition.setProgress(1f - delta / (float) mAppDetailPage.getMeasuredWidth());
79 | } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
80 | int delta = (int) (event.getX() - mDownX);
81 | float progress = 1f - delta / (float) mAppDetailPage.getMeasuredWidth();
82 | if (progress < 0.5f) {
83 | transition.gotoCeil();
84 | } else {
85 | transition.gotoFloor();
86 | }
87 | }
88 | return true;
89 | }
90 | });
91 | }
92 |
93 | @Override
94 | public void onBackPressed() {
95 | final MTransition transition = MTransitionManager.getInstance().getTransition("example");
96 | transition.reverse();
97 | }
98 |
99 | @Override
100 | protected void onDestroy() {
101 | super.onDestroy();
102 | MTransitionManager.getInstance().destoryTransition("example");
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example2/Example2EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example2;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.AdapterView;
12 | import android.widget.BaseAdapter;
13 | import android.widget.ImageView;
14 | import android.widget.TextView;
15 | import com.mjun.demo.R;
16 | import com.mjun.mtransition.ITransitPrepareListener;
17 | import com.mjun.mtransition.MTransition;
18 | import com.mjun.mtransition.MTransitionManager;
19 | import com.mjun.mtransition.MTransitionView;
20 |
21 | import com.mjun.demo.model.AppModel;
22 | import com.mjun.mtransition.MTranstionUtil;
23 |
24 | public class Example2EntryActivity extends Activity {
25 |
26 | private AppListPage mPage;
27 | // 数据
28 | private List mBeans = new ArrayList<>();
29 |
30 | @Override
31 | protected void onCreate(Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | mPage = new AppListPage(this);
34 | setContentView(mPage);
35 | init();
36 | }
37 |
38 | private void init() {
39 | genDatas();
40 | mPage.mListView.setAdapter(new DemoListAdapter());
41 | mPage.mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
42 | @Override
43 | public void onItemClick(AdapterView> parent, final View view, int position, long id) {
44 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
45 | transition.fromPage().setContainer(mPage, new ITransitPrepareListener() {
46 | @Override
47 | public void onPrepare(MTransitionView container) {
48 | transition.fromPage().addTransitionView("icon", view.findViewById(R.id.item_icon));
49 | transition.fromPage().addTransitionView("name", view.findViewById(R.id.item_name));
50 | transition.fromPage().addTransitionView("snapshot", view.findViewById(R.id.item_snapshot));
51 | transition.fromPage().addTransitionView("container", mPage);
52 | }
53 | });
54 | transition.getBundle().putObject("bean", mBeans.get(position));
55 | Intent intent = new Intent(mPage.getContext(), Example2DetailActivity.class);
56 | mPage.getContext().startActivity(intent);
57 | MTranstionUtil.removeActivityAnimation(Example2EntryActivity.this);
58 | }
59 | });
60 | }
61 |
62 | private void genDatas() {
63 | for (int i = 0 ; i < 20; i++) {
64 | AppBean bean = new AppBean();
65 | String iconId = "icon_" + (i + 1);
66 | int identify = getResources().getIdentifier(iconId, "mipmap", "com.mjun.mtransition");
67 | if (identify == 0) {
68 | identify = R.mipmap.icon_1;
69 | }
70 | bean.mIconId = identify;
71 | bean.mName = AppModel.getInstance().getTitleArray(this)[i];
72 | bean.mSnapshot = AppModel.getInstance().getCategoryArray(this)[i];
73 | mBeans.add(bean);
74 | }
75 | }
76 |
77 | private class DemoListAdapter extends BaseAdapter {
78 |
79 | @Override
80 | public int getCount() {
81 | return mBeans.size();
82 | }
83 |
84 | @Override
85 | public Object getItem(int position) {
86 | return mBeans.get(position);
87 | }
88 |
89 | @Override
90 | public long getItemId(int position) {
91 | return position;
92 | }
93 |
94 | @Override
95 | public View getView(int position, View convertView, ViewGroup parent) {
96 | if (convertView == null) {
97 | convertView = LayoutInflater.from(mPage.getContext()).inflate(R.layout.app_item_view, parent, false);
98 | }
99 | AppBean bean = mBeans.get(position);
100 | ((ImageView) convertView.findViewById(R.id.item_icon)).setImageResource(bean.mIconId);
101 | ((TextView) convertView.findViewById(R.id.item_name)).setText(bean.mName);
102 | ((TextView) convertView.findViewById(R.id.item_snapshot)).setText(bean.mSnapshot);
103 | return convertView;
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example0/Example0EntryActivity.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example0;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.AdapterView;
12 | import android.widget.BaseAdapter;
13 | import android.widget.ImageView;
14 | import android.widget.TextView;
15 | import com.mjun.demo.R;
16 | import com.mjun.mtransition.ITransitPrepareListener;
17 | import com.mjun.mtransition.MTransition;
18 | import com.mjun.mtransition.MTransitionManager;
19 | import com.mjun.mtransition.MTransitionView;
20 | import com.mjun.mtransition.MTranstionUtil;
21 |
22 | import com.mjun.demo.example2.AppBean;
23 | import com.mjun.demo.example2.AppListPage;
24 | import com.mjun.demo.model.AppModel;
25 |
26 | public class Example0EntryActivity extends Activity{
27 |
28 |
29 | private AppListPage mPage;
30 | // 数据
31 | private List mBeans = new ArrayList<>();
32 |
33 | @Override
34 | protected void onCreate(Bundle savedInstanceState) {
35 | super.onCreate(savedInstanceState);
36 | mPage = new AppListPage(this);
37 | setContentView(mPage);
38 | init();
39 | }
40 |
41 | private void init() {
42 | genDatas();
43 | mPage.mListView.setAdapter(new Example0EntryActivity.DemoListAdapter());
44 | mPage.mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
45 | @Override
46 | public void onItemClick(AdapterView> parent, final View view, int position, long id) {
47 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
48 | transition.fromPage().setContainer(mPage, new ITransitPrepareListener() {
49 | @Override
50 | public void onPrepare(MTransitionView container) {
51 | transition.fromPage().addTransitionView("container", mPage);
52 | }
53 | });
54 | transition.getBundle().putObject("bean", mBeans.get(position));
55 | Intent intent = new Intent(mPage.getContext(), Example0DetailActivity.class);
56 | //if (position == 2) {
57 | // MTranstionUtil.resumeActivityAnimation(Example0EntryActivity.this);
58 | // intent = new Intent(mPage.getContext(), TestActivityAnimtaionActivity.class);
59 | //}
60 | mPage.getContext().startActivity(intent);
61 | MTranstionUtil.removeActivityAnimation(Example0EntryActivity.this);
62 | }
63 | });
64 | }
65 |
66 | private void genDatas() {
67 | for (int i = 0 ; i < 20; i++) {
68 | AppBean bean = new AppBean();
69 | String iconId = "icon_" + (i + 1);
70 | int identify = getResources().getIdentifier(iconId, "mipmap", "com.mjun.mtransition");
71 | if (identify == 0) {
72 | identify = R.mipmap.icon_1;
73 | }
74 | bean.mIconId = identify;
75 | bean.mName = AppModel.getInstance().getTitleArray(this)[i];
76 | bean.mSnapshot = AppModel.getInstance().getCategoryArray(this)[i];
77 | mBeans.add(bean);
78 | }
79 | }
80 |
81 | private class DemoListAdapter extends BaseAdapter {
82 |
83 | @Override
84 | public int getCount() {
85 | return mBeans.size();
86 | }
87 |
88 | @Override
89 | public Object getItem(int position) {
90 | return mBeans.get(position);
91 | }
92 |
93 | @Override
94 | public long getItemId(int position) {
95 | return position;
96 | }
97 |
98 | @Override
99 | public View getView(int position, View convertView, ViewGroup parent) {
100 | if (convertView == null) {
101 | convertView = LayoutInflater.from(mPage.getContext()).inflate(R.layout.app_item_view, parent, false);
102 | }
103 | AppBean bean = mBeans.get(position);
104 | ((ImageView) convertView.findViewById(R.id.item_icon)).setImageResource(bean.mIconId);
105 | ((TextView) convertView.findViewById(R.id.item_name)).setText(bean.mName);
106 | ((TextView) convertView.findViewById(R.id.item_snapshot)).setText(bean.mSnapshot);
107 | return convertView;
108 | }
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/mtransition/src/main/java/com/mjun/mtransition/MTranstionUtil.java:
--------------------------------------------------------------------------------
1 | package com.mjun.mtransition;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Intent;
7 | import android.os.Build;
8 | import android.text.TextUtils;
9 | import android.view.View;
10 |
11 | /**
12 | * @author huijun.zhj
13 | * 工具类
14 | */
15 | public class MTranstionUtil {
16 |
17 | /**
18 | * 保存Acitivty的Window动画设置
19 | */
20 | private static Map sAnimationMap = new HashMap<>();
21 |
22 | /**
23 | * 因为Android默认会给Activity启动和关闭的动画,这会与MTranstion的动画冲突,所以需要在必要的时候去掉Android的默认动画
24 | * 一般情况下,会在FromPage的{@link MTransitionPage#setContainer(View, ITransitPrepareListener)}主动调用一次
25 | *
26 | * Because Android defaults to the Activity start and close animation, this will conflict with the MTranstion
27 | * animation, so you need to remove the Android default Activity animation when necessary
28 | * In general, it will be invoked once in FromPage's
29 | * {@link MTransitionPage#setContainer(View, ITransitPrepareListener)}
30 | *
31 | * @param activity
32 | */
33 | public static void removeActivityCloseAnimation(Activity activity) {
34 | if (activity != null) {
35 | saveAnimtaion(activity);
36 | if (Build.VERSION.SDK_INT >= 26 && !isHuawei()) {
37 | // android o 并且不是华为
38 | activity.getWindow().setWindowAnimations(R.style._mtransition_activityCloseNoAnimation_androido);
39 | } else {
40 | activity.getWindow().setWindowAnimations(R.style._mtransition_activityCloseNoAnimation);
41 | }
42 | }
43 | }
44 |
45 | /**
46 | * 因为Android默认会给Activity启动和关闭的动画,这会与MTranstion的动画冲突,所以需要在必要的时候去掉Android的默认动画
47 | * 一般情况下,会在ToPage的{@link MTransitionPage#setContainer(View, ITransitPrepareListener)}主动调用一次
48 | *
49 | * Because Android defaults to the Activity start and close animation, this will conflict with the MTranstion
50 | * animation, so you need to remove the Android default Activity animation when necessary
51 | * In general, it will be invoked once in ToPage's
52 | * {@link MTransitionPage#setContainer(View, ITransitPrepareListener)}
53 | *
54 | * @param activity
55 | */
56 | public static void removeActivityOpenAnimation(Activity activity) {
57 | if (activity != null) {
58 | saveAnimtaion(activity);
59 | if (Build.VERSION.SDK_INT >= 26 && !isHuawei()) {
60 | // android o 并且不是华为
61 | activity.getWindow().setWindowAnimations(R.style._mtransition_activityOpenNoAnimation_androido);
62 | } else {
63 | activity.getWindow().setWindowAnimations(R.style._mtransition_activityOpenNoAnimation);
64 | }
65 | }
66 | }
67 |
68 | /**
69 | * 恢复Activity默认的启动关闭动画
70 | *
71 | * Restore Activity default animation
72 | *
73 | * @see #removeActivityCloseAnimation(Activity)
74 | * @see #removeActivityOpenAnimation(Activity)
75 | *
76 | * @param activity
77 | */
78 | public static void resumeActivityAnimation(Activity activity) {
79 | if (activity != null) {
80 | restoreAnimtaion(activity);
81 | }
82 | }
83 |
84 | private static void saveAnimtaion(Activity activity) {
85 | Class clazz = activity.getClass();
86 | if (!sAnimationMap.containsKey(clazz)) {
87 | int animtaion = activity.getWindow().getAttributes().windowAnimations;
88 | sAnimationMap.put(clazz, animtaion);
89 | }
90 | }
91 |
92 | private static void restoreAnimtaion(Activity activity) {
93 | Class clazz = activity.getClass();
94 | if (sAnimationMap.containsKey(clazz)) {
95 | int animtaion = sAnimationMap.get(clazz);
96 | activity.getWindow().setWindowAnimations(animtaion);
97 | sAnimationMap.remove(clazz);
98 | }
99 | }
100 |
101 | private static boolean isHuawei() {
102 | String brand = Build.BRAND;
103 | if (!TextUtils.isEmpty(brand)) {
104 | if (brand.toLowerCase().contains("huawei") || brand.toLowerCase().contains("honor")) {
105 | return true;
106 | }
107 | }
108 | return false;
109 | }
110 |
111 | /**
112 | * 在启动Activity或者关闭Activity,如果需要做MTransition动画时,需要在{@link Activity#startActivity(Intent)} 或者
113 | * {@link Activity#finish()}调用之后,调用该方法,来关闭默认的Activity动画
114 | *
115 | * @param activity
116 | */
117 | public static void removeActivityAnimation(Activity activity) {
118 | if (activity != null) {
119 | activity.overridePendingTransition(R.anim.no_anim, R.anim.no_anim);
120 | }
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example41/Example41EntryActivity2.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example41;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 | import android.widget.Button;
9 | import android.widget.TextView;
10 |
11 | import com.mjun.demo.R;
12 | import com.mjun.mtransition.ITransitPrepareListener;
13 | import com.mjun.mtransition.MTransition;
14 | import com.mjun.mtransition.MTransitionManager;
15 | import com.mjun.mtransition.MTransitionView;
16 | import com.mjun.mtransition.MTranstionUtil;
17 | import com.mjun.mtransition.TransitListenerAdapter;
18 |
19 | public class Example41EntryActivity2 extends Activity {
20 |
21 | private int mDownX = 0;
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | setContentView(R.layout.example41_1);
27 | init();
28 | startAnim();
29 | }
30 |
31 | private void init() {
32 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example41_tip21));
33 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example41_tip22));
34 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
35 | @Override
36 | public void onClick(View v) {
37 | MTransition transition = MTransitionManager.getInstance().createTransition("Activity2");
38 | transition.fromPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
39 | @Override
40 | public void onPrepare(MTransitionView container) {
41 |
42 | }
43 | });
44 | Intent intent = new Intent(Example41EntryActivity2.this, Example41EntryActivity3.class);
45 | startActivity(intent);
46 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity2.this);
47 | }
48 | });
49 | findViewById(R.id.content).setBackgroundColor(0xfffffea0);
50 | }
51 |
52 | private void startAnim() {
53 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity1");
54 | transition.toPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
55 | @Override
56 | public void onPrepare(MTransitionView container) {
57 | final MTransitionView content = transition.toPage().addTransitionView("content", findViewById(R.id.content));
58 | int width = container.getWidth();
59 | transition.fromPage().getContainer().translateX(0, -width / 4);
60 | content.translateX(container.getWidth(), 0);
61 | container.alpha(0f, 1f);
62 | }
63 | });
64 | transition.setDuration(500);
65 | transition.start();
66 |
67 | // 滑动返回
68 | findViewById(R.id.wrapper).setOnTouchListener(new View.OnTouchListener() {
69 | @Override
70 | public boolean onTouch(View v, MotionEvent event) {
71 | int action = event.getAction();
72 | if (action == MotionEvent.ACTION_DOWN) {
73 | transition.onBeginDrag();
74 | mDownX = (int) event.getX();
75 | } else if (action == MotionEvent.ACTION_MOVE) {
76 | int delta = (int) (event.getX() - mDownX);
77 | transition.setProgress(1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth());
78 | } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
79 | int delta = (int) (event.getX() - mDownX);
80 | float progress = 1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth();
81 | if (progress < 0.5f) {
82 | transition.gotoCeil();
83 | } else {
84 | transition.gotoFloor();
85 | }
86 | }
87 | return true;
88 | }
89 | });
90 | transition.setOnTransitListener(new TransitListenerAdapter() {
91 | @Override
92 | public void onTransitEnd(MTransition transition, boolean reverse) {
93 | if (reverse) {
94 | finish();
95 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity2.this);
96 | }
97 | }
98 | });
99 | }
100 |
101 | @Override
102 | protected void onDestroy() {
103 | super.onDestroy();
104 | MTransitionManager.getInstance().destoryTransition("Activity1");
105 | }
106 |
107 | @Override
108 | public void onBackPressed() {
109 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity1");
110 | transition.reverse();
111 | }
112 |
113 | }
114 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example41/Example41EntryActivity3.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example41;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 | import android.widget.Button;
9 | import android.widget.TextView;
10 |
11 | import com.mjun.demo.R;
12 | import com.mjun.mtransition.ITransitPrepareListener;
13 | import com.mjun.mtransition.MTransition;
14 | import com.mjun.mtransition.MTransitionManager;
15 | import com.mjun.mtransition.MTransitionView;
16 | import com.mjun.mtransition.MTranstionUtil;
17 | import com.mjun.mtransition.TransitListenerAdapter;
18 |
19 | public class Example41EntryActivity3 extends Activity {
20 |
21 | private int mDownX = 0;
22 |
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | setContentView(R.layout.example41_1);
27 | init();
28 | startAnim();
29 | }
30 |
31 | private void init() {
32 | ((TextView) findViewById(R.id.text)).setText(getString(R.string.example41_tip31));
33 | ((Button) findViewById(R.id.button)).setText(getString(R.string.example41_tip32));
34 | findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
35 | @Override
36 | public void onClick(View v) {
37 | MTransition transition = MTransitionManager.getInstance().createTransition("Activity3");
38 | transition.fromPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
39 | @Override
40 | public void onPrepare(MTransitionView container) {
41 |
42 | }
43 | });
44 | Intent intent = new Intent(Example41EntryActivity3.this, Example41EntryActivity4.class);
45 | startActivity(intent);
46 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity3.this);
47 | }
48 | });
49 | findViewById(R.id.content).setBackgroundColor(0xfffee388);
50 | }
51 |
52 | private void startAnim() {
53 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity2");
54 | transition.toPage().setContainer(findViewById(R.id.wrapper), new ITransitPrepareListener() {
55 | @Override
56 | public void onPrepare(MTransitionView container) {
57 | MTransitionView content = transition.toPage().addTransitionView("content", findViewById(R.id.content));
58 | int width = container.getWidth();
59 | transition.fromPage().getContainer().translateX(0, -width / 4);
60 | content.translateX(container.getWidth(), 0);
61 | container.alpha(0f, 1f);
62 | }
63 | });
64 |
65 | transition.setOnTransitListener(new TransitListenerAdapter() {
66 | @Override
67 | public void onTransitEnd(MTransition transition, boolean reverse) {
68 | if (reverse) {
69 | finish();
70 | MTranstionUtil.removeActivityAnimation(Example41EntryActivity3.this);
71 | }
72 | }
73 | });
74 |
75 | transition.setDuration(500);
76 | transition.start();
77 |
78 | // 滑动返回
79 | findViewById(R.id.wrapper).setOnTouchListener(new View.OnTouchListener() {
80 | @Override
81 | public boolean onTouch(View v, MotionEvent event) {
82 | int action = event.getAction();
83 | if (action == MotionEvent.ACTION_DOWN) {
84 | transition.onBeginDrag();
85 | mDownX = (int) event.getX();
86 | } else if (action == MotionEvent.ACTION_MOVE) {
87 | int delta = (int) (event.getX() - mDownX);
88 | transition.setProgress(1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth());
89 | } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
90 | int delta = (int) (event.getX() - mDownX);
91 | float progress = 1f - delta / (float) findViewById(R.id.wrapper).getMeasuredWidth();
92 | if (progress < 0.5f) {
93 | transition.gotoCeil();
94 | } else {
95 | transition.gotoFloor();
96 | }
97 | }
98 | return true;
99 | }
100 | });
101 | }
102 |
103 | @Override
104 | protected void onDestroy() {
105 | super.onDestroy();
106 | MTransitionManager.getInstance().destoryTransition("Activity2");
107 | }
108 |
109 | @Override
110 | public void onBackPressed() {
111 | final MTransition transition = MTransitionManager.getInstance().getTransition("Activity2");
112 | transition.reverse();
113 | }
114 |
115 | }
116 |
--------------------------------------------------------------------------------
/app/src/main/java/com/mjun/demo/example8/Fragment1.java:
--------------------------------------------------------------------------------
1 | package com.mjun.demo.example8;
2 |
3 | import java.util.*;
4 |
5 | import android.app.Activity;
6 | import android.content.Context;
7 | import android.os.Bundle;
8 | import android.support.v4.app.Fragment;
9 | import android.support.v4.app.FragmentManager;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.view.ViewGroup;
13 | import android.widget.AdapterView;
14 | import android.widget.BaseAdapter;
15 | import android.widget.ImageView;
16 | import android.widget.TextView;
17 |
18 | import com.mjun.demo.R;
19 | import com.mjun.mtransition.ITransitPrepareListener;
20 | import com.mjun.mtransition.MTransition;
21 | import com.mjun.mtransition.MTransitionManager;
22 | import com.mjun.mtransition.MTransitionView;
23 | import com.mjun.demo.example2.AppBean;
24 | import com.mjun.demo.example2.AppListPage;
25 | import com.mjun.demo.model.AppModel;
26 |
27 | /**
28 | * Created by huijun on 2018/4/12.
29 | */
30 |
31 | public class Fragment1 extends Fragment implements Example8Activity.IHandleBack {
32 |
33 | private Activity mActivity;
34 | private AppListPage mPage;
35 | // 数据
36 | private List mBeans = new ArrayList<>();
37 |
38 | @Override
39 | public void onAttach(Context context) {
40 | super.onAttach(context);
41 | mActivity = (Activity) context;
42 | }
43 |
44 | @Override
45 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
46 | mPage = new AppListPage(mActivity);
47 | init();
48 | return mPage;
49 | }
50 | public static Fragment1 newInstance() {
51 | Fragment1 fragment = new Fragment1();
52 | return fragment;
53 | }
54 |
55 | private void init() {
56 | genDatas();
57 | mPage.mListView.setAdapter(new DemoListAdapter());
58 | mPage.mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
59 | @Override
60 | public void onItemClick(AdapterView> parent, final View view, int position, long id) {
61 | final MTransition transition = MTransitionManager.getInstance().createTransition("example");
62 | transition.fromPage().setContainer(mPage, new ITransitPrepareListener() {
63 | @Override
64 | public void onPrepare(MTransitionView container) {
65 | transition.fromPage().addTransitionView("icon", view.findViewById(R.id.item_icon));
66 | transition.fromPage().addTransitionView("name", view.findViewById(R.id.item_name));
67 | transition.fromPage().addTransitionView("snapshot", view.findViewById(R.id.item_snapshot));
68 | transition.fromPage().addTransitionView("container", mPage);
69 | }
70 | });
71 | transition.getBundle().putObject("bean", mBeans.get(position));
72 | ((Example8Activity) mActivity).enterOtherFragment();
73 | }
74 | });
75 | }
76 |
77 | private void genDatas() {
78 | for (int i = 0 ; i < 20; i++) {
79 | AppBean bean = new AppBean();
80 | String iconId = "icon_" + (i + 1);
81 | int identify = getResources().getIdentifier(iconId, "mipmap", "com.mjun.mtransition");
82 | if (identify == 0) {
83 | identify = R.mipmap.icon_1;
84 | }
85 | bean.mIconId = identify;
86 | bean.mName = AppModel.getInstance().getTitleArray(mActivity)[i];
87 | bean.mSnapshot = AppModel.getInstance().getCategoryArray(mActivity)[i];
88 | mBeans.add(bean);
89 | }
90 | }
91 |
92 | @Override
93 | public boolean onBackPressed(FragmentManager manager) {
94 | return false;
95 | }
96 |
97 | private class DemoListAdapter extends BaseAdapter {
98 |
99 | @Override
100 | public int getCount() {
101 | return mBeans.size();
102 | }
103 |
104 | @Override
105 | public Object getItem(int position) {
106 | return mBeans.get(position);
107 | }
108 |
109 | @Override
110 | public long getItemId(int position) {
111 | return position;
112 | }
113 |
114 | @Override
115 | public View getView(int position, View convertView, ViewGroup parent) {
116 | if (convertView == null) {
117 | convertView = LayoutInflater.from(mPage.getContext()).inflate(R.layout.app_item_view, parent, false);
118 | }
119 | AppBean bean = mBeans.get(position);
120 | ((ImageView) convertView.findViewById(R.id.item_icon)).setImageResource(bean.mIconId);
121 | ((TextView) convertView.findViewById(R.id.item_name)).setText(bean.mName);
122 | ((TextView) convertView.findViewById(R.id.item_snapshot)).setText(bean.mSnapshot);
123 | return convertView;
124 | }
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
24 |
26 |
28 |
30 |
32 |
34 |
36 |
38 |
40 |
42 |
44 |
46 |
48 |
50 |
52 |
54 |
56 |
58 |
60 |
62 |
64 |
66 |
68 |
70 |
72 |
74 |
75 |
--------------------------------------------------------------------------------