├── .gitignore ├── .gradle └── 2.14.1 │ ├── taskArtifacts │ ├── cache.properties │ ├── cache.properties.lock │ ├── fileHashes.bin │ ├── fileSnapshots.bin │ ├── fileSnapshotsToTreeSnapshotsIndex.bin │ └── taskArtifacts.bin │ └── tasks │ └── _app_compileDebugJavaWithJavac │ ├── localClassSetAnalysis │ ├── localClassSetAnalysis.bin │ └── localClassSetAnalysis.lock │ └── localJarClasspathSnapshot │ ├── localJarClasspathSnapshot.bin │ └── localJarClasspathSnapshot.lock ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── gradle.properties ├── maven-push.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── nipunbirla │ └── swipe3drotateview │ ├── Flip3DAnimation.java │ ├── Swipe3DRotateView.java │ └── _3DRotationType.java ├── sampleproject ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── nipunbirla │ │ └── sampleproject │ │ └── MainActivity.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # [Android] ======================== 2 | # Built application files 3 | *.apk 4 | *.ap_ 5 | 6 | # Files for the Dalvik VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # Generated files 13 | bin/ 14 | gen/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | 30 | ## Directory-based project format: 31 | .idea/ 32 | 33 | ## File-based project format: 34 | *.ipr 35 | *.iws 36 | 37 | ## Plugin-specific files: 38 | 39 | # IntelliJ 40 | out/ 41 | 42 | # mpeltonen/sbt-idea plugin 43 | .idea_modules/ 44 | 45 | # JIRA plugin 46 | atlassian-ide-plugin.xml 47 | 48 | # Crashlytics plugin (for Android Studio and IntelliJ) 49 | com_crashlytics_export_strings.xml 50 | 51 | 52 | # [Maven] ======================== 53 | target/ 54 | pom.xml.tag 55 | pom.xml.releaseBackup 56 | pom.xml.versionsBackup 57 | pom.xml.next 58 | release.properties 59 | 60 | 61 | # [Gradle-Android] ======================== 62 | 63 | # Ignore Gradle GUI config 64 | gradle-app.setting 65 | 66 | # Gradle Signing 67 | signing.properties 68 | trestle.keystore 69 | 70 | # Mobile Tools for Java (J2ME) 71 | .mtj.tmp/ 72 | 73 | # Package Files # 74 | *.jar 75 | *.war 76 | *.ear 77 | 78 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 79 | hs_err_pid* 80 | 81 | # Misc 82 | /.idea/workspace.xml 83 | .DS_Store 84 | /captures 85 | **/*.iml 86 | *.class -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/cache.properties: -------------------------------------------------------------------------------- 1 | #Sat Dec 24 01:42:29 IST 2016 2 | -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/cache.properties.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/taskArtifacts/cache.properties.lock -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/taskArtifacts/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/fileSnapshots.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/taskArtifacts/taskArtifacts.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock -------------------------------------------------------------------------------- /.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin -------------------------------------------------------------------------------- /.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/.gradle/2.14.1/tasks/_app_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Android > Lint > Correctness 39 | 40 | 41 | Android > Lint > Security 42 | 43 | 44 | 45 | 46 | AndroidLintExportedContentProvider 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 68 | 69 | 70 | 71 | 72 | 1.7 73 | 74 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Swipe3DRotateView [![Screenshot](https://img.shields.io/badge/Android%20Arsenal-Swipe3DRotateView-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/5572) 2 | === 3 | 4 | ![Screenshot](https://cloud.githubusercontent.com/assets/7312366/21467583/d5905664-ca18-11e6-898c-8b8b2ca6d03a.gif) 5 | 6 |

Purpose

7 | Swipe3DRotateView is a class designed to simplify the implementation of 3D Flip Rotation in android based on swipe gestures. 8 | 9 | Swipe3DRotateView is extended from a Framelayout and should exactly contain 2 views as its children. It detects swipe gestures on its child view, and based on the swipe direction, rotates the children in a 3D manner on their X or Y axis. 10 | 11 |

Usage

12 | 13 | Add dependency in your build.gradle(app) 14 | 15 | dependencies { 16 | compile 'com.github.nipun-birla:Swipe3DRotateView:0.0.1' 17 | } 18 | 19 | Put Swipe3DRotateView in your layout as required : 20 | 21 | 25 | 26 | //Put the backview as first child 27 | 32 | 33 | 34 | //Put the frontview as second child 35 | 40 | 41 | 42 | 43 | 44 | Find view in your activity as : 45 | 46 | Swipe3DRotateView swipe3DRotateView = findViewById(R.id.rotateView); 47 | 48 | To set if X Rotation is allowed : 49 | 50 | swipe3DRotateView.setIsXRotationAllowed(true); 51 | 52 | To set if Y Rotation is allowed : 53 | 54 | swipe3DRotateView.setIsYRotationAllowed(true); 55 | 56 | To check if X Rotation is allowed : 57 | 58 | boolean isXAllowed = swipe3DRotateView.isXRotationAllowed(); 59 | 60 | To check if Y Rotation is allowed : 61 | 62 | boolean isYAllowed = swipe3DRotateView.isYRotationAllowed(); 63 | 64 | To set Animation duration, default value is 1000 millis 65 | 66 | swipe3DRotateView.setAnimationDuration(1000); 67 | 68 | To set animation listener on view up front, use : 69 | 70 | swipe3DRotateView.setHalfAnimationCompleteListener(halfListener); 71 | 72 | To set animation listener on view at back, use : 73 | 74 | swipe3DRotateView.setCompleteAnimationCompleteListener(fullListener); 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /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 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | VERSION_NAME=0.0.1 21 | VERSION_CODE=1 22 | GROUP=com.github.nipun-birla 23 | 24 | POM_DESCRIPTION=A library that does X, Y, and Z 25 | POM_URL=https://github.com/nipun-birla/Swipe3DRotateView 26 | POM_SCM_URL=https://github.com/nipun-birla/Swipe3DRotateView 27 | POM_SCM_CONNECTION=scm:git@github.com:nipun-birla/Swipe3DRotateView.git 28 | POM_SCM_DEV_CONNECTION=scm:git@github.com:nipun-birla/Swipe3DRotateView.git 29 | POM_LICENCE_NAME=The Apache Software License, Version 2.0 30 | POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt 31 | POM_LICENCE_DIST=repo 32 | POM_DEVELOPER_ID=nipun-birla 33 | POM_DEVELOPER_NAME=Nipun Birla -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 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-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply from: 'maven-push.gradle' 3 | 4 | android { 5 | compileSdkVersion 24 6 | buildToolsVersion "24.0.2" 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 24 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 | } 24 | -------------------------------------------------------------------------------- /library/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Swipe3DRotateView 2 | POM_ARTIFACT_ID=Swipe3DRotateView 3 | POM_PACKAGING=aar -------------------------------------------------------------------------------- /library/maven-push.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Chris Banes 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | apply plugin: 'maven' 18 | apply plugin: 'signing' 19 | 20 | def isReleaseBuild() { 21 | return VERSION_NAME.contains("SNAPSHOT") == false 22 | } 23 | 24 | def getReleaseRepositoryUrl() { 25 | return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL 26 | : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" 27 | } 28 | 29 | def getSnapshotRepositoryUrl() { 30 | return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL 31 | : "https://oss.sonatype.org/content/repositories/snapshots/" 32 | } 33 | 34 | def getRepositoryUsername() { 35 | return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : "" 36 | } 37 | 38 | def getRepositoryPassword() { 39 | return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : "" 40 | } 41 | 42 | afterEvaluate { project -> 43 | uploadArchives { 44 | repositories { 45 | mavenDeployer { 46 | beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } 47 | 48 | pom.groupId = GROUP 49 | pom.artifactId = POM_ARTIFACT_ID 50 | pom.version = VERSION_NAME 51 | 52 | repository(url: getReleaseRepositoryUrl()) { 53 | authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) 54 | } 55 | snapshotRepository(url: getSnapshotRepositoryUrl()) { 56 | authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) 57 | } 58 | 59 | pom.project { 60 | name POM_NAME 61 | packaging POM_PACKAGING 62 | description POM_DESCRIPTION 63 | url POM_URL 64 | 65 | scm { 66 | url POM_SCM_URL 67 | connection POM_SCM_CONNECTION 68 | developerConnection POM_SCM_DEV_CONNECTION 69 | } 70 | 71 | licenses { 72 | license { 73 | name POM_LICENCE_NAME 74 | url POM_LICENCE_URL 75 | distribution POM_LICENCE_DIST 76 | } 77 | } 78 | 79 | developers { 80 | developer { 81 | id POM_DEVELOPER_ID 82 | name POM_DEVELOPER_NAME 83 | } 84 | } 85 | } 86 | } 87 | } 88 | } 89 | 90 | signing { 91 | required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } 92 | sign configurations.archives 93 | } 94 | 95 | //task androidJavadocs(type: Javadoc) { 96 | //source = android.sourceSets.main.allJava 97 | //} 98 | 99 | //task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { 100 | //classifier = 'javadoc' 101 | //from androidJavadocs.destinationDir 102 | //} 103 | 104 | task androidSourcesJar(type: Jar) { 105 | classifier = 'sources' 106 | from android.sourceSets.main.java.sourceFiles 107 | } 108 | 109 | artifacts { 110 | archives androidSourcesJar 111 | } 112 | } -------------------------------------------------------------------------------- /library/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Nipun\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /library/src/main/java/com/nipunbirla/swipe3drotateview/Flip3DAnimation.java: -------------------------------------------------------------------------------- 1 | package com.nipunbirla.swipe3drotateview; 2 | 3 | import android.graphics.Camera; 4 | import android.graphics.Matrix; 5 | import android.view.animation.Animation; 6 | import android.view.animation.Transformation; 7 | 8 | /** 9 | * Created by Nipun on 12/24/2016. 10 | */ 11 | 12 | public class Flip3DAnimation extends Animation { 13 | private final float mFromDegrees; 14 | private final float mToDegrees; 15 | private final float mCenterX; 16 | private final float mCenterY; 17 | private Camera mCamera; 18 | private _3DRotationType mRotationType; 19 | 20 | public Flip3DAnimation(float fromDegrees, float toDegrees, 21 | float centerX, float centerY, _3DRotationType rotationType) { 22 | mFromDegrees = fromDegrees; 23 | mToDegrees = toDegrees; 24 | mCenterX = centerX; 25 | mCenterY = centerY; 26 | mRotationType = rotationType; 27 | } 28 | 29 | @Override 30 | public void initialize(int width, int height, int parentWidth, int parentHeight) { 31 | super.initialize(width, height, parentWidth, parentHeight); 32 | mCamera = new Camera(); 33 | } 34 | 35 | @Override 36 | protected void applyTransformation(float interpolatedTime, Transformation t) { 37 | final float fromDegrees = mFromDegrees; 38 | float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); 39 | 40 | final float centerX = mCenterX; 41 | final float centerY = mCenterY; 42 | final Camera camera = mCamera; 43 | 44 | final Matrix matrix = t.getMatrix(); 45 | 46 | camera.save(); 47 | 48 | switch (mRotationType){ 49 | case RotateX: 50 | camera.rotateX(degrees); 51 | break; 52 | case RotateY: 53 | camera.rotateY(degrees); 54 | break; 55 | } 56 | 57 | camera.getMatrix(matrix); 58 | camera.restore(); 59 | 60 | matrix.preTranslate(-centerX, -centerY); 61 | matrix.postTranslate(centerX, centerY); 62 | 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /library/src/main/java/com/nipunbirla/swipe3drotateview/Swipe3DRotateView.java: -------------------------------------------------------------------------------- 1 | package com.nipunbirla.swipe3drotateview; 2 | 3 | import android.content.Context; 4 | import android.graphics.Rect; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | import android.view.View; 8 | import android.view.animation.AccelerateInterpolator; 9 | import android.view.animation.Animation; 10 | import android.view.animation.DecelerateInterpolator; 11 | import android.widget.FrameLayout; 12 | import android.widget.RelativeLayout; 13 | 14 | /** 15 | * Created by Nipun on 12/24/2016. 16 | */ 17 | 18 | public class Swipe3DRotateView extends FrameLayout { 19 | 20 | public static long ANIMATION_DURATION = 500; 21 | 22 | private Context mContext; 23 | private float lastX, lastY; 24 | private static final float MINX = 60; 25 | private static boolean isAnimating; 26 | private boolean mIsFirstView = true; 27 | private boolean allowXRotation = true, allowYRotation = true; 28 | private _3DRotationType mRotationType; 29 | View frontView,backView; 30 | Animation.AnimationListener halmAnimation ,completeAnimation; 31 | 32 | public Swipe3DRotateView(Context context, AttributeSet attrs) { 33 | super(context, attrs); 34 | init(context); 35 | } 36 | 37 | public Swipe3DRotateView(Context context) { 38 | super(context); 39 | init(context); 40 | } 41 | 42 | private void init(Context context) { 43 | if (isInEditMode()) { 44 | return; 45 | } 46 | mContext = context; 47 | } 48 | 49 | private boolean isViewInBounds(View view, int x, int y){ 50 | 51 | Rect outRect = new Rect(); 52 | view.getHitRect(outRect); 53 | return outRect.contains(x, y); 54 | } 55 | 56 | public void setIsXRotationAllowed(boolean isAllowed){ 57 | allowXRotation = isAllowed; 58 | } 59 | 60 | public boolean isXRotationAllowed(){ 61 | return allowXRotation; 62 | } 63 | 64 | public void setIsYRotationAllowed(boolean isAllowed){ 65 | allowYRotation = isAllowed; 66 | } 67 | 68 | public boolean isYRotationAllowed(){ 69 | return allowYRotation; 70 | } 71 | 72 | public void setAnimationDuration(long durationMillis){ 73 | ANIMATION_DURATION = durationMillis/2; 74 | } 75 | 76 | public void setHalfAnimationCompleteListener(Animation.AnimationListener listener){ 77 | halmAnimation = listener; 78 | } 79 | 80 | public void setCompleteAnimationCompleteListener(Animation.AnimationListener listener){ 81 | completeAnimation = listener; 82 | } 83 | 84 | @Override 85 | public boolean onTouchEvent(MotionEvent touchevent) { 86 | 87 | if(getChildCount() != 2){ 88 | throw new RuntimeException("Swipe3DRotateView can only have 2 children"); 89 | } 90 | 91 | if(frontView == null) { 92 | frontView = getChildAt(1); 93 | } 94 | if(backView == null) { 95 | backView = getChildAt(0); 96 | backView.setVisibility(GONE); 97 | } 98 | 99 | int rawx, rawy; 100 | rawx = (int)touchevent.getX(); 101 | rawy = (int)touchevent.getY(); 102 | switch (touchevent.getAction()) { 103 | case MotionEvent.ACTION_DOWN: 104 | lastX = touchevent.getX(); 105 | lastY = touchevent.getY(); 106 | break; 107 | 108 | case MotionEvent.ACTION_UP: 109 | float currentX = touchevent.getX(); 110 | float currentY = touchevent.getY(); 111 | 112 | float diffX = currentX - lastX; 113 | float diffY = currentY - lastY; 114 | 115 | if((Math.abs(diffX) > Math.abs(diffY)) && Math.abs(diffX) > MINX && !isAnimating && allowYRotation) { 116 | 117 | mRotationType = _3DRotationType.RotateY; 118 | 119 | // Handling left to right screen swap. 120 | if (lastX < currentX) { 121 | applyRotation(0, 90); 122 | } 123 | 124 | // Handling right to left screen swap. 125 | if (lastX > currentX) { 126 | applyRotation(0, -90); 127 | } 128 | mIsFirstView = !mIsFirstView; 129 | } else if((Math.abs(diffY) > Math.abs(diffX)) && Math.abs(diffY) > MINX && !isAnimating && allowXRotation) { 130 | 131 | mRotationType = _3DRotationType.RotateX; 132 | 133 | if (lastY > currentY) { 134 | applyRotation(0, 90); 135 | } 136 | 137 | if (lastY < currentY) { 138 | applyRotation(0, -90); 139 | } 140 | mIsFirstView = !mIsFirstView; 141 | } 142 | break; 143 | } 144 | return isViewInBounds( mIsFirstView ? frontView : backView ,rawx, rawy); 145 | } 146 | 147 | private void applyRotation(float start, float end) { 148 | 149 | View v = mIsFirstView ? frontView : backView; 150 | 151 | // Find the center of view 152 | final float centerX = v.getWidth() / 2.0f; 153 | final float centerY = v.getHeight() / 2.0f; 154 | 155 | // Create a new 3D rotation with the supplied parameter 156 | // The animation listener is used to trigger the next animation 157 | final Flip3DAnimation rotation = 158 | new Flip3DAnimation(start, end, centerX, centerY, mRotationType); 159 | rotation.setDuration(ANIMATION_DURATION); 160 | rotation.setFillAfter(true); 161 | rotation.setInterpolator(new AccelerateInterpolator()); 162 | rotation.setAnimationListener(new DisplayNextView(mIsFirstView, frontView, backView, end)); 163 | 164 | v.startAnimation(rotation); 165 | } 166 | 167 | private final class DisplayNextView implements Animation.AnimationListener{ 168 | 169 | private boolean mCurrentView; 170 | View v1,v2; 171 | float end; 172 | 173 | public DisplayNextView(boolean currentView, View v1, View v2, float end) { 174 | mCurrentView = currentView; 175 | this.v1 = v1; 176 | this.v2 = v2; 177 | this.end = end; 178 | } 179 | 180 | public void onAnimationStart(Animation animation) { 181 | isAnimating = true; 182 | 183 | if(halmAnimation != null){ 184 | halmAnimation.onAnimationStart(animation); 185 | } 186 | } 187 | 188 | public void onAnimationEnd(Animation animation) { 189 | v1.post(new SwapViews(mCurrentView, v1, v2, end)); 190 | if(halmAnimation != null){ 191 | halmAnimation.onAnimationEnd(animation); 192 | } 193 | } 194 | 195 | public void onAnimationRepeat(Animation animation) { 196 | if(halmAnimation != null){ 197 | halmAnimation.onAnimationRepeat(animation); 198 | } 199 | } 200 | } 201 | 202 | private final class SwapViews implements Runnable { 203 | private boolean mIsFirstView; 204 | View v1, v2; 205 | float start,end; 206 | 207 | public SwapViews(boolean isFirstView, View v1, View v2, float end) { 208 | mIsFirstView = isFirstView; 209 | this.v1 = v1; 210 | this.v2 = v2; 211 | this.start = end * -1; 212 | this.end = 0; 213 | } 214 | 215 | public void run() { 216 | final float centerX = v1.getWidth() / 2.0f; 217 | final float centerY = v1.getHeight() / 2.0f; 218 | Flip3DAnimation rotation; 219 | 220 | if (mIsFirstView) { 221 | v1.setVisibility(View.GONE); 222 | v2.setVisibility(View.VISIBLE); 223 | v2.bringToFront(); 224 | 225 | rotation = new Flip3DAnimation(start, end, centerX, centerY, mRotationType); 226 | } else { 227 | v2.setVisibility(View.GONE); 228 | v1.setVisibility(View.VISIBLE); 229 | v1.bringToFront(); 230 | 231 | rotation = new Flip3DAnimation(start, end, centerX, centerY, mRotationType); 232 | } 233 | 234 | rotation.setDuration(ANIMATION_DURATION); 235 | rotation.setFillAfter(true); 236 | rotation.setInterpolator(new DecelerateInterpolator()); 237 | rotation.setAnimationListener(new Animation.AnimationListener() { 238 | @Override 239 | public void onAnimationStart(Animation animation) { 240 | if(completeAnimation != null){ 241 | completeAnimation.onAnimationStart(animation); 242 | } 243 | } 244 | 245 | @Override 246 | public void onAnimationEnd(Animation animation) { 247 | isAnimating = false; 248 | if(completeAnimation != null){ 249 | completeAnimation.onAnimationEnd(animation); 250 | } 251 | } 252 | 253 | @Override 254 | public void onAnimationRepeat(Animation animation) { 255 | if(completeAnimation != null){ 256 | completeAnimation.onAnimationRepeat(animation); 257 | } 258 | } 259 | }); 260 | 261 | if (mIsFirstView) { 262 | v2.startAnimation(rotation); 263 | } else { 264 | v1.startAnimation(rotation); 265 | } 266 | } 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /library/src/main/java/com/nipunbirla/swipe3drotateview/_3DRotationType.java: -------------------------------------------------------------------------------- 1 | package com.nipunbirla.swipe3drotateview; 2 | 3 | /** 4 | * Created by Nipun on 12/24/2016. 5 | */ 6 | 7 | public enum _3DRotationType { 8 | RotateX, RotateY 9 | } 10 | -------------------------------------------------------------------------------- /sampleproject/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /sampleproject/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.nipunbirla.sampleproject" 9 | minSdkVersion 14 10 | targetSdkVersion 24 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(dir: 'libs', include: ['*.jar']) 27 | compile 'com.android.support:appcompat-v7:24.2.0' 28 | compile project(':library') 29 | } 30 | -------------------------------------------------------------------------------- /sampleproject/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\Nipun\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /sampleproject/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sampleproject/src/main/java/com/nipunbirla/sampleproject/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.nipunbirla.sampleproject; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | 6 | public class MainActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_main); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 21 | 22 | 23 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/sampleproject/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sampleproject/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/sampleproject/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /sampleproject/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/sampleproject/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sampleproject/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/sampleproject/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sampleproject/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nipun-birla/Swipe3DRotateView/ed7c2d6ca8dc40aaecb4422202714e69119627c1/sampleproject/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sampleproject/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Sample Project 3 | 4 | -------------------------------------------------------------------------------- /sampleproject/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':library', ':sampleproject' 2 | --------------------------------------------------------------------------------