From 06a6d4df3ceea1206e1189c1cb7d264144c6092e Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 12:37:49 -0400 Subject: [PATCH 1/8] Set dismiss to public --- .../java/co/mobiwise/materialintro/view/MaterialIntroView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fa8008b..6a9c4c3 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -416,7 +416,7 @@ public void onAnimationStart() { /** * Dismiss Material Intro View */ - private void dismiss() { + public void dismiss() { preferencesManager.setDisplayed(materialIntroViewId); AnimationFactory.animateFadeOut(this, fadeAnimationDuration, new AnimationListener.OnAnimationEndListener() { @Override From 51f393a6562c63e0658aeb42ebf3c5c16a2a05a6 Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 12:49:06 -0400 Subject: [PATCH 2/8] Idempotent property --- .../materialintro/view/MaterialIntroView.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 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 fa8008b..1657e6c 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -12,7 +12,6 @@ import android.os.Build; import android.os.Handler; import android.util.AttributeSet; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; @@ -24,19 +23,19 @@ import android.widget.RelativeLayout; import android.widget.TextView; +import co.mobiwise.materialintro.MaterialIntroConfiguration; +import co.mobiwise.materialintro.R; import co.mobiwise.materialintro.animation.AnimationFactory; import co.mobiwise.materialintro.animation.AnimationListener; import co.mobiwise.materialintro.animation.MaterialIntroListener; import co.mobiwise.materialintro.prefs.PreferencesManager; -import co.mobiwise.materialintro.utils.Constants; -import co.mobiwise.materialintro.MaterialIntroConfiguration; -import co.mobiwise.materialintro.R; -import co.mobiwise.materialintro.utils.Utils; import co.mobiwise.materialintro.shape.Circle; import co.mobiwise.materialintro.shape.Focus; import co.mobiwise.materialintro.shape.FocusGravity; import co.mobiwise.materialintro.target.Target; import co.mobiwise.materialintro.target.ViewTarget; +import co.mobiwise.materialintro.utils.Constants; +import co.mobiwise.materialintro.utils.Utils; /** * Created by mertsimsek on 22/01/16. @@ -203,6 +202,11 @@ public class MaterialIntroView extends RelativeLayout { */ private boolean isPerformClick; + /** + * Disallow this MaterialIntroView from showing up more than once at a time + */ + private boolean isIdempotent; + public MaterialIntroView(Context context) { super(context); init(context); @@ -246,6 +250,7 @@ private void init(Context context) { isDotViewEnabled = false; isPerformClick = false; isImageViewEnabled = true; + isIdempotent = false; /** * initialize objects @@ -409,15 +414,21 @@ public void onAnimationStart() { else setVisibility(VISIBLE); } - },delayMillis); + }, delayMillis); + if(isIdempotent) { + preferencesManager.setDisplayed(materialIntroViewId); + } } /** * Dismiss Material Intro View */ private void dismiss() { - preferencesManager.setDisplayed(materialIntroViewId); + if(!isIdempotent) { + preferencesManager.setDisplayed(materialIntroViewId); + } + AnimationFactory.animateFadeOut(this, fadeAnimationDuration, new AnimationListener.OnAnimationEndListener() { @Override public void onAnimationEnd() { @@ -577,6 +588,10 @@ private void enableImageViewIcon(boolean isImageViewEnabled){ this.isImageViewEnabled = isImageViewEnabled; } + private void setIdempotent(boolean idempotent){ + this.isIdempotent = idempotent; + } + private void enableDotView(boolean isDotViewEnabled){ this.isDotViewEnabled = isDotViewEnabled; } @@ -695,6 +710,11 @@ public Builder enableIcon(boolean isImageViewIconEnabled) { return this; } + public Builder setIdempotent(boolean idempotent) { + materialIntroView.setIdempotent(idempotent); + return this; + } + public Builder setConfiguration(MaterialIntroConfiguration configuration) { materialIntroView.setConfiguration(configuration); return this; From 6338baafeb13739b1b66756bf00f6621fd9f9375 Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 13:22:12 -0400 Subject: [PATCH 3/8] Allow rectangle shapes --- .../mobiwise/materialintro/shape/Circle.java | 52 ++++--------- .../co/mobiwise/materialintro/shape/Rect.java | 70 ++++++++++++++++++ .../mobiwise/materialintro/shape/Shape.java | 60 +++++++++++++++ .../materialintro/shape/ShapeType.java | 8 ++ .../materialintro/view/MaterialIntroView.java | 73 +++++++++++++------ .../sample/fragment/MainFragment.java | 2 + 6 files changed, 206 insertions(+), 59 deletions(-) create mode 100644 materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java create mode 100644 materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java create mode 100644 materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java 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 f6125d7..4acd31f 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java @@ -4,62 +4,31 @@ import android.graphics.Paint; import android.graphics.Point; -import co.mobiwise.materialintro.utils.Constants; import co.mobiwise.materialintro.target.Target; /** * Created by mertsimsek on 25/01/16. */ -public class Circle { - - private Target target; - - private Focus focus; - - private FocusGravity focusGravity; +public class Circle extends Shape { private int radius; private Point circlePoint; - private int padding; - - public Circle(Target target) { - this(target, Focus.MINIMUM); - } - - public Circle(Target target,Focus focus) { - this(target, focus, FocusGravity.CENTER, Constants.DEFAULT_TARGET_PADDING); - } - public Circle(Target target, Focus focus, FocusGravity focusGravity, int padding) { - this.target = target; - this.focus = focus; - this.focusGravity = focusGravity; - this.padding = padding; + super(target, focus, focusGravity, padding); circlePoint = getFocusPoint(); calculateRadius(padding); } + @Override public void draw(Canvas canvas, Paint eraser, int padding){ calculateRadius(padding); circlePoint = getFocusPoint(); canvas.drawCircle(circlePoint.x, circlePoint.y, radius, eraser); } - private Point getFocusPoint(){ - if(focusGravity == FocusGravity.LEFT){ - int xLeft = target.getRect().left + (target.getPoint().x - target.getRect().left) / 2; - return new Point(xLeft, target.getPoint().y); - } - 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(); - } - + @Override public void reCalculateAll(){ calculateRadius(padding); circlePoint = getFocusPoint(); @@ -81,12 +50,23 @@ else if(focus == Focus.ALL) radius = side + padding; } - public int getRadius(){ + private int getRadius(){ return radius; } + @Override public Point getPoint(){ return circlePoint; } + @Override + public int getHeight() { + return getRadius(); + } + + @Override + public boolean isTouchOnFocus(double dx, double dy) { + return (dx + dy) <= Math.pow(radius, 2); + } + } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java new file mode 100644 index 0000000..dbbcc85 --- /dev/null +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java @@ -0,0 +1,70 @@ +package co.mobiwise.materialintro.shape; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.RectF; + +import co.mobiwise.materialintro.target.Target; + +/** + * Created by mertsimsek on 25/01/16. + */ +public class Rect extends Shape { + + RectF adjustedRect; + + public Rect(Target target) { + super(target); + calculateAdjustedRect(); + } + + public Rect(Target target, Focus focus) { + super(target, focus); + calculateAdjustedRect(); + } + + public Rect(Target target, Focus focus, FocusGravity focusGravity, int padding) { + super(target, focus, focusGravity, padding); + calculateAdjustedRect(); + } + + @Override + public void draw(Canvas canvas, Paint eraser, int padding) { + canvas.drawRoundRect(adjustedRect, padding, padding, eraser); + } + + private void calculateAdjustedRect() { + RectF rect = new RectF(); + rect.set(target.getRect()); + + rect.left -= padding; + rect.top -= padding; + rect.right += padding; + rect.bottom += padding; + + adjustedRect = rect; + } + + @Override + public void reCalculateAll(){ + calculateAdjustedRect(); + } + + @Override + public Point getPoint(){ + return target.getPoint(); + } + + @Override + public int getHeight() { + return (int) adjustedRect.height(); + } + + @Override + public boolean isTouchOnFocus(double dx, double dy) { + //TODO fix this + return true; + } + +} diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java new file mode 100644 index 0000000..0b42557 --- /dev/null +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java @@ -0,0 +1,60 @@ +package co.mobiwise.materialintro.shape; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Point; + +import co.mobiwise.materialintro.target.Target; +import co.mobiwise.materialintro.utils.Constants; + +/** + * Created by yuchen on 3/17/16. + */ +public abstract class Shape { + + protected Target target; + + protected Focus focus; + + protected FocusGravity focusGravity; + + protected int padding; + + public Shape(Target target) { + this(target, Focus.MINIMUM); + } + + public Shape(Target target,Focus focus) { + this(target, focus, FocusGravity.CENTER, Constants.DEFAULT_TARGET_PADDING); + } + + public Shape(Target target, Focus focus, FocusGravity focusGravity, int padding) { + this.target = target; + this.focus = focus; + this.focusGravity = focusGravity; + this.padding = padding; + } + + public abstract void draw(Canvas canvas, Paint eraser, int padding); + + protected Point getFocusPoint(){ + if(focusGravity == FocusGravity.LEFT){ + int xLeft = target.getRect().left + (target.getPoint().x - target.getRect().left) / 2; + return new Point(xLeft, target.getPoint().y); + } + 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(); + } + + public abstract void reCalculateAll(); + + public abstract Point getPoint(); + + public abstract int getHeight(); + + public abstract boolean isTouchOnFocus(double dx, double dy); +} diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java new file mode 100644 index 0000000..fe9657d --- /dev/null +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java @@ -0,0 +1,8 @@ +package co.mobiwise.materialintro.shape; + +/** + * Created by yuchen on 3/17/16. + */ +public enum ShapeType { + CIRCLE, RECTANGLE +} 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 5334933..0af7e3f 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -32,6 +32,9 @@ import co.mobiwise.materialintro.shape.Circle; import co.mobiwise.materialintro.shape.Focus; import co.mobiwise.materialintro.shape.FocusGravity; +import co.mobiwise.materialintro.shape.Rect; +import co.mobiwise.materialintro.shape.Shape; +import co.mobiwise.materialintro.shape.ShapeType; import co.mobiwise.materialintro.target.Target; import co.mobiwise.materialintro.target.ViewTarget; import co.mobiwise.materialintro.utils.Constants; @@ -73,10 +76,10 @@ public class MaterialIntroView extends RelativeLayout { private long fadeAnimationDuration; /** - * circleShape focus on target + * targetShape focus on target * and clear circle to focus */ - private Circle circleShape; + private Shape targetShape; /** * Focus Type @@ -207,6 +210,11 @@ public class MaterialIntroView extends RelativeLayout { */ private boolean isIdempotent; + /** + * Shape of target + */ + private ShapeType shapeType; + public MaterialIntroView(Context context) { super(context); init(context); @@ -242,6 +250,7 @@ private void init(Context context) { colorTextViewInfo = Constants.DEFAULT_COLOR_TEXTVIEW_INFO; focusType = Focus.ALL; focusGravity = FocusGravity.CENTER; + shapeType = ShapeType.CIRCLE; isReady = false; isFadeAnimationEnabled = true; dismissOnTouch = false; @@ -277,8 +286,8 @@ private void init(Context context) { getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { - circleShape.reCalculateAll(); - if (circleShape != null && circleShape.getPoint().y != 0 && !isLayoutCompleted) { + targetShape.reCalculateAll(); + if (targetShape != null && targetShape.getPoint().y != 0 && !isLayoutCompleted) { if (isInfoEnabled) setInfoLayout(); if(isDotViewEnabled) @@ -329,7 +338,7 @@ protected void onDraw(Canvas canvas) { /** * Clear focus area */ - circleShape.draw(this.canvas, eraser, padding); + targetShape.draw(this.canvas, eraser, padding); canvas.drawBitmap(bitmap, 0, 0, null); } @@ -346,15 +355,13 @@ public boolean onTouchEvent(MotionEvent event) { float xT = event.getX(); float yT = event.getY(); - int xV = circleShape.getPoint().x; - int yV = circleShape.getPoint().y; - - int radius = circleShape.getRadius(); + int xV = targetShape.getPoint().x; + int yV = targetShape.getPoint().y; double dx = Math.pow(xT - xV, 2); double dy = Math.pow(yT - yV, 2); - boolean isTouchOnFocus = (dx + dy) <= Math.pow(radius, 2); + boolean isTouchOnFocus = targetShape.isTouchOnFocus(dx, dy); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: @@ -466,11 +473,11 @@ public void run() { ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT); - if (circleShape.getPoint().y < height / 2) { + if (targetShape.getPoint().y < height / 2) { ((RelativeLayout) infoView).setGravity(Gravity.TOP); infoDialogParams.setMargins( 0, - circleShape.getPoint().y + circleShape.getRadius(), + targetShape.getPoint().y + targetShape.getHeight(), 0, 0); } else { @@ -479,7 +486,7 @@ public void run() { 0, 0, 0, - height - (circleShape.getPoint().y + circleShape.getRadius()) + 2 * circleShape.getRadius()); + height - (targetShape.getPoint().y + targetShape.getHeight()) + 2 * targetShape.getHeight()); } infoView.setLayoutParams(infoDialogParams); @@ -509,8 +516,8 @@ public void run() { dotViewLayoutParams.height = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); dotViewLayoutParams.width = Utils.dpToPx(Constants.DEFAULT_DOT_SIZE); dotViewLayoutParams.setMargins( - circleShape.getPoint().x - (dotViewLayoutParams.width / 2), - circleShape.getPoint().y - (dotViewLayoutParams.height / 2), + targetShape.getPoint().x - (dotViewLayoutParams.width / 2), + targetShape.getPoint().y - (dotViewLayoutParams.height / 2), 0, 0); dotView.setLayoutParams(dotViewLayoutParams); @@ -539,6 +546,10 @@ private void enableFadeAnimation(boolean isFadeAnimationEnabled) { this.isFadeAnimationEnabled = isFadeAnimationEnabled; } + private void setShapeType(ShapeType shape) { + this.shapeType = shape; + } + private void setReady(boolean isReady) { this.isReady = isReady; } @@ -551,8 +562,8 @@ private void setFocusType(Focus focusType) { this.focusType = focusType; } - private void setCircle(Circle circleShape) { - this.circleShape = circleShape; + private void setShape(Shape shape) { + this.targetShape = shape; } private void setPadding(int padding) { @@ -654,6 +665,11 @@ public Builder enableFadeAnimation(boolean isFadeAnimationEnabled) { return this; } + public Builder setShape(ShapeType shape) { + materialIntroView.setShapeType(shape); + return this; + } + public Builder setFocusType(Focus focusType) { materialIntroView.setFocusType(focusType); return this; @@ -731,12 +747,23 @@ public Builder performClick(boolean isPerformClick){ } public MaterialIntroView build() { - Circle circle = new Circle( - materialIntroView.targetView, - materialIntroView.focusType, - materialIntroView.focusGravity, - materialIntroView.padding); - materialIntroView.setCircle(circle); + Shape shape; + + if(materialIntroView.shapeType == ShapeType.CIRCLE) { + shape = new Circle( + materialIntroView.targetView, + materialIntroView.focusType, + materialIntroView.focusGravity, + materialIntroView.padding); + } else { + shape = new Rect( + materialIntroView.targetView, + materialIntroView.focusType, + materialIntroView.focusGravity, + materialIntroView.padding); + } + + materialIntroView.setShape(shape); return materialIntroView; } 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 9255f13..3d829cd 100644 --- a/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java +++ b/sample/src/main/java/co/mobiwise/sample/fragment/MainFragment.java @@ -12,6 +12,7 @@ import co.mobiwise.materialintro.prefs.PreferencesManager; import co.mobiwise.materialintro.shape.Focus; import co.mobiwise.materialintro.shape.FocusGravity; +import co.mobiwise.materialintro.shape.ShapeType; import co.mobiwise.materialintro.view.MaterialIntroView; import co.mobiwise.sample.R; @@ -58,6 +59,7 @@ private void showIntro(View view, String usageId, String text){ .performClick(true) .setInfoText(text) .setTarget(view) + .setShape(ShapeType.RECTANGLE) .setUsageId(usageId) //THIS SHOULD BE UNIQUE ID .show(); } From c720d7292bf22e1d1ba937501f534590ffcaf4ff Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 14:42:25 -0400 Subject: [PATCH 4/8] Allow the use of custom shapes --- .../mobiwise/materialintro/shape/Circle.java | 7 +++++- .../co/mobiwise/materialintro/shape/Rect.java | 5 ++-- .../mobiwise/materialintro/shape/Shape.java | 8 ++++++- .../materialintro/shape/ShapeType.java | 3 +++ .../materialintro/view/MaterialIntroView.java | 24 +++++++++++++------ 5 files changed, 35 insertions(+), 12 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 4acd31f..382ffdc 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java @@ -65,7 +65,12 @@ public int getHeight() { } @Override - public boolean isTouchOnFocus(double dx, double dy) { + public boolean isTouchOnFocus(double x, double y) { + int xV = getPoint().x; + int yV = getPoint().y; + + double dx = Math.pow(x - xV, 2); + double dy = Math.pow(y - yV, 2); return (dx + dy) <= Math.pow(radius, 2); } 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 dbbcc85..9854f0d 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Rect.java @@ -62,9 +62,8 @@ public int getHeight() { } @Override - public boolean isTouchOnFocus(double dx, double dy) { - //TODO fix this - return true; + public boolean isTouchOnFocus(double x, double y) { + return adjustedRect.contains((float) x, (float) y); } } 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 0b42557..37c742d 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Shape.java @@ -56,5 +56,11 @@ else if(focusGravity == FocusGravity.RIGHT){ public abstract int getHeight(); - public abstract boolean isTouchOnFocus(double dx, double dy); + /** + * Determines if a click is on the shape + * @param x x-axis location of click + * @param y y-axis location of click + * @return true if click is inside shape + */ + public abstract boolean isTouchOnFocus(double x, double t); } diff --git a/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java b/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java index fe9657d..67b3971 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/ShapeType.java @@ -4,5 +4,8 @@ * Created by yuchen on 3/17/16. */ public enum ShapeType { + /** + * Allows the target area to be highlighted by either a circle or rectangle + */ CIRCLE, RECTANGLE } 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 0af7e3f..a5a903a 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -215,6 +215,11 @@ public class MaterialIntroView extends RelativeLayout { */ private ShapeType shapeType; + /** + * Use custom shape + */ + private boolean usesCustomShape = false; + public MaterialIntroView(Context context) { super(context); init(context); @@ -355,13 +360,7 @@ public boolean onTouchEvent(MotionEvent event) { float xT = event.getX(); float yT = event.getY(); - int xV = targetShape.getPoint().x; - int yV = targetShape.getPoint().y; - - double dx = Math.pow(xT - xV, 2); - double dy = Math.pow(yT - yV, 2); - - boolean isTouchOnFocus = targetShape.isTouchOnFocus(dx, dy); + boolean isTouchOnFocus = targetShape.isTouchOnFocus(xT, yT); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: @@ -741,12 +740,23 @@ public Builder setListener(MaterialIntroListener materialIntroListener) { return this; } + public Builder setCustomShape(Shape shape) { + materialIntroView.usesCustomShape = true; + materialIntroView.setShape(shape); + return this; + } + public Builder performClick(boolean isPerformClick){ materialIntroView.setPerformClick(isPerformClick); return this; } public MaterialIntroView build() { + if(materialIntroView.usesCustomShape) { + return materialIntroView; + } + + // no custom shape supplied, build our own Shape shape; if(materialIntroView.shapeType == ShapeType.CIRCLE) { From 075cfe26e4e88a388fbee641b7568238b7c91757 Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 14:53:19 -0400 Subject: [PATCH 5/8] Update readme with new features --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index 11e26ae..4925494 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ new MaterialIntroView.Builder(this) .enableFadeAnimation(true) .performClick(true) .setInfoText("Hi There! Click this card and see what happens.") + .setShapeType(ShapeType.CIRCLE) .setTarget(view) .setUsageId("intro_card") //THIS SHOULD BE UNIQUE ID .show(); @@ -79,6 +80,18 @@ dependencies { .setInfoTextSize(30) //Change text size ``` ```java +.setShapeType(ShapeType.CIRCLE) //Change shape of focus area +.setShapeType(ShapeType.RECTANGLE) //Change shape of focus area +``` +```java +.setCustomShape(Shape shape) //Use custom shape +``` +```java +// Allow this showcase overlay to only show up once. Prevents multiple screens from showing at the same time. +// Useful if you wish to show a tour step in a code that gets called multiple times +.setIdempotent(true) +``` +```java .setUsageId("intro_fab_button") //Store intro view status whether it is learnt or not ``` ```java @@ -112,6 +125,19 @@ config.setFadeAnimationEnabled(true); .setConfiguration(config) // ``` +# Use Custom Shapes +You can use your own highlight shapes if Circle and Rectangle do not work for you. See source for `Circle` and `Rect` for implementation example. +```java +public class MyShape extends Shape { + // ... your implementation +} + +//... in your app code + +.setCustomShape(MyShape shape) + +``` + # Demos From f7725da35d403374f0f219ae736fe27d55da3a0a Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 14:56:27 -0400 Subject: [PATCH 6/8] add art for rectangle --- README.md | 1 + art/art_rectangle.png | Bin 0 -> 63561 bytes 2 files changed, 1 insertion(+) create mode 100644 art/art_rectangle.png diff --git a/README.md b/README.md index 4925494..b6790a1 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ public class MyShape extends Shape { + # TODO * [ ] Sample app will be more detailed about using library. diff --git a/art/art_rectangle.png b/art/art_rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..a06aeffa25a65ea8e0d31727167799696d6452db GIT binary patch literal 63561 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

F)5CD(OORCj9Yc{1y{>@cV1Xu<<| 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

7^yidG`^AG)^W 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 KQ}fy^`2PSDYB5a! literal 0 HcmV?d00001 From e5f3d215a320d5395059451a79b0062830ced5f8 Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 15:00:04 -0400 Subject: [PATCH 7/8] Better readme picture syntax Uses relative paths --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b6790a1..93d8c8f 100644 --- a/README.md +++ b/README.md @@ -139,12 +139,11 @@ public class MyShape extends Shape { ``` # Demos - - - - - - +![Alt text](/art/art_drawer.png?raw=true) +![Alt text](/art/art_focus_all.png?raw=true) +![Alt text](/art/art_focus_normal.png?raw=true) +![Alt text](/art/art_gravity_left.png?raw=true) +![Alt text](/art/art_rectangle.png?raw=true) # TODO * [ ] Sample app will be more detailed about using library. From c53b70975c17bd9841c9e8ddd15f4772c28791e3 Mon Sep 17 00:00:00 2001 From: Yu Chen Hou Date: Thu, 17 Mar 2016 17:54:46 -0400 Subject: [PATCH 8/8] Fix improper calculation of height --- .../src/main/java/co/mobiwise/materialintro/shape/Circle.java | 2 +- .../co/mobiwise/materialintro/view/MaterialIntroView.java | 4 ++-- 2 files changed, 3 insertions(+), 3 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 382ffdc..6620074 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/shape/Circle.java @@ -61,7 +61,7 @@ public Point getPoint(){ @Override public int getHeight() { - return getRadius(); + return 2 * getRadius(); } @Override 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 a5a903a..5462327 100644 --- a/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java +++ b/materialintro/src/main/java/co/mobiwise/materialintro/view/MaterialIntroView.java @@ -476,7 +476,7 @@ public void run() { ((RelativeLayout) infoView).setGravity(Gravity.TOP); infoDialogParams.setMargins( 0, - targetShape.getPoint().y + targetShape.getHeight(), + targetShape.getPoint().y + targetShape.getHeight() / 2, 0, 0); } else { @@ -485,7 +485,7 @@ public void run() { 0, 0, 0, - height - (targetShape.getPoint().y + targetShape.getHeight()) + 2 * targetShape.getHeight()); + height - (targetShape.getPoint().y + targetShape.getHeight() / 2) + 2 * targetShape.getHeight() / 2); } infoView.setLayoutParams(infoDialogParams);