diff --git a/README.md b/README.md index d59e150..5b0edcc 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ TextView | PEWTextView Gradle dependencies: ```groovy -compile 'com.fmsirvent:parallaxeverywhere:1.0.4' +compile 'com.github.alexanderbezverhni:parallaxeverywhere:1.0.0' ``` Code in layout: diff --git a/gradle.properties b/gradle.properties index 8272bcd..9adfd37 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,31 +17,23 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -POM_NAME=ParallaxEverywhere +POM_NAME=GentleParallaxEverywhere POM_ARTIFACT_ID=parallaxeverywhere POM_PACKAGING=aar -VERSION_NAME=1.0.4 -VERSION_CODE=5 -GROUP=com.fmsirvent - -POM_DESCRIPTION=Widget with parallax effect on scroll. -POM_URL=https://github.com/narfss/ParallaxEverywhere -POM_SCM_URL=https://github.com/narfss/ParallaxEverywhere -POM_SCM_CONNECTION=scm:git@github.com:narfss/parallaxeverywhere.git -POM_SCM_DEV_CONNECTION=scm:git@github.com:narfss/parallaxeverywhere.git +VERSION_NAME=1.0.0 +VERSION_CODE=1 +GROUP=com.github.alexanderbezverhni + +POM_DESCRIPTION=Widget with gentle parallax effect on scroll. +POM_URL=https://github.com/alexanderbezverhni/ParallaxEverywhere +POM_SCM_URL=https://github.com/alexanderbezverhni/ParallaxEverywhere +POM_SCM_CONNECTION=scm:git@github.com:alexanderbezverhni/parallaxeverywhere.git +POM_SCM_DEV_CONNECTION=scm:git@github.com:alexanderbezverhni/parallaxeverywhere.git POM_LICENCE_NAME=MIT license. See the LICENSE file for more info POM_LICENCE_URL=http://opensource.org/licenses/MIT POM_LICENCE_DIST=repo -POM_DEVELOPER_ID=narfss -POM_DEVELOPER_NAME=Francisco M Sirvent - -signing.keyId=XXXXXX -signing.password=XXXXXX -signing.secretKeyRingFile=/home/narf/.gnupg/secring.gpg - -NEXUS_USERNAME=XXXXXX -NEXUS_PASSWORD=XXXXXX - +POM_DEVELOPER_ID=alexanderbezverhni +POM_DEVELOPER_NAME=Alexander Bezverhni SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2 \ No newline at end of file diff --git a/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWImageView.java b/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWImageView.java index 86f186e..af39420 100644 --- a/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWImageView.java +++ b/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWImageView.java @@ -19,9 +19,13 @@ /** * Created by fmsirvent on 03/11/14. + * + * Changed by @alexanderbezverhni on 10/06/15 - added support for parallax distance limit. */ public class PEWImageView extends ImageView { + public static final float FACTOR_DEFAULT = -1.0f; + public boolean reverseX = false; public boolean reverseY = false; public boolean updateOnDraw = false; @@ -34,6 +38,7 @@ public class PEWImageView extends ImageView { private float scrollSpaceY = 0; private float heightImageView; private float widthImageView; + private float factor = FACTOR_DEFAULT; private Interpolator interpolator = new LinearInterpolator(); @@ -151,6 +156,10 @@ private void checkAttributes(AttributeSet attrs) { blockParallaxX = arr.getBoolean(R.styleable.PEWAttrs_block_parallax_x, false); blockParallaxY = arr.getBoolean(R.styleable.PEWAttrs_block_parallax_y, false); + float factor = arr.getFloat(R.styleable.PEWAttrs_factor, FACTOR_DEFAULT); + if (factor != FACTOR_DEFAULT) + setFactor(factor); + reverseX = false; reverseY = false; switch (reverse) { @@ -215,23 +224,36 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { break; } - scrollSpaceY = (dnewHeight > vheight) ? (dnewHeight - vheight) : 0; - scrollSpaceX = (dnewWidth > vwidth) ? (dnewWidth - vwidth) : 0; + scrollSpaceY = getScrollSpace(vheight, dnewHeight, factor); + scrollSpaceX = getScrollSpace(vwidth, dnewWidth, factor); } applyParallax(); } + private float getScrollSpace(int viewEdgeSize, float imageEdgeSize, float factor){ + if (viewEdgeSize > imageEdgeSize){ + return 0; + } + + float maxScrollSpace = imageEdgeSize - viewEdgeSize; + if (factor == FACTOR_DEFAULT) { + return maxScrollSpace; + } + + float factored = viewEdgeSize * (factor - 1.0f); + return Math.min(factored, maxScrollSpace); + } + private void parallaxAnimation() { initSizeScreen(); applyParallax(); - } private void initSizeScreen() { WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { Point size = new Point(); display.getSize(size); screenHeight = size.y; @@ -275,7 +297,7 @@ private void applyParallax() { } private void setMyScrollX(int value) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { setScrollX(value); } else { scrollTo(value, getScrollY()); @@ -283,7 +305,7 @@ private void setMyScrollX(int value) { } private void setMyScrollY(int value) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { setScrollY(value); } else { scrollTo(getScrollX(),value); @@ -325,4 +347,35 @@ public boolean isBlockParallaxY() { public void setBlockParallaxY(boolean blockParallaxY) { this.blockParallaxY = blockParallaxY; } + + @Override + public void scrollTo(int x, int y) { + super.scrollTo(isBlockParallaxX() ? 0 : x, isBlockParallaxY() ? 0 : y); + } + + /** + * Limit parallax distance to some relative value, to make parallax animation more gentle.
+ * Example: for an ImageView with 400x300 dimensions, we set an image with 400x1000 dimensions. + * Enabling Y axis animation, we will experience very "aggressive" animation, while image will be moved + * by 600 pixels vertically. Setting factor to 1.5f will result in 150px diff: 300*1.5=150 + * + * @param factor + * must be larger or equal than 1.0f + */ + public void setFactor(float factor) { + if (factor < 1.0f) + throw new IllegalArgumentException("Factor value must be larger or equal than 1.0f !"); + + this.factor = factor; + } + + /** + * Get parallax animation bounds factor. + * + * @return + * either {@value #FACTOR_DEFAULT} (default value, when none factor is applied) or value that is larger or equal to 1.0f. + */ + public float getFactor(){ + return factor; + } } \ No newline at end of file diff --git a/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWTextView.java b/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWTextView.java index b1b08a9..eefafcb 100644 --- a/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWTextView.java +++ b/library/src/main/java/com/fmsirvent/ParallaxEverywhere/PEWTextView.java @@ -280,4 +280,9 @@ public boolean isBlockParallaxY() { public void setBlockParallaxY(boolean blockParallaxY) { this.blockParallaxY = blockParallaxY; } + + @Override + public void scrollTo(int x, int y) { + super.scrollTo(isBlockParallaxX() ? 0 : x, isBlockParallaxY() ? 0 : y); + } } diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 620ebae..a697faa 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -27,5 +27,7 @@ + + \ No newline at end of file