An Android library allowing images to exhibit a parallax effect that reacts to the device's tilt

Related tags

Utility motion
Overview

Motion Download

An Android library allowing images to exhibit a parallax effect. By replacing static pictures and backgrounds with a fluid images that reacts to screen tilt and orientation, Android applications can add a perceived depth, layering, and context to their content. Motion works great for both full screen background images and smaller sized pictures to give users a whole new perspective on how they interact with their phone. This project was inspired in part by iOS 7's new parallax effect.

Parallax on Android

Demo

Feel free to download the demo to try out motion.

Setup

  • In Eclipse, just import the library as an Android library project.
  • Project > Clean to generate the binaries you need, like R.java, etc.
  • Then, just add Motion as a dependency to your existing project and you're good to go!

Or:

  • Download the .jar file
  • Add the .jar files to your project's libs folder, or add them as external jars to your project's build path.

Or:

Add the following to your build.gradle:

repositories {
	jcenter()
}

dependencies{
	compile 'com.nvanbenschoten.motion:library:1.1.2'
}

Or:

Add the following to your pom.xml:

<dependency>
	<groupId>com.nvanbenschoten.motion</groupId>
	<artifactId>library</artifactId>
	<version>1.1.2</version>
	<type>aar</type>
</dependency>

Usage

To use Motion, simply replace any existing ImageView's with a ParallaxImageView.

Once a reference to this view is acquired, register a SensorManager with the ParallaxImageView using the registerSensorManager() call. This registration is most commonly done in the onResume method of an Activity/Fragment, but can be completed whenever the parallax effect is desired to begin.

When the parallax effect is not longer needed, it is essential to unregister the SensorManager by calling unregisterSensorManager() on the ParallaxImageView so that the system sensors can be disabled. This call is usually completed in the onPause method.

As an example

// Obtain a reference to the object
ParallaxImageView mBackground = findViewById(R.id.background);

// Register a SensorManager to begin effect
mBackground.registerSensorManager();

...

// Unregister SensorManager when exiting
mBackground.unregisterSensorManager();

Configurations

There are three attributes that can be changed to adjust the parallax effect of the ImageView. Each can be accessed either through XML attributes or through Java functions.

  • intensity (attr:motionIntensity) (float) - adjusts the strength of the parallax effect, giving control over the perceived depth of the view.

  • tiltSensitivity (attr:motionTiltSensitivity) (float) - adjusts the sensitivity of the view towards tilting, changing how quickly the parallax's bounds are reached.

  • scaledIntensity (attr:motionScaledIntensity) (boolean) - adjusts whether the ImageView's x and y axis' parallax intensities are scaled to the image's aspect ratio or equal to each other and to the smaller of the axis' intensities (false by default).

License

Copyright 2014 Nathan VanBenschoten

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Image

    Image "jumps" when leaving activity

    First, great library!

    Second, i'm wondering if anyone have an idea/fix for this situation : I'm registering/unregistering the sensor in onResume/onPause. But when i'm leaving the activity for another one, the sensor unregister and the image "jumps" to it's original position.

    So, anyone have an idea on how to fix the image to the actual position (sort of snapshot) when unregistering sensor.

    opened by Mathbl 4
  • Parallax effect does not work when device is vertical or near vertical.

    Parallax effect does not work when device is vertical or near vertical.

    The "roll" (rotation on y axis) doesn't work when the "pitch" (rotation on the x axis) is close to PI/2 (90 degrees). At this point "yaw" (rotation on the z axis) actually effects the left/right parallax.

    I've seen this happen before when working with the sensors. As pitch increases, the distinction between roll and yaw is unclear (makes sense, of you "roll" the device when it's vertical you are actually changing the "yaw" with respect to world coordinates)

    I haven't found a good solution to this anywhere, and unfortunately although the library performs well when the device is flat, devices are rarely flat and most often will have a pitch of somewhere between 0 and PI/2. Typically somewhere around PI/4 which "half works" with the method you've used.

    opened by jasonpolites 3
  • Demo is huge

    Demo is huge

    I have added your library to DevAppsDirect. It will be available in the following couple of days.

    The library is huge. Users should download 10MB of data to see the output which will be slow. Can you trim it down?

    opened by tasomaniac 3
  • SENSOR_DELAY_FASTEST => SENSOR_DELAY_UI

    SENSOR_DELAY_FASTEST => SENSOR_DELAY_UI

    Thanks for the library. I recently use it in one of my app, I notice that you use SensorManager.SENSOR_DELAY_FASTEST as the sensor rate, it would definitely make the sensor works more sensitive, but it would be not quite battery friendly. I would suggest to change it to SENSOR_DELAY_UI, and as it name suggested, use it for UI purpose.

    opened by soarcn 2
  • IllegalArgumentException on Samsung devices

    IllegalArgumentException on Samsung devices

    After upgrading to version 1.1.0 we're getting below error.

    From what we can see it's only an issue on Samsung devices running Android 4.3 and especially on Samsung S4 and Samsung Note 3.

    We can't reproduce it ourselves because of missing test devices, but the above is what Crashlytics tells us in the logs.

    I've found this thread about SensorManager.getRotationMatrixFromVector throwing this IllegalArgumentException: https://groups.google.com/forum/#!topic/android-developers/U3N9eL5BcJk

    This "quick-fix"/workaround is adding a try-catch to the part of the code, where SensorManager.getRotationMatrixFromVector is called and then change the length of array to 3, if this exception is thrown.

    java.lang.IllegalArgumentException: R array length must be 3 or 4 at android.hardware.SensorManager.getRotationMatrixFromVector(SensorManager.java:1336) at com.nvanbenschoten.motion.SensorInterpreter.setTargetVector(SensorInterpreter.java:134) at com.nvanbenschoten.motion.SensorInterpreter.interpretSensorEvent(SensorInterpreter.java:74) at com.nvanbenschoten.motion.ParallaxImageView.onSensorChanged(ParallaxImageView.java:119) at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:463) at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:132) at android.os.Looper.loop(Looper.java:124) at android.app.ActivityThread.main(ActivityThread.java:5414) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) at dalvik.system.NativeStart.main(NativeStart.java)

    opened by darwind 1
  • Attribute

    Attribute "intensity" has already been defined

    It appears both shimmer-android and your library and define the attribute "intensity". Could you prefix your libraries attributes as per https://code.google.com/p/android/issues/detail?id=22576?

    This prevents the following compile time error. Error:(2) Attribute "intensity" has already been defined

    opened by PatrickDattilio 1
  • Truncate RotationVector in SensorInterpreter to avoid Samsung getRotationMatrixFromVector bug

    Truncate RotationVector in SensorInterpreter to avoid Samsung getRotationMatrixFromVector bug

    Fix for #16

    SensorEvents' RotationVectors are now truncated to a maximum of 4 elements to avoid an IllegalArgumentException being thrown when the rotation vector (Not R, event though the exception says so!) is more than 4 elements on certain Samsung models. This fix was inspired by Chrome's DeviceMotionAndOrientation.

    opened by nvanbenschoten 0
  • Switch to Rotation_Vector sensor & reimplement sensor data interpretation with quaternion-based calculations

    Switch to Rotation_Vector sensor & reimplement sensor data interpretation with quaternion-based calculations

    In order to resolve #4, a number of changes have been made to improve the accuracy and stability of both the collection and interpretation of sensor data.

    Sensor overhaul:

    First, the library has switched from using the deprecated _Orientation_ sensor to using the newer _Rotation_Vector_ fusion sensor. This has forced the library to increase its minSDK from 8 to 9, but should greatly increase the accuracy the reliability of the sensor data.

    Second, the library has overhauled data interpretation calculations. Instead of using absolute orientation to determine relative tilt, it now grabs an _initial target rotation matrix_ to base all rotation changes off of. The angle change between current sensor readings, again as a rotation matrix, and this initial reading are now used to determine offsets for all tilt values. By using rotation matrices for all calculations, the issue of gimbal lock should be eliminated and the parallax effect should act correctly at all orientations.

    Potential breaking changes:

    • Minimum SDK version bumped from _8 to 9_ (unfortunately needed to use the Rotation_Vector sensor)
    • forwardTiltOffset attribute removed because calculations are all relative-based
    • tiltSensitivity may need to be increased slightly (roughly 2x) to have the same amount of effect it used to have
    opened by nvanbenschoten 0
  • Weird motion when moving the device in a specific angle

    Weird motion when moving the device in a specific angle

    I faced an issue related to a not smooth motion in some cases. Please check this recorded video: https://drive.google.com/file/d/1-W1dPBU3vNOv-_UprjWUBq1kuDkXoZ4M/view?usp=sharing

    To reproduce the weird motion:

    • open the demo
    • rotate device 90 degrees around its base (bottom)
    • try to move the device.
    opened by islamassi 0
  •  Error inflating class ParallaxImageView

    Error inflating class ParallaxImageView

    I add the repository as follows repositories{ jcenter() flatDir{ dirs 'libs' } } and then changed my ImageView as follows: <ParallaxImageView android:id="@+id/background_image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/bird" android:scaleType="centerCrop" /> but I got this exception Process: com.foxtrapp.mysmallcommunity, PID: 25153 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.foxtrapp.mysmallcommunity/com.foxtrapp.mysmallcommunity.ui.activities.RegisterByEmailActivity}: android.view.InflateException: Binary XML file line #6: Error inflating class ParallaxImageView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) at android.app.ActivityThread.access$800(ActivityThread.java:155) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class ParallaxImageView at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) at com.foxtrapp.mysmallcommunity.ui.activities.RegisterByEmailActivity.onCreate(RegisterByEmailActivity.java:73) at android.app.Activity.performCreate(Activity.java:6010) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)  at android.app.ActivityThread.access$800(ActivityThread.java:155)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5343)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)  Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.ParallaxImageView" on path: DexPathList[[zip file "/data/app/com.foxtrapp.mysmallcommunity-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.view.LayoutInflater.createView(LayoutInflater.java:571) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:665) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:65) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)  at android.view.LayoutInflater.inflate(LayoutInflater.java:365)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)  at com.foxtrapp.mysmallcommunity.ui.activities.RegisterByEmailActivity.onCreate(RegisterByEmailActivity.java:73)  at android.app.Activity.performCreate(Activity.java:6010)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)  at android.app.ActivityThread.access$800(ActivityThread.java:155)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5343)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

    opened by Alnour 0
  • Android M Parallax problems on Nexus 5 (at least)

    Android M Parallax problems on Nexus 5 (at least)

    have no parallax effect on Nexus 5 + Android M (6.0) because there is a bug when someone is trying to register to sensor manager with SENSOR_DELAY_FASTEST rate.

    so my workaround at this moment is:

    public void registerSensorManager() {
            if (getContext() == null || mSensorManager != null) return;
            mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
    
            if (mSensorManager != null) {
                int sensorUpdateRate = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                        ? SensorManager.SENSOR_DELAY_GAME
                        : SensorManager.SENSOR_DELAY_FASTEST;
                mSensorManager.registerListener(this,
                        mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR),
                        sensorUpdateRate);
            }
        }
    

    P.S. guess this bug appeared in Android M because of battery optimizations so maybe they are deprecated this rate or so. can't find details. bug is described here: https://code.google.com/p/android/issues/detail?id=189681&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

    opened by ZuZuK 3
Releases(v1.1.2)
Owner
Nathan VanBenschoten
Nathan VanBenschoten
Get a unique ID for Android devices without any permissions.

Java and Kotlin Android library. Uniquely identify an Android device without any permissions and API restrictions. The recommended approach using DRM API.

Eyosiyas Bereketab 9 Aug 25, 2022
Swiss army knife for identifying and fingerprinting Android devices.

fingerprint android Lightweight library for device identification and fingerprinting. Fully written in Kotlin. 100% Crash-free. Creates a device ident

FingerprintJS 357 Jan 7, 2023
Android library which makes it easy to handle the different obstacles while calling an API (Web Service) in Android App.

API Calling Flow API Calling Flow is a Android library which can help you to simplify handling different conditions while calling an API (Web Service)

Rohit Surwase 19 Nov 9, 2021
Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Shahid Iqbal 4 Nov 29, 2022
A robust native library loader for Android.

ReLinker A robust native library loader for Android. More information can be found in our blog post Min SDK: 9 JavaDoc Overview The Android PackageMan

Keepsafe 2.9k Dec 27, 2022
Joda-Time library with Android specialization

joda-time-android This library is a version of Joda-Time built with Android in mind. Why Joda-Time? Android has built-in date and time handling - why

Daniel Lew 2.6k Dec 9, 2022
UPnP/DLNA library for Java and Android

Cling EOL: This project is no longer actively maintained, code may be outdated. If you are interested in maintaining and developing this project, comm

4th Line 1.6k Jan 4, 2023
:iphone: [Android Library] Get device information in a super easy way.

EasyDeviceInfo Android library to get device information in a super easy way. The library is built for simplicity and approachability. It not only eli

Nishant Srivastava 1.7k Dec 22, 2022
Android library for viewing, editing and sharing in app databases.

DbInspector DbInspector provides a simple way to view the contents of the in-app database for debugging purposes. There is no need to pull the databas

Infinum 924 Jan 4, 2023
Android Market In-app Billing Library

Update In-app Billing v2 API is deprecated and will be shut down in January 2015. This library was developed for v2 a long time ago. If your app is st

Robot Media 533 Nov 25, 2022
Android library to easily serialize and cache your objects to disk using key/value pairs.

Deprecated This project is no longer maintained. No new issues or pull requests will be accepted. You can still use the source or fork the project to

Anup Cowkur 667 Dec 22, 2022
Form Validator Library for Android

Android-Validator Form Validator Library for Android [](https://flattr.com/submit/auto?user_id=throrin19&url=https://github.com/throrin19/Android-Vali

Benjamin Besse 449 Dec 17, 2022
Very easy to use wrapper library for Android SharePreferences

Treasure English document Treasure是一个Android平台上基于SharePreferences的偏好存储库,只需要定义接口,无需编写实现,默认支持Serializable和Parcelable。运行时0反射,不仅使用方便而且性能和原生写法几乎无差别。 使用方法 1

星一 507 Nov 12, 2022
Error handling library for Android and Java

ErrorHandler Error handling library for Android and Java Encapsulate error handling logic into objects that adhere to configurable defaults. Then pass

null 237 Dec 29, 2022
Small Android library to help you incorporate MVP, Passive View and Presentation Model patterns in your app

DroidMVP About DroidMVP is a small Android library to help you incorporate the MVP pattern along with Passive View and Presentation Model (yes, those

Andrzej Chmielewski 225 Nov 29, 2022
A simple Android utils library to write any type of data into cache files and read them later.

CacheUtilsLibrary This is a simple Android utils library to write any type of data into cache files and then read them later, using Gson to serialize

Wesley Lin 134 Nov 25, 2022
Android library that regroup bunch of dateTime utilities

DateTimeUtils This library is a package of functions that let you manipulate objects and or java date string. it combine the most common functions use

Thunder413 98 Nov 16, 2022
Slinger - deep linking library for Android

Slinger - deep linking library for Android Slinger is a small Android library for handling custom Uri which uses regular expression to catch and route

Allegro Tech 27 Dec 8, 2022
A simple and easy to use stopwatch and timer library for android

TimeIt Now with Timer support! A simple and easy to use stopwatch and timer library for android Introduction A stopwatch can be a very important widge

Yashovardhan Dhanania 35 Dec 10, 2022