From 765e17e8490e38f3670ac28003cc7794e806fbde Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Sun, 3 Sep 2017 16:59:02 +0300 Subject: [PATCH 01/15] Updage Gradle plugin to 2.3.3 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 4872fdf..d25912d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:2.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -18,7 +18,7 @@ allprojects { maven { url "https://jitpack.io" } - + google() } } From a911fd6d2978db31943f67d8a1d2a57b40f8ccca Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Sun, 3 Sep 2017 16:59:42 +0300 Subject: [PATCH 02/15] Update build tools, support lib to 26.0.1 --- materialintro/build.gradle | 10 +++++----- sample/build.gradle | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/materialintro/build.gradle b/materialintro/build.gradle index 876f9ab..b19c1ad 100644 --- a/materialintro/build.gradle +++ b/materialintro/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { minSdkVersion 14 - targetSdkVersion 23 + targetSdkVersion 26 versionCode 1 versionName "1.0" } @@ -22,6 +22,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:cardview-v7:23.1.0' + compile 'com.android.support:appcompat-v7:26.0.1' + compile 'com.android.support:cardview-v7:26.0.1' } diff --git a/sample/build.gradle b/sample/build.gradle index ea5e823..7e50f46 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { applicationId "co.mobiwise.sample" minSdkVersion 14 - targetSdkVersion 23 + targetSdkVersion 26 versionCode 1 versionName "1.0" } @@ -22,8 +22,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' + compile 'com.android.support:appcompat-v7:26.0.1' + compile 'com.android.support:design:26.0.1' //compile 'com.github.iammert:MaterialIntroView:1.5.1' compile project(':materialintro') compile 'com.squareup.picasso:picasso:2.5.2' From 2b88bda7a530e2c4c9939c5e7de61bd2cdfd77b8 Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Sun, 3 Sep 2017 19:43:51 +0300 Subject: [PATCH 03/15] Add support for top/bottom focus gravity, custom focus drawable, animator and fade duration. --- README.md | 19 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../MaterialIntroConfiguration.java | 28 ++-- .../mobiwise/materialintro/shape/Circle.java | 8 +- .../materialintro/shape/CircleOnEdge.java | 48 +++++++ .../materialintro/shape/FocusGravity.java | 2 +- .../mobiwise/materialintro/shape/Shape.java | 11 +- .../materialintro/view/MaterialIntroView.java | 120 +++++++++++++----- .../src/main/res/animator/pulsate.xml | 20 +++ .../layout/{dotview.xml => gestureview.xml} | 0 materialintro/src/main/res/values/dimens.xml | 1 + .../java/co/mobiwise/sample/MainActivity.java | 4 + .../sample/ToolbarMenuItemActivity.java | 1 - .../sample/fragment/FocusFragment.java | 1 - .../sample/fragment/GestureFragment.java | 108 ++++++++++++++++ .../sample/fragment/GravityFragment.java | 1 - .../sample/fragment/MainFragment.java | 1 - .../sample/fragment/RecyclerviewFragment.java | 1 - .../main/res/animator/drag_from_bottom.xml | 10 ++ .../src/main/res/animator/drag_from_left.xml | 10 ++ .../src/main/res/animator/drag_from_right.xml | 10 ++ .../src/main/res/animator/drag_from_top.xml | 10 ++ .../main/res/drawable/ic_cursor_pointer.xml | 10 ++ .../src/main/res/layout/fragment_gesture.xml | 6 + sample/src/main/res/layout/page.xml | 9 ++ .../main/res/menu/activity_main_drawer.xml | 3 + 26 files changed, 393 insertions(+), 51 deletions(-) create mode 100644 materialintro/src/main/java/co/mobiwise/materialintro/shape/CircleOnEdge.java create mode 100644 materialintro/src/main/res/animator/pulsate.xml rename materialintro/src/main/res/layout/{dotview.xml => gestureview.xml} (100%) create mode 100644 sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java create mode 100644 sample/src/main/res/animator/drag_from_bottom.xml create mode 100644 sample/src/main/res/animator/drag_from_left.xml create mode 100644 sample/src/main/res/animator/drag_from_right.xml create mode 100644 sample/src/main/res/animator/drag_from_top.xml create mode 100644 sample/src/main/res/drawable/ic_cursor_pointer.xml create mode 100644 sample/src/main/res/layout/fragment_gesture.xml create mode 100644 sample/src/main/res/layout/page.xml diff --git a/README.md b/README.md index 7bb2e86..525fd05 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ dependencies { ``` ```java .enableFadeAnimation(true) //View will appear/disappear with fade in/out animation +```java +.setFadeAnimation(200) //If enableFadeAnimation(true) is called view will fade in/out with 200 ms duration ``` ```java //ie. If your button's width has MATCH_PARENT. @@ -63,6 +65,8 @@ dependencies { .setFocusGravity(FocusGravity.LEFT) .setFocusType(FocusGravity.CENTER) .setFocusType(FocusGravity.RIGHT) +.setFocusType(FocusGravity.TOP) +.setFocusType(FocusGravity.BOTTOM) ``` ```java .setTarget(myButton) //Focus on myButton @@ -95,7 +99,17 @@ dependencies { .setUsageId("intro_fab_button") //Store intro view status whether it is learnt or not ``` ```java -.enableDotAnimation(true) //Shows dot animation center of focus area +// Draws a gesture drawable at the center of focus area. The default drawable is a pulsating dot. It can be +// overriden with `setGestureDrawableResId()``. +.enableGestureDrawable(true) +``` +```java +// Shows a custom drawable at the center of focus area. E.g. it could visually represent a specific gesture. +.setGestureDrawableResId(R.drawable.ic_cursor_hand) +``` +```java +// Shows a custom animator for the gesture drawable if enabled. +.setGestureAnimatorResId(R.animator.ic_drag_from_right) ``` ```java .enableIcon(false) //Turn off helper icon, default is true @@ -136,6 +150,9 @@ public class MyShape extends Shape { .setCustomShape(MyShape shape) +// or you can use the built-in `CircleOnEdge` shape whose focus center snaps to an edge depending on the supplied `FocusGravity`: + +.setCustomShape(new CircleOnEdge(new ViewTarget(view), FocusGravity.RIGHT, 0)) ``` # Demos diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 122a0dc..8a14252 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java index b244b03..129189e 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java @@ -1,6 +1,9 @@ package co.mobiwise.materialintro; +import android.support.annotation.AnimatorRes; +import android.support.annotation.DrawableRes; + import co.mobiwise.materialintro.shape.Focus; import co.mobiwise.materialintro.shape.FocusGravity; import co.mobiwise.materialintro.utils.Constants; @@ -23,7 +26,9 @@ public class MaterialIntroConfiguration { private int colorTextViewInfo; - private boolean isDotViewEnabled; + private @DrawableRes int gestureDrawableResId; + + private @AnimatorRes int gestureAnimatorResId; private boolean isImageViewEnabled; @@ -36,7 +41,6 @@ public MaterialIntroConfiguration() { focusGravity = FocusGravity.CENTER; isFadeAnimationEnabled = false; dismissOnTouch = false; - isDotViewEnabled = false; isImageViewEnabled = true; } @@ -104,15 +108,23 @@ public void setColorTextViewInfo(int colorTextViewInfo) { this.colorTextViewInfo = colorTextViewInfo; } - public boolean isDotViewEnabled() { - return isDotViewEnabled; - } - public boolean isImageViewEnabled(){ return isImageViewEnabled; } - public void setDotViewEnabled(boolean dotViewEnabled) { - isDotViewEnabled = dotViewEnabled; + public int getGestureDrawableResId() { + return gestureDrawableResId; + } + + public void setGestureDrawableResId(int gestureDrawableResId) { + this.gestureDrawableResId = gestureDrawableResId; + } + + public int getGestureAnimatorResId() { + return gestureAnimatorResId; + } + + public void setGestureAnimatorResId(int gestureAnimatorResId) { + this.gestureAnimatorResId = gestureAnimatorResId; } } \ No newline at end of file diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java index 6620074..fcacee3 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java @@ -34,7 +34,7 @@ public void reCalculateAll(){ circlePoint = getFocusPoint(); } - private void calculateRadius(int padding){ + protected void calculateRadius(int padding){ int side; if(focus == Focus.MINIMUM) @@ -50,7 +50,11 @@ else if(focus == Focus.ALL) radius = side + padding; } - private int getRadius(){ + protected void setRadius(int radius) { + this.radius = radius; + } + + protected int getRadius(){ return radius; } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/CircleOnEdge.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/CircleOnEdge.java new file mode 100644 index 0000000..3ff4c4b --- /dev/null +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/CircleOnEdge.java @@ -0,0 +1,48 @@ +package co.mobiwise.materialintro.shape; + +import android.graphics.Point; + +import co.mobiwise.materialintro.R; +import co.mobiwise.materialintro.target.Target; + +public class CircleOnEdge extends Circle { + + protected int radius = 0; + + public CircleOnEdge(Target target, FocusGravity focusGravity, int padding) { + this(target, Focus.MINIMUM, focusGravity, padding, 0); + } + + public CircleOnEdge(Target target, Focus focus, FocusGravity focusGravity, int padding, int radius) { + super(target, focus, focusGravity, padding); + if (radius <= 0) { + this.radius = this.target.getView().getContext().getResources().getDimensionPixelSize(R.dimen.gesture_circle_radius); + } else { + this.radius = radius; + } + calculateRadius(padding); + } + + @Override + protected Point getFocusPoint() { + if (focusGravity == FocusGravity.LEFT) { + int xLeft = target.getRect().left + this.radius / 2; + return new Point(xLeft, target.getPoint().y); + } else if (focusGravity == FocusGravity.RIGHT) { + int xRight = target.getRect().right - this.radius / 2; + return new Point(xRight, target.getPoint().y); + } else if (focusGravity == FocusGravity.TOP) { + int yTop = target.getRect().top + this.radius / 2; + return new Point(target.getPoint().x, yTop); + } else if (focusGravity == FocusGravity.BOTTOM) { + int yBottom = target.getRect().bottom - this.radius / 2; + return new Point(target.getPoint().x, yBottom); + } else + return target.getPoint(); + } + + @Override + protected void calculateRadius(int padding) { + setRadius(radius); + } +} \ No newline at end of file diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/FocusGravity.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/FocusGravity.java index 88af9b4..d6c3422 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/FocusGravity.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/FocusGravity.java @@ -10,5 +10,5 @@ public enum FocusGravity { * ie. We may want to focus on * left of recyclerview item */ - LEFT, CENTER, RIGHT + LEFT, CENTER, RIGHT, TOP, BOTTOM } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java index 37c742d..e25879b 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java @@ -46,8 +46,15 @@ else if(focusGravity == FocusGravity.RIGHT){ int xRight = target.getPoint().x + (target.getRect().right - target.getPoint().x) / 2; return new Point(xRight, target.getPoint().y); } - else - return target.getPoint(); + else if(focusGravity == FocusGravity.TOP){ + int yTop = target.getRect().top + (target.getPoint().y - target.getRect().bottom) / 2; + return new Point(target.getPoint().x, yTop); + } + else if(focusGravity == FocusGravity.BOTTOM){ + int yBottom = target.getPoint().y + (target.getRect().bottom - target.getPoint().y) / 2; + return new Point(target.getPoint().x, yBottom); + } + return target.getPoint(); } public abstract void reCalculateAll(); diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 2f5afe2..1904a48 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -1,5 +1,7 @@ package co.mobiwise.materialintro.view; +import android.animation.Animator; +import android.animation.AnimatorInflater; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; @@ -11,6 +13,8 @@ import android.graphics.PorterDuffXfermode; import android.os.Build; import android.os.Handler; +import android.support.annotation.AnimatorRes; +import android.support.annotation.DrawableRes; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; @@ -153,16 +157,18 @@ public class MaterialIntroView extends RelativeLayout { private boolean isInfoEnabled; /** - * Dot view will appear center of + * Gesture view will appear center of * cleared target area */ - private View dotView; + private ImageView gestureView; - /** - * Dot View will be shown if - * this is true - */ - private boolean isDotViewEnabled; + private boolean gestureDrawableEnabled; + + private @DrawableRes int gestureDrawableResId; + + private @AnimatorRes int gestureAnimatorResId; + + private Animator gestureAnimator; /** * Info Dialog Icon @@ -261,10 +267,12 @@ private void init(Context context) { dismissOnTouch = false; isLayoutCompleted = false; isInfoEnabled = false; - isDotViewEnabled = false; isPerformClick = false; isImageViewEnabled = true; isIdempotent = false; + gestureDrawableEnabled = true; + gestureDrawableResId = R.drawable.icon_dotview; + gestureAnimatorResId = R.animator.pulsate; /** * initialize objects @@ -285,8 +293,8 @@ private void init(Context context) { textViewInfo.setTextColor(colorTextViewInfo); imageViewIcon = (ImageView) layoutInfo.findViewById(R.id.imageview_icon); - dotView = LayoutInflater.from(getContext()).inflate(R.layout.dotview, null); - dotView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + gestureView = (ImageView) LayoutInflater.from(getContext()).inflate(R.layout.gestureview, null); + gestureView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override @@ -295,8 +303,8 @@ public void onGlobalLayout() { if (targetShape != null && targetShape.getPoint().y != 0 && !isLayoutCompleted) { if (isInfoEnabled) setInfoLayout(); - if(isDotViewEnabled) - setDotViewLayout(); + if(gestureDrawableEnabled && gestureDrawableResId != 0) + setGestureViewLayout(); removeOnGlobalLayoutListener(MaterialIntroView.this, this); } } @@ -502,29 +510,39 @@ public void run() { }); } - private void setDotViewLayout() { + private void setGestureViewLayout() { handler.post(new Runnable() { @Override public void run() { - if (dotView.getParent() != null) - ((ViewGroup) dotView.getParent()).removeView(dotView); + if (gestureView.getParent() != null) + ((ViewGroup) gestureView.getParent()).removeView(gestureView); - RelativeLayout.LayoutParams dotViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - dotViewLayoutParams.height = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); - dotViewLayoutParams.width = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); - dotViewLayoutParams.setMargins( - targetShape.getPoint().x - (dotViewLayoutParams.width / 2), - targetShape.getPoint().y - (dotViewLayoutParams.height / 2), + RelativeLayout.LayoutParams gestureViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + gestureViewLayoutParams.height = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); + gestureViewLayoutParams.width = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); + gestureViewLayoutParams.setMargins( + targetShape.getPoint().x - (gestureViewLayoutParams.width / 2), + targetShape.getPoint().y - (gestureViewLayoutParams.height / 2), 0, 0); - dotView.setLayoutParams(dotViewLayoutParams); - dotView.postInvalidate(); - addView(dotView); + gestureView.setLayoutParams(gestureViewLayoutParams); + gestureView.postInvalidate(); + addView(gestureView); + gestureView.setVisibility(VISIBLE); + + if (gestureDrawableResId != 0) { + gestureView.setImageResource(gestureDrawableResId); + } - dotView.setVisibility(VISIBLE); - AnimationFactory.performAnimation(dotView); + if (gestureAnimatorResId != 0) { + if (gestureAnimator == null) { + gestureAnimator = AnimatorInflater.loadAnimator(getContext(), gestureAnimatorResId); + } + gestureAnimator.setTarget(gestureView); + gestureAnimator.start(); + } } }); } @@ -545,6 +563,10 @@ private void enableFadeAnimation(boolean isFadeAnimationEnabled) { this.isFadeAnimationEnabled = isFadeAnimationEnabled; } + private void setFadeAnimationDuration(long fadeAnimationDuration) { + this.fadeAnimationDuration = fadeAnimationDuration; + } + private void setShapeType(ShapeType shape) { this.shapeType = shape; } @@ -602,8 +624,28 @@ private void setIdempotent(boolean idempotent){ this.isIdempotent = idempotent; } - private void enableDotView(boolean isDotViewEnabled){ - this.isDotViewEnabled = isDotViewEnabled; + public boolean isGestureDrawableEnabled() { + return gestureDrawableEnabled; + } + + public void enableGestureDrawable(boolean enabled) { + this.gestureDrawableEnabled = enabled; + } + + public int getGestureDrawableResId() { + return gestureDrawableResId; + } + + public void setGestureDrawableResId(int gestureDrawableResId) { + this.gestureDrawableResId = gestureDrawableResId; + } + + public int getGestureAnimatorResId() { + return gestureAnimatorResId; + } + + public void setGestureAnimatorResId(int gestureAnimatorResId) { + this.gestureAnimatorResId = gestureAnimatorResId; } public void setConfiguration(MaterialIntroConfiguration configuration) { @@ -613,7 +655,8 @@ public void setConfiguration(MaterialIntroConfiguration configuration) { this.delayMillis = configuration.getDelayMillis(); this.isFadeAnimationEnabled = configuration.isFadeAnimationEnabled(); this.colorTextViewInfo = configuration.getColorTextViewInfo(); - this.isDotViewEnabled = configuration.isDotViewEnabled(); + this.gestureDrawableResId = configuration.getGestureDrawableResId(); + this.gestureAnimatorResId = configuration.getGestureAnimatorResId(); this.dismissOnTouch = configuration.isDismissOnTouch(); this.colorTextViewInfo = configuration.getColorTextViewInfo(); this.focusType = configuration.getFocusType(); @@ -664,6 +707,11 @@ public Builder enableFadeAnimation(boolean isFadeAnimationEnabled) { return this; } + public Builder setFadeAnimationDuration(long fadeAnimationDuration) { + materialIntroView.setFadeAnimationDuration(fadeAnimationDuration); + return this; + } + public Builder setShape(ShapeType shape) { materialIntroView.setShapeType(shape); return this; @@ -715,8 +763,18 @@ public Builder setUsageId(String materialIntroViewId) { return this; } - public Builder enableDotAnimation(boolean isDotAnimationEnabled) { - materialIntroView.enableDotView(isDotAnimationEnabled); + public Builder enableGestureDrawable(boolean enabled) { + materialIntroView.enableGestureDrawable(enabled); + return this; + } + + public Builder setGestureDrawableResId(@DrawableRes int gestureDrawableResId) { + materialIntroView.setGestureDrawableResId(gestureDrawableResId); + return this; + } + + public Builder setGestureAnimatorResId(@AnimatorRes int gestureAnimatorResId) { + materialIntroView.setGestureAnimatorResId(gestureAnimatorResId); return this; } diff --git a/materialintro/src/main/res/animator/pulsate.xml b/materialintro/src/main/res/animator/pulsate.xml new file mode 100644 index 0000000..5c18cd6 --- /dev/null +++ b/materialintro/src/main/res/animator/pulsate.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/materialintro/src/main/res/layout/dotview.xml b/materialintro/src/main/res/layout/gestureview.xml similarity index 100% rename from materialintro/src/main/res/layout/dotview.xml rename to materialintro/src/main/res/layout/gestureview.xml diff --git a/materialintro/src/main/res/values/dimens.xml b/materialintro/src/main/res/values/dimens.xml index a8b38b0..112ffa4 100644 --- a/materialintro/src/main/res/values/dimens.xml +++ b/materialintro/src/main/res/values/dimens.xml @@ -2,4 +2,5 @@ 24dp 16sp + 96dp \ No newline at end of file diff --git a/sample/src/main/java/co/mobiwise/sample/MainActivity.java b/sample/src/main/java/co/mobiwise/sample/MainActivity.java index 2a305ff..370f6b0 100644 --- a/sample/src/main/java/co/mobiwise/sample/MainActivity.java +++ b/sample/src/main/java/co/mobiwise/sample/MainActivity.java @@ -12,6 +12,7 @@ import android.view.MenuItem; import co.mobiwise.sample.fragment.FocusFragment; +import co.mobiwise.sample.fragment.GestureFragment; import co.mobiwise.sample.fragment.GravityFragment; import co.mobiwise.sample.fragment.MainFragment; import co.mobiwise.sample.fragment.RecyclerviewFragment; @@ -97,6 +98,9 @@ public boolean onNavigationItemSelected(MenuItem item) { break; case R.id.nav_tab: break; + case R.id.nav_gesture: + getSupportFragmentManager().beginTransaction().replace(R.id.container, new GestureFragment()).commit(); + break; default: break; } diff --git a/sample/src/main/java/co/mobiwise/sample/ToolbarMenuItemActivity.java b/sample/src/main/java/co/mobiwise/sample/ToolbarMenuItemActivity.java index 7835f6f..e6787ec 100644 --- a/sample/src/main/java/co/mobiwise/sample/ToolbarMenuItemActivity.java +++ b/sample/src/main/java/co/mobiwise/sample/ToolbarMenuItemActivity.java @@ -134,7 +134,6 @@ public boolean onNavigationItemSelected(MenuItem item) { */ public void showIntro(View view, String id, String text, FocusGravity focusGravity) { new MaterialIntroView.Builder(ToolbarMenuItemActivity.this) - .enableDotAnimation(true) .setFocusGravity(focusGravity) .setFocusType(Focus.MINIMUM) .setDelayMillis(100) diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/FocusFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/FocusFragment.java index 82e9e86..9ee3eea 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/FocusFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/FocusFragment.java @@ -43,7 +43,6 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public void showIntro(View view, String id, String text, Focus focusType){ new MaterialIntroView.Builder(getActivity()) - .enableDotAnimation(false) .setFocusGravity(FocusGravity.CENTER) .setFocusType(focusType) .setDelayMillis(200) diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java new file mode 100644 index 0000000..dcba86c --- /dev/null +++ b/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java @@ -0,0 +1,108 @@ +package co.mobiwise.sample.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import co.mobiwise.materialintro.animation.MaterialIntroListener; +import co.mobiwise.materialintro.shape.CircleOnEdge; +import co.mobiwise.materialintro.shape.FocusGravity; +import co.mobiwise.materialintro.target.ViewTarget; +import co.mobiwise.materialintro.view.MaterialIntroView; +import co.mobiwise.sample.R; + +/** + * Created by mertsimsek on 31/01/16. + */ +public class GestureFragment extends Fragment implements MaterialIntroListener{ + + private static final String INTRO_CARD_LEFT = "intro_gesture_left"; + private static final String INTRO_CARD_RIGHT = "intro_gesture_right"; + private static final String INTRO_CARD_TOP = "intro_gesture_top"; + private static final String INTRO_CARD_BOTTOM = "intro_gesture_bottom"; + + private ViewPager pager; + private PagerAdapter pagerAdapter; + + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_gesture, container, false); + + this.pager = view.findViewById(R.id.pager); + this.pagerAdapter = new ScreenSlidePagerAdapter(); + this.pager.setAdapter(this.pagerAdapter); + + showIntro(view, INTRO_CARD_RIGHT, "Hint that the view can be dragged from the RIGHT edge", + FocusGravity.RIGHT, R.animator.drag_from_right); + + return view; + } + + @Override + public void onUserClicked(String materialIntroViewId) { + if(materialIntroViewId == INTRO_CARD_RIGHT) { + pager.setCurrentItem(1, true); + showIntro(getView(), INTRO_CARD_LEFT, "Hint that the view can be dragged from the LEFT edge", + FocusGravity.LEFT, R.animator.drag_from_left); + } else if (materialIntroViewId == INTRO_CARD_LEFT) { + pager.setCurrentItem(0, true); + showIntro(getView(), INTRO_CARD_TOP, "Hint that the view can be dragged from the TOP edge", + FocusGravity.TOP, R.animator.drag_from_top); + } else if (materialIntroViewId == INTRO_CARD_TOP) { + showIntro(getView(), INTRO_CARD_BOTTOM, "Hint that the view can be dragged from the BOTTOM edge", + FocusGravity.BOTTOM, R.animator.drag_from_bottom); + } + } + + public void showIntro(View view, String id, String text, FocusGravity focusGravity, int animatorResId){ + new MaterialIntroView.Builder(getActivity()) + .setGestureDrawableResId(R.drawable.ic_cursor_pointer) + .setGestureAnimatorResId(animatorResId) + .setCustomShape(new CircleOnEdge(new ViewTarget(view), focusGravity, 0)) + .setDelayMillis(200) + .enableFadeAnimation(true) + .setFadeAnimationDuration(200) + .performClick(true) + .setInfoText(text) + .setTarget(view) + .setListener(this) + .setUsageId(id) //THIS SHOULD BE UNIQUE ID + .show(); + } + + private class ScreenSlidePagerAdapter extends PagerAdapter { + + @Override + public Object instantiateItem(ViewGroup collection, int position) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + TextView pageNumber = (TextView) inflater.inflate(R.layout.page, collection, false); + pageNumber.setBackgroundColor(position == 0 ? 0xFF00897B : 0xFFFF9800); + pageNumber.setText(String.valueOf(position)); + collection.addView(pageNumber); + return pageNumber; + } + + @Override + public void destroyItem(ViewGroup collection, int position, Object view) { + collection.removeView((View) view); + } + + @Override + public int getCount() { + return 2; + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + } +} diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/GravityFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/GravityFragment.java index dbe4be2..e9fc0b7 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/GravityFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/GravityFragment.java @@ -51,7 +51,6 @@ public void onUserClicked(String materialIntroViewId) { public void showIntro(View view, String id, String text, FocusGravity focusGravity){ new MaterialIntroView.Builder(getActivity()) - .enableDotAnimation(true) .setFocusGravity(focusGravity) .setFocusType(Focus.MINIMUM) .setDelayMillis(200) diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java index 3d829cd..e67308b 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java @@ -50,7 +50,6 @@ public void onClick(View v) { private void showIntro(View view, String usageId, String text){ new MaterialIntroView.Builder(getActivity()) - .enableDotAnimation(true) //.enableIcon(false) .setFocusGravity(FocusGravity.CENTER) .setFocusType(Focus.MINIMUM) diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/RecyclerviewFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/RecyclerviewFragment.java index 4e7aed0..ab8a144 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/RecyclerviewFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/RecyclerviewFragment.java @@ -49,7 +49,6 @@ public void run() { private void showMaterialIntro() { new MaterialIntroView.Builder(getActivity()) - .enableDotAnimation(true) .setFocusGravity(FocusGravity.CENTER) .setFocusType(Focus.MINIMUM) .setDelayMillis(200) diff --git a/sample/src/main/res/animator/drag_from_bottom.xml b/sample/src/main/res/animator/drag_from_bottom.xml new file mode 100644 index 0000000..0665c61 --- /dev/null +++ b/sample/src/main/res/animator/drag_from_bottom.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/animator/drag_from_left.xml b/sample/src/main/res/animator/drag_from_left.xml new file mode 100644 index 0000000..97bd54f --- /dev/null +++ b/sample/src/main/res/animator/drag_from_left.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/animator/drag_from_right.xml b/sample/src/main/res/animator/drag_from_right.xml new file mode 100644 index 0000000..e98be1d --- /dev/null +++ b/sample/src/main/res/animator/drag_from_right.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/animator/drag_from_top.xml b/sample/src/main/res/animator/drag_from_top.xml new file mode 100644 index 0000000..7ae9cbc --- /dev/null +++ b/sample/src/main/res/animator/drag_from_top.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/drawable/ic_cursor_pointer.xml b/sample/src/main/res/drawable/ic_cursor_pointer.xml new file mode 100644 index 0000000..88bc60c --- /dev/null +++ b/sample/src/main/res/drawable/ic_cursor_pointer.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/fragment_gesture.xml b/sample/src/main/res/layout/fragment_gesture.xml new file mode 100644 index 0000000..80a99db --- /dev/null +++ b/sample/src/main/res/layout/fragment_gesture.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/layout/page.xml b/sample/src/main/res/layout/page.xml new file mode 100644 index 0000000..1a1df4b --- /dev/null +++ b/sample/src/main/res/layout/page.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/sample/src/main/res/menu/activity_main_drawer.xml b/sample/src/main/res/menu/activity_main_drawer.xml index 1b8e46b..61d9b52 100644 --- a/sample/src/main/res/menu/activity_main_drawer.xml +++ b/sample/src/main/res/menu/activity_main_drawer.xml @@ -20,6 +20,9 @@ + From 5925158d81a06ed383c8427458a63f411b798645 Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Sun, 3 Sep 2017 23:32:52 +0300 Subject: [PATCH 04/15] Fix markdown in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 525fd05..6762b98 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ We saw this kind of showcase on [Fabulous App](http://www.thefabulous.co/) and w # Usage ```java new MaterialIntroView.Builder(this) - .enableDotAnimation(true) .enableIcon(false) .setFocusGravity(FocusGravity.CENTER) .setFocusType(Focus.MINIMUM) @@ -49,6 +48,7 @@ dependencies { ``` ```java .enableFadeAnimation(true) //View will appear/disappear with fade in/out animation +``` ```java .setFadeAnimation(200) //If enableFadeAnimation(true) is called view will fade in/out with 200 ms duration ``` From cc3b4d63c9f7c9a6920305eae7fa29babdb850b3 Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 4 Sep 2017 17:23:55 +0300 Subject: [PATCH 05/15] Add support for custom icon. --- .../materialintro/MaterialIntroConfiguration.java | 11 +++++++++++ .../materialintro/view/MaterialIntroView.java | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java index 129189e..26da2ff 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java @@ -32,6 +32,8 @@ public class MaterialIntroConfiguration { private boolean isImageViewEnabled; + private @DrawableRes int iconDrawableResId; + public MaterialIntroConfiguration() { maskColor = Constants.DEFAULT_MASK_COLOR; delayMillis = Constants.DEFAULT_DELAY_MILLIS; @@ -42,6 +44,7 @@ public MaterialIntroConfiguration() { isFadeAnimationEnabled = false; dismissOnTouch = false; isImageViewEnabled = true; + iconDrawableResId = R.drawable.icon_question; } public int getMaskColor() { @@ -112,6 +115,14 @@ public boolean isImageViewEnabled(){ return isImageViewEnabled; } + public void setIconDrawableResId(int iconDrawableResId) { + this.iconDrawableResId = iconDrawableResId; + } + + public int getIconDrawableResId() { + return this.iconDrawableResId; + } + public int getGestureDrawableResId() { return gestureDrawableResId; } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 1904a48..db02bba 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -175,6 +175,8 @@ public class MaterialIntroView extends RelativeLayout { */ private ImageView imageViewIcon; + private int iconDrawableResId; + /** * Image View will be shown if * this is true @@ -273,6 +275,7 @@ private void init(Context context) { gestureDrawableEnabled = true; gestureDrawableResId = R.drawable.icon_dotview; gestureAnimatorResId = R.animator.pulsate; + iconDrawableResId = R.drawable.icon_question; /** * initialize objects @@ -292,6 +295,7 @@ private void init(Context context) { textViewInfo = (TextView) layoutInfo.findViewById(R.id.textview_info); textViewInfo.setTextColor(colorTextViewInfo); imageViewIcon = (ImageView) layoutInfo.findViewById(R.id.imageview_icon); + imageViewIcon.setImageResource(iconDrawableResId); gestureView = (ImageView) LayoutInflater.from(getContext()).inflate(R.layout.gestureview, null); gestureView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); @@ -661,6 +665,8 @@ public void setConfiguration(MaterialIntroConfiguration configuration) { this.colorTextViewInfo = configuration.getColorTextViewInfo(); this.focusType = configuration.getFocusType(); this.focusGravity = configuration.getFocusGravity(); + this.isImageViewEnabled = configuration.isImageViewEnabled(); + this.iconDrawableResId = configuration.getIconDrawableResId(); } } @@ -783,6 +789,11 @@ public Builder enableIcon(boolean isImageViewIconEnabled) { return this; } + public Builder setIconDrawableResId(@DrawableRes int drawableResId) { + materialIntroView.iconDrawableResId = drawableResId; + return this; + } + public Builder setIdempotent(boolean idempotent) { materialIntroView.setIdempotent(idempotent); return this; From 50eaf32609028061878fb1e94e445932351701ab Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 4 Sep 2017 17:40:28 +0300 Subject: [PATCH 06/15] Fix custom icon --- .../materialintro/view/MaterialIntroView.java | 15 +++++++++++---- .../mobiwise/sample/fragment/GestureFragment.java | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index db02bba..8a4d6b8 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -505,9 +505,8 @@ public void run() { addView(infoView); - if (!isImageViewEnabled){ - imageViewIcon.setVisibility(GONE); - } + imageViewIcon.setVisibility(isImageViewEnabled ? VISIBLE : GONE); + imageViewIcon.setImageResource(iconDrawableResId); infoView.setVisibility(VISIBLE); } @@ -624,6 +623,14 @@ private void enableImageViewIcon(boolean isImageViewEnabled){ this.isImageViewEnabled = isImageViewEnabled; } + public int getIconDrawableResId() { + return iconDrawableResId; + } + + public void setIconDrawableResId(int iconDrawableResId) { + this.iconDrawableResId = iconDrawableResId; + } + private void setIdempotent(boolean idempotent){ this.isIdempotent = idempotent; } @@ -790,7 +797,7 @@ public Builder enableIcon(boolean isImageViewIconEnabled) { } public Builder setIconDrawableResId(@DrawableRes int drawableResId) { - materialIntroView.iconDrawableResId = drawableResId; + materialIntroView.setIconDrawableResId(drawableResId); return this; } diff --git a/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java b/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java index dcba86c..643fd94 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/GestureFragment.java @@ -68,6 +68,7 @@ public void showIntro(View view, String id, String text, FocusGravity focusGravi .setGestureAnimatorResId(animatorResId) .setCustomShape(new CircleOnEdge(new ViewTarget(view), focusGravity, 0)) .setDelayMillis(200) + .setIconDrawableResId(android.R.drawable.ic_dialog_info) .enableFadeAnimation(true) .setFadeAnimationDuration(200) .performClick(true) From ebebd4344acfc0053c0b849be0353a58a36c4f5a Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 4 Sep 2017 20:14:10 +0300 Subject: [PATCH 07/15] Added support for custom icon size --- .../materialintro/MaterialIntroConfiguration.java | 2 +- .../java/co/mobiwise/materialintro/utils/Constants.java | 3 +++ .../co/mobiwise/materialintro/view/MaterialIntroView.java | 8 +++++++- materialintro/src/main/res/layout/material_intro_card.xml | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java index 26da2ff..d709edf 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/MaterialIntroConfiguration.java @@ -44,7 +44,7 @@ public MaterialIntroConfiguration() { isFadeAnimationEnabled = false; dismissOnTouch = false; isImageViewEnabled = true; - iconDrawableResId = R.drawable.icon_question; + iconDrawableResId = Constants.DEFAULT_ICON_DRAWABLE; } public int getMaskColor() { diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java index c97b6a4..0272870 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java @@ -1,5 +1,7 @@ package co.mobiwise.materialintro.utils; +import co.mobiwise.materialintro.R; + /** * Created by mertsimsek on 24/01/16. */ @@ -17,4 +19,5 @@ public class Constants { public static int DEFAULT_DOT_SIZE = 55; + public static final int DEFAULT_ICON_DRAWABLE = R.drawable.icon_question; } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 8a4d6b8..5f7fc8c 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -275,7 +275,7 @@ private void init(Context context) { gestureDrawableEnabled = true; gestureDrawableResId = R.drawable.icon_dotview; gestureAnimatorResId = R.animator.pulsate; - iconDrawableResId = R.drawable.icon_question; + iconDrawableResId = Constants.DEFAULT_ICON_DRAWABLE; /** * initialize objects @@ -296,6 +296,12 @@ private void init(Context context) { textViewInfo.setTextColor(colorTextViewInfo); imageViewIcon = (ImageView) layoutInfo.findViewById(R.id.imageview_icon); imageViewIcon.setImageResource(iconDrawableResId); + if (iconDrawableResId != Constants.DEFAULT_ICON_DRAWABLE) { + LayoutParams lp = (LayoutParams) imageViewIcon.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + imageViewIcon.setLayoutParams(lp); + } gestureView = (ImageView) LayoutInflater.from(getContext()).inflate(R.layout.gestureview, null); gestureView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); diff --git a/materialintro/src/main/res/layout/material_intro_card.xml b/materialintro/src/main/res/layout/material_intro_card.xml index fa5fce9..195ae60 100644 --- a/materialintro/src/main/res/layout/material_intro_card.xml +++ b/materialintro/src/main/res/layout/material_intro_card.xml @@ -33,7 +33,7 @@ android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginBottom="16dp" - android:background="@drawable/icon_question"/> + /> Date: Mon, 4 Sep 2017 20:51:00 +0300 Subject: [PATCH 08/15] Fix for custom icon size wrap_contents --- .../materialintro/view/MaterialIntroView.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 5f7fc8c..32a84fc 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -296,12 +296,6 @@ private void init(Context context) { textViewInfo.setTextColor(colorTextViewInfo); imageViewIcon = (ImageView) layoutInfo.findViewById(R.id.imageview_icon); imageViewIcon.setImageResource(iconDrawableResId); - if (iconDrawableResId != Constants.DEFAULT_ICON_DRAWABLE) { - LayoutParams lp = (LayoutParams) imageViewIcon.getLayoutParams(); - lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; - lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; - imageViewIcon.setLayoutParams(lp); - } gestureView = (ImageView) LayoutInflater.from(getContext()).inflate(R.layout.gestureview, null); gestureView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); @@ -513,6 +507,13 @@ public void run() { imageViewIcon.setVisibility(isImageViewEnabled ? VISIBLE : GONE); imageViewIcon.setImageResource(iconDrawableResId); + if (iconDrawableResId != Constants.DEFAULT_ICON_DRAWABLE) { + LayoutParams lp = (LayoutParams) imageViewIcon.getLayoutParams(); + lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; + lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; + imageViewIcon.setLayoutParams(lp); + } + infoView.setVisibility(VISIBLE); } From ffdd6d3d76e88a6970f0075268a7a44717d6ddbd Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 2 Oct 2017 16:58:33 +0300 Subject: [PATCH 09/15] Use mavenPublish Gradle plugin --- materialintro/build.gradle | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/materialintro/build.gradle b/materialintro/build.gradle index b19c1ad..6579a3c 100644 --- a/materialintro/build.gradle +++ b/materialintro/build.gradle @@ -1,4 +1,26 @@ apply plugin: 'com.android.library' +apply plugin: 'maven-publish' + +publishing { + publications { + aarDebug(MavenPublication) { + groupId "com.github.sevar83" + artifactId "MaterialIntroView" + version "1.6.0" + artifact("$buildDir/outputs/aar/materialintro-debug.aar") + // Add javadocs and sources artifact + // Add/Exclude project dependencies via pom.withXml + } + aarRelease(MavenPublication) { + groupId "com.github.sevar83" + artifactId "MaterialIntroView" + version "1.6.0" + artifact("$buildDir/outputs/aar/materialintro-release.aar") + // Add javadocs and sources artifact + // Add/Exclude project dependencies via pom.withXml + } + } +} android { compileSdkVersion 26 From 3bdc69b22be4b45bcd6c28711eb5689bd189517d Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 2 Oct 2017 16:59:25 +0300 Subject: [PATCH 10/15] Fix NPE in PreferencesManager --- .../co/mobiwise/materialintro/prefs/PreferencesManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/prefs/PreferencesManager.java b/materialintro/src/main/java/co/mobiwise/materialintro/prefs/PreferencesManager.java index 0838074..203e054 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/prefs/PreferencesManager.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/prefs/PreferencesManager.java @@ -17,11 +17,13 @@ public PreferencesManager(Context context) { } public boolean isDisplayed(String id){ - return sharedPreferences.getBoolean(id, false); + return id != null && sharedPreferences.getBoolean(id, false); } public void setDisplayed(String id){ - sharedPreferences.edit().putBoolean(id,true).apply(); + if (id != null) { + sharedPreferences.edit().putBoolean(id, true).apply(); + } } public void reset(String id){ From 322a0e2257bfc47f2e8c83219ab2abb2d494d923 Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 2 Oct 2017 17:00:19 +0300 Subject: [PATCH 11/15] Add gesture default drawable and animator constants --- .../main/java/co/mobiwise/materialintro/utils/Constants.java | 4 ++++ .../co/mobiwise/materialintro/view/MaterialIntroView.java | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java index 0272870..d6b1a93 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java @@ -19,5 +19,9 @@ public class Constants { public static int DEFAULT_DOT_SIZE = 55; + public static final int DEFAULT_GESTURE_DRAWABLE = R.drawable.icon_dotview; + + public static final int DEFAULT_GESTURE_ANIMATOR = R.animator.pulsate; + public static final int DEFAULT_ICON_DRAWABLE = R.drawable.icon_question; } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 32a84fc..3d922bf 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -273,8 +273,8 @@ private void init(Context context) { isImageViewEnabled = true; isIdempotent = false; gestureDrawableEnabled = true; - gestureDrawableResId = R.drawable.icon_dotview; - gestureAnimatorResId = R.animator.pulsate; + gestureDrawableResId = Constants.DEFAULT_GESTURE_DRAWABLE; + gestureAnimatorResId = Constants.DEFAULT_GESTURE_ANIMATOR; iconDrawableResId = Constants.DEFAULT_ICON_DRAWABLE; /** From 7da5492f1fb2191a1d2a9ef341dfb3651eecc505 Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 2 Oct 2017 17:29:56 +0300 Subject: [PATCH 12/15] Fix - don't handle input events while in gesture mode --- .../materialintro/view/MaterialIntroView.java | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index 3d922bf..c08db65 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -373,32 +373,45 @@ public boolean onTouchEvent(MotionEvent event) { float yT = event.getY(); boolean isTouchOnFocus = targetShape.isTouchOnFocus(xT, yT); + // TODO extract the flag into MaterialIntroView method ? + boolean passEventsThroughFocusShape = gestureDrawableResId != Constants.DEFAULT_GESTURE_DRAWABLE; - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: + if (passEventsThroughFocusShape) { + if (!isTouchOnFocus) + return true; - if (isTouchOnFocus && isPerformClick) { - targetView.getView().setPressed(true); - targetView.getView().invalidate(); - } + } else { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: - return true; - case MotionEvent.ACTION_UP: + if (isTouchOnFocus && isPerformClick) { + targetView.getView().setPressed(true); + targetView.getView().invalidate(); - if (isTouchOnFocus || dismissOnTouch) - dismiss(); + return true; + } + break; - if (isTouchOnFocus && isPerformClick) { - targetView.getView().performClick(); - targetView.getView().setPressed(true); - targetView.getView().invalidate(); - targetView.getView().setPressed(false); - targetView.getView().invalidate(); - } + case MotionEvent.ACTION_UP: - return true; - default: - break; + if (isTouchOnFocus || dismissOnTouch) + dismiss(); + + if (isTouchOnFocus && isPerformClick) { + targetView.getView().performClick(); + targetView.getView().setPressed(true); + targetView.getView().invalidate(); + targetView.getView().setPressed(false); + targetView.getView().invalidate(); + } + + if (isTouchOnFocus) { + return true; + } + break; + default: + break; + } } return super.onTouchEvent(event); From 457d76d179101655d208dad4f8e99688363d34ea Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Mon, 2 Oct 2017 17:32:59 +0300 Subject: [PATCH 13/15] Target shape now drawing directly to Canvas instead of offscreen Bitmap --- .../mobiwise/materialintro/shape/Circle.java | 16 +++--- .../co/mobiwise/materialintro/shape/Rect.java | 14 ++++-- .../mobiwise/materialintro/shape/Shape.java | 7 +-- .../materialintro/view/MaterialIntroView.java | 50 +++++-------------- 4 files changed, 36 insertions(+), 51 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java index fcacee3..2eb34bc 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java @@ -1,7 +1,6 @@ package co.mobiwise.materialintro.shape; -import android.graphics.Canvas; -import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Point; import co.mobiwise.materialintro.target.Target; @@ -22,10 +21,15 @@ public Circle(Target target, Focus focus, FocusGravity focusGravity, int padding } @Override - public void draw(Canvas canvas, Paint eraser, int padding){ - calculateRadius(padding); - circlePoint = getFocusPoint(); - canvas.drawCircle(circlePoint.x, circlePoint.y, radius, eraser); + public Path getPath(int padding) { + if (this.padding != padding || cachedPath == null) { + this.padding = padding; + Point center = getFocusPoint(); + cachedPath = new Path(); + cachedPath.addCircle((float) center.x, (float) center.y, getRadius() + padding, Path.Direction.CW); + } + + return cachedPath; } @Override diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java index 9854f0d..feebeea 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java @@ -1,7 +1,6 @@ package co.mobiwise.materialintro.shape; -import android.graphics.Canvas; -import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Point; import android.graphics.RectF; @@ -30,8 +29,15 @@ public Rect(Target target, Focus focus, FocusGravity focusGravity, int padding) } @Override - public void draw(Canvas canvas, Paint eraser, int padding) { - canvas.drawRoundRect(adjustedRect, padding, padding, eraser); + public Path getPath(int padding) { + if (this.padding != padding || cachedPath == null) { + this.padding = padding; + calculateAdjustedRect(); + cachedPath = new Path(); + cachedPath.addRoundRect(adjustedRect, padding, padding, Path.Direction.CW); + } + + return cachedPath; } private void calculateAdjustedRect() { diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java index e25879b..90b2f0e 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java @@ -1,7 +1,6 @@ package co.mobiwise.materialintro.shape; -import android.graphics.Canvas; -import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Point; import co.mobiwise.materialintro.target.Target; @@ -20,6 +19,8 @@ public abstract class Shape { protected int padding; + protected Path cachedPath; + public Shape(Target target) { this(target, Focus.MINIMUM); } @@ -35,7 +36,7 @@ public Shape(Target target, Focus focus, FocusGravity focusGravity, int padding) this.padding = padding; } - public abstract void draw(Canvas canvas, Paint eraser, int padding); + public abstract Path getPath(int padding); protected Point getFocusPoint(){ if(focusGravity == FocusGravity.LEFT){ diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index c08db65..dd413b8 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -5,12 +5,8 @@ import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; -import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; +import android.graphics.Path; import android.os.Build; import android.os.Handler; import android.support.annotation.AnimatorRes; @@ -100,10 +96,7 @@ public class MaterialIntroView extends RelativeLayout { */ private Target targetView; - /** - * Eraser - */ - private Paint eraser; + private Path targetShapePath; /** * Handler will be used to @@ -111,14 +104,6 @@ public class MaterialIntroView extends RelativeLayout { */ private Handler handler; - /** - * All views will be drawn to - * this bitmap and canvas then - * bitmap will be drawn to canvas - */ - private Bitmap bitmap; - private Canvas canvas; - /** * Circle padding */ @@ -284,11 +269,6 @@ private void init(Context context) { preferencesManager = new PreferencesManager(context); - eraser = new Paint(); - eraser.setColor(0xFFFFFFFF); - eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); - eraser.setFlags(Paint.ANTI_ALIAS_FLAG); - View layoutInfo = LayoutInflater.from(getContext()).inflate(R.layout.material_intro_card, null); infoView = layoutInfo.findViewById(R.id.info_layout); @@ -339,25 +319,18 @@ protected void onDraw(Canvas canvas) { if (!isReady) return; - if (bitmap == null || canvas == null) { - if (bitmap != null) bitmap.recycle(); + canvas.save(); - bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - this.canvas = new Canvas(bitmap); + if (targetShapePath == null) { + targetShapePath = new Path(); + targetShapePath.addPath(targetShape.getPath(this.padding)); + targetShapePath.setFillType(Path.FillType.INVERSE_EVEN_ODD); } + // TODO add antialiasing somehow, clipPath() does not support it + canvas.clipPath(targetShapePath); + canvas.drawColor(maskColor); - /** - * Draw mask - */ - this.canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); - this.canvas.drawColor(maskColor); - - /** - * Clear focus area - */ - targetShape.draw(this.canvas, eraser, padding); - - canvas.drawBitmap(bitmap, 0, 0, null); + canvas.restore(); } /** @@ -612,6 +585,7 @@ private void setShape(Shape shape) { private void setPadding(int padding) { this.padding = padding; + this.targetShapePath = null; } private void setDismissOnTouch(boolean dismissOnTouch) { From 7887a48e1d36b38b9a99c168a8edb70d43dc931a Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Tue, 3 Oct 2017 18:03:13 +0300 Subject: [PATCH 14/15] Replace the dot image with a density-aware version --- .../mobiwise/materialintro/utils/Constants.java | 2 +- .../src/main/res/drawable-hdpi/ic_dot.png | Bin 0 -> 813 bytes .../src/main/res/drawable-mdpi/ic_dot.png | Bin 0 -> 553 bytes .../src/main/res/drawable-xhdpi/ic_dot.png | Bin 0 -> 1215 bytes .../src/main/res/drawable-xxhdpi/ic_dot.png | Bin 0 -> 1905 bytes .../src/main/res/drawable-xxxhdpi/ic_dot.png | Bin 0 -> 2880 bytes .../src/main/res/drawable/icon_dotview.png | Bin 6609 -> 0 bytes .../src/main/res/layout/gestureview.xml | 2 +- 8 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 materialintro/src/main/res/drawable-hdpi/ic_dot.png create mode 100644 materialintro/src/main/res/drawable-mdpi/ic_dot.png create mode 100644 materialintro/src/main/res/drawable-xhdpi/ic_dot.png create mode 100644 materialintro/src/main/res/drawable-xxhdpi/ic_dot.png create mode 100644 materialintro/src/main/res/drawable-xxxhdpi/ic_dot.png delete mode 100644 materialintro/src/main/res/drawable/icon_dotview.png diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java index d6b1a93..7aedff5 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/utils/Constants.java @@ -19,7 +19,7 @@ public class Constants { public static int DEFAULT_DOT_SIZE = 55; - public static final int DEFAULT_GESTURE_DRAWABLE = R.drawable.icon_dotview; + public static final int DEFAULT_GESTURE_DRAWABLE = R.drawable.ic_dot; public static final int DEFAULT_GESTURE_ANIMATOR = R.animator.pulsate; diff --git a/materialintro/src/main/res/drawable-hdpi/ic_dot.png b/materialintro/src/main/res/drawable-hdpi/ic_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..a573179f8cfa9c00c4fa84a18af114014406cded GIT binary patch literal 813 zcmV+|1JeA7P)ELZ`} zuoM9FqMN1@G%)Bn;^YaO5i)7NR?&laC|?R;5I?pqWz%!@v2i96(42Z zSp*Hm=Z{&?)SVd&I1RfpF629{lYxieQ@k$O1Sx;?s;~F;oN?S;=BWgX$)lto9h?$$ z16F2S$ak8~y3O!`2#rRQ(gbxgAa7-M3Dfzu#U)4r6`{+p$>lNU_cxip)3s$1G!u@& zft(Avre9z{8w{oELhYl{H+DGAnwD}2vU^lL51sL!GiYT?;3pZ zZa<7D_0ekRTVZbj`ScAR=in6dSJj|J5#fzf3p*QB0(2PWu?{0hm05kZ)m%NbzE`A_ zEqziPArizhYulB<9*D3+p!rf*YCDdgn7@(>@0Qs*$@zr7%MO}mD z!ZJ|3nh)x~WrNTM&*2HY2jxz&7e$M(=qj!5QjyYIDbuxCSDc9QuF|%>F%6xzJ$|D%i%GyV&2%=B1sQ5X0iJ%t zFn*ji7*znrIXI|>I;e+A5V1$Ng=@G+=*vzhqJY|QDMnq;3XPCwaq`Lg6&%41cp^m< zCZL?VFj#_SC~!!_2lE#&25zfJB!LnZZa_QeoI9mj&f*OE;RO*>8-xh3dpXE%ScD=c zua#RLzevIiIA!GWIhFNOgroAeU-H9aJ(JQr@$X1f+s`U@HmlQm*5$ zt}7`xMKW%JT_{gb-ItV(VK0nPy!N_bka!`jnjE}Sa%FlAblw08xgHt=VKr@ zy8{|Pz6+8<`T5}qF5v)9z#CJ$)+te~LrS*{YQY7%0lqVS05?2?FE}mQhdkr?WM;Bn r1a$-fU5ddDt>c&kqB(GyOS!-=pr(--VNupD00000NkvXXu0mjf3~A}S literal 0 HcmV?d00001 diff --git a/materialintro/src/main/res/drawable-xhdpi/ic_dot.png b/materialintro/src/main/res/drawable-xhdpi/ic_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..18929ff019f9ef956a4717dba0f037ba2e5e0e7b GIT binary patch literal 1215 zcmV;w1VH8} z%i&@;FAO}$^H10fyI?OIhA{;pL}6XEt^~x0pGuFXhmo^*-UBn>3YZ2L!MS182+zOZ z5BLqX!w~!c`{5`Y>&7FM1z@}*uHk3F9q<&~5Qd+fIE<*$t_tx zjJn330hhqj@Jt9Xl)7meYbd=5Z$TDX$@3#gK+gDcVzgKByc?4KpP)=3U%^uNF}&g2 zD4pa<1|YzAH=b{Ym*Cz6qq_OYCjRs)d<_Rv!l_h1#JnraO|Sy)>&CJQ{~3xw`j+RB zG7%jGMCfR|G4Eu1pn@UY{?xGf2o}RWINE8MEfe7S?pnSGR)V24h~~2TBD@!&ex{UC=u*Viw6UH~qwf45s!iv+k~88T1A2$&Ys(M&&HhIe74T^JP!FnmnRUV%qI zL3K1YxQ*~U>_dQ)`=nMRz;xj{cpdJq!}468U-J1m*oFYpjwAuDKCS=?Fk!2+ZKZRU z)J+I52}}}T{Lc;nH`ZxAeVef^gD=2&a8iC$6haD^8v@Mn>uf*M`EvLe4z=#eodnDY z0W<5gp1wW&DBzQ-0`BAwtKrs~1$mBXSUUlIg{un>mn)+<{8z zbO^9iV(rID+xy_bW{_C7f>$HH%^ zfbc}NtWFOBim=o&p3M@9RfzTAQPQ-bv`(5Tz~3ptNp1Dn_;h>s)HWW?uyM2c6fD7y zV*Ig`7bgh_FJzY(&Iu>8dxYoJUMqEOQdazSfMxi?5=uKk$pW%J$DDAFFyZsuV3Bt| z+zjW3xS}((A>n0*tIT)s0Sv`=Pg@MKR_(gS+6!k3x7uF&Zig5|>>?`B^V(q{e2qF&eC>dajsSU75S&%P#ja z4`n}f9nUWK{QTcVUrPPIwXfFimFGa&3;(zH#LZ>){^ocX+ph1v2}l*%>+dE7^g4pQ d{(r)I;9vW|SwPWmhc*BJ002ovPDHLkV1iriO4a}X literal 0 HcmV?d00001 diff --git a/materialintro/src/main/res/drawable-xxhdpi/ic_dot.png b/materialintro/src/main/res/drawable-xxhdpi/ic_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..b955566e5b5403330c145d5ad75216b287671a2b GIT binary patch literal 1905 zcmV-%2afoOP) zuK5g=9l$9QkY?rrR%?I)OECaIF|8b2^F5yz%Myb5SKlv}IEQlgvcoqv?RmA>|RPv=jhpQNSIvH~ZJ-F5a=_P4e zf^rq}Z*;?P5`8(6Nvw#ByYi?52H3a&{dm3!34EXS~J#p)-kPloiDSq8nkY z*1@_SXDIM|JmOHjls+6*v@|9bRRZ$vMYE3e(8sz*;zeCN$nuGu)*Y#|q8LCl>%<;% z9orrgb^3Z0_bi%jOm*`9FMCK zmv{?Wlnc;Zdf*X#prblGCNc9uE|d)r8T7F|0W?-Uu8|tM7_Au7IdoF5kk0H0AiRO; zYd6X$7bAHrJ*t84f-#1^!jk@rAn|mgdvYcT@5UZWRbBTR%(3Y|L!uR_f`1Ay?Zgs(WtWuAnR_B zO*0yIUYF^p>=#LlEYieR&TzyGm@ytrpr${zKw?A@tLoyxIwIB(Fv~#;wxrR383g=n zDq})4_snRFrG2_cM`b23pDz6@MNJ~cSdh6HR)m|KEZxviK;&`HdF!ckFX~tc$XgL^ zW|M}S>zYYJ&Rsg*Rbd&8zweIhjV0pKG#&t9G3nbL4lP%$HH#^L3=+*gBaJkh3_eZUfg3TTK~m_3 zHKcYIPIQ7fNK^({NxVH%f#65<=pRTVx))F32iT%Yy7jK6wn+DKhKI zlrEN(^vsM@u@uI7SQ_}7hr^=Iq=n_ll_@~N-3Z)_I5L!pRn5l%kn1FpL9E6s#|_HY zwI27I)LN9RvNuS(>zNBB7M0KC!Mf;crH>^y&Li2%*5u7C$$+SN0TLZpQUE})wTWIo zOHH_L^I(phS<(k2I-|5ybR*nWgcPd@3)={gJ*coen7Mq?06?)4gpDT5h7j0u9#{wS zTVshF2QXNTZ9gCpOtu^=Xcj;`ELiAi8(VCj7@&5M*cQbOpzWm8){e@5A-yF%EwTO? zC|C^N*>1vMj3@$3HqIeu4X(N$uZ00000NkvXXu0mjfU;BYh literal 0 HcmV?d00001 diff --git a/materialintro/src/main/res/drawable-xxxhdpi/ic_dot.png b/materialintro/src/main/res/drawable-xxxhdpi/ic_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5f9a595842a31819da64df6172646fb5402bf5 GIT binary patch literal 2880 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 EKO<@MU;qFB diff --git a/materialintro/src/main/res/layout/gestureview.xml b/materialintro/src/main/res/layout/gestureview.xml index afbdadf..7c7b93b 100644 --- a/materialintro/src/main/res/layout/gestureview.xml +++ b/materialintro/src/main/res/layout/gestureview.xml @@ -6,7 +6,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/icon_dotview" + android:src="@drawable/ic_dot" android:visibility="invisible"/> From fdd715a2d41f2506e5008917a8654e93a5e35efb Mon Sep 17 00:00:00 2001 From: Svetlozar Kostadinov Date: Tue, 3 Oct 2017 18:05:30 +0300 Subject: [PATCH 15/15] Infoview horizontal gravity now depend on focus point x --- .../materialintro/view/MaterialIntroView.java | 16 +++++-- .../main/res/layout/material_intro_card.xml | 42 +++++++++---------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java index dd413b8..a48ac8c 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -20,6 +20,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -470,15 +471,24 @@ public void run() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT); + RelativeLayout infoRelativeLayout = ((RelativeLayout) infoView); + if (targetShape.getPoint().x < width / 3) { + infoRelativeLayout.setHorizontalGravity(Gravity.START); + } else if (targetShape.getPoint().x > (2 * width) / 3) { + infoRelativeLayout.setHorizontalGravity(Gravity.END); + } else { + infoRelativeLayout.setHorizontalGravity(Gravity.CENTER_HORIZONTAL); + } + if (targetShape.getPoint().y < height / 2) { - ((RelativeLayout) infoView).setGravity(Gravity.TOP); + ((RelativeLayout) infoView).setVerticalGravity(Gravity.TOP); infoDialogParams.setMargins( 0, targetShape.getPoint().y + targetShape.getHeight() / 2, 0, 0); } else { - ((RelativeLayout) infoView).setGravity(Gravity.BOTTOM); + ((RelativeLayout) infoView).setVerticalGravity(Gravity.BOTTOM); infoDialogParams.setMargins( 0, 0, @@ -494,7 +504,7 @@ public void run() { imageViewIcon.setVisibility(isImageViewEnabled ? VISIBLE : GONE); imageViewIcon.setImageResource(iconDrawableResId); if (iconDrawableResId != Constants.DEFAULT_ICON_DRAWABLE) { - LayoutParams lp = (LayoutParams) imageViewIcon.getLayoutParams(); + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) imageViewIcon.getLayoutParams(); lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; imageViewIcon.setLayoutParams(lp); diff --git a/materialintro/src/main/res/layout/material_intro_card.xml b/materialintro/src/main/res/layout/material_intro_card.xml index 195ae60..2d6d849 100644 --- a/materialintro/src/main/res/layout/material_intro_card.xml +++ b/materialintro/src/main/res/layout/material_intro_card.xml @@ -1,52 +1,52 @@ + app:contentPadding="16dp"> - + android:layout_height="wrap_content"> + android:textColor="@android:color/black" + android:textSize="@dimen/info_text_size" + tools:text="Long long long long long long long long long long long long long long long hint text" /> - +