diff --git a/build.gradle b/build.gradle index 37358fa..3c1b2fd 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.3.3' } } @@ -16,3 +16,5 @@ allprojects { task wrapper(type: Wrapper) { gradleVersion = '2.4' } + + diff --git a/example/build.gradle b/example/build.gradle index 1404573..aab0e75 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 22 - buildToolsVersion "22.0.1" + buildToolsVersion "25.0.3" defaultConfig { applicationId "com.venmo.view.tooltip.example" diff --git a/example/src/androidTest/java/com/venmo/view/tooltip/example/ApplicationTest.java b/example/src/androidTest/java/com/venmo/view/tooltip/example/ApplicationTest.java deleted file mode 100644 index 75b44b2..0000000 --- a/example/src/androidTest/java/com/venmo/view/tooltip/example/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.venmo.view.tooltip.example; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/example/src/main/res/layout/activity_tooltip.xml b/example/src/main/res/layout/activity_tooltip.xml index 1397d0f..44d9d34 100644 --- a/example/src/main/res/layout/activity_tooltip.xml +++ b/example/src/main/res/layout/activity_tooltip.xml @@ -20,7 +20,7 @@ android:gravity="center_horizontal" android:text="Don't get it?" app:tooltipColor="#66009900" - app:anchoredView="@id/header_1" /> + app:arrowLocation="3"/> + app:arrowHeight="40dp" + app:arrowAlignment="center"/> + app:arrowWidth="10dp" + app:arrowHeight="10dp" + app:arrowLocation="1"/> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbdaf69..2082840 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.4-all.zip + + diff --git a/library/build.gradle b/library/build.gradle index f5e4e49..4088664 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 22 - buildToolsVersion "22.0.1" + buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 14 @@ -29,4 +29,5 @@ android.libraryVariants.all { variant -> } } -apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' \ No newline at end of file +apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle' + diff --git a/library/src/main/java/com/venmo/view/ArrowAlignmentHelper.java b/library/src/main/java/com/venmo/view/ArrowAlignmentHelper.java index 3068577..5389b40 100644 --- a/library/src/main/java/com/venmo/view/ArrowAlignmentHelper.java +++ b/library/src/main/java/com/venmo/view/ArrowAlignmentHelper.java @@ -5,31 +5,37 @@ public final class ArrowAlignmentHelper { - public static float calculateArrowMidPoint(TooltipView view, RectF rectF) { + public static float calculateArrowMidPoint(TooltipView view, RectF rectF, boolean isHorizontal) { int offset = view.getAlignmentOffset(); float middle = 0f; + float length = isHorizontal ? rectF.width() : rectF.height(); switch (view.getArrowAlignment()) { case START: - middle = offset == 0 ? rectF.width() / 4 : offset; + middle = offset == 0 ? length / 4 : offset; break; case CENTER: - middle = rectF.width() / 2; + middle = length / 2; if (offset > 0) throw new IllegalArgumentException( "Offsets are not support when the tooltip arrow is anchored in the middle of the view."); break; case END: - middle = rectF.width(); - middle -= (offset == 0 ? rectF.width() / 4 : offset); + middle = length; + middle -= (offset == 0 ? length / 4 : offset); break; case ANCHORED_VIEW: - middle = rectF.width() / 2; + middle = length / 2; if (view.getAnchoredViewId() != View.NO_ID) { View anchoredView = ((View) view.getParent()) .findViewById(view.getAnchoredViewId()); - middle += anchoredView.getX() + anchoredView.getWidth() / 2 - view.getX() - - view.getWidth() / 2; + if (isHorizontal) { + middle += anchoredView.getX() + anchoredView.getWidth() / 2 - view.getX() + - view.getWidth() / 2; + } else { + middle += anchoredView.getY() + anchoredView.getHeight() / 2 - view.getY() + - view.getHeight() / 2; + } } break; } diff --git a/library/src/main/java/com/venmo/view/BottomArrowLocation.java b/library/src/main/java/com/venmo/view/BottomArrowLocation.java index 6b89756..7521831 100644 --- a/library/src/main/java/com/venmo/view/BottomArrowLocation.java +++ b/library/src/main/java/com/venmo/view/BottomArrowLocation.java @@ -4,7 +4,6 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; -import android.view.View; import static android.graphics.Path.Direction; @@ -18,7 +17,7 @@ public void configureDraw(TooltipView view, Canvas canvas) { view.getTooltipPath() .addRoundRect(rectF, view.getCornerRadius(), view.getCornerRadius(), Direction.CW); - float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF); + float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF,true); view.getTooltipPath().moveTo(middle, view.getHeight()); int arrowDx = view.getArrowWidth() / 2; diff --git a/library/src/main/java/com/venmo/view/LeftArrowLocation.java b/library/src/main/java/com/venmo/view/LeftArrowLocation.java new file mode 100644 index 0000000..d1743ce --- /dev/null +++ b/library/src/main/java/com/venmo/view/LeftArrowLocation.java @@ -0,0 +1,37 @@ +package com.venmo.view; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +import static android.graphics.Path.Direction; + +class LeftArrowLocation implements ArrowLocation { + + @Override + public void configureDraw(TooltipView view, Canvas canvas) { + Path tooltipPath = new Path(); + view.setTooltipPath(tooltipPath); + RectF rectF = new RectF(canvas.getClipBounds()); + rectF.left += view.getArrowHeight(); + + rectF.top += 1; + rectF.bottom -= 1; + rectF.left += 1; + rectF.right -= 1; + + tooltipPath.addRoundRect(rectF, view.getCornerRadius(), view.getCornerRadius(), Direction.CW); + + float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF, false); + tooltipPath.moveTo(0f, middle); + int arrowDy = view.getArrowWidth() / 2; + tooltipPath.lineTo(rectF.left, middle - arrowDy); + tooltipPath.lineTo(rectF.left, middle + arrowDy); + tooltipPath.close(); + + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setColor(view.getTooltipColor()); + view.setPaint(paint); + } +} diff --git a/library/src/main/java/com/venmo/view/RightArrowLocation.java b/library/src/main/java/com/venmo/view/RightArrowLocation.java new file mode 100644 index 0000000..6ef92c5 --- /dev/null +++ b/library/src/main/java/com/venmo/view/RightArrowLocation.java @@ -0,0 +1,37 @@ +package com.venmo.view; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +import static android.graphics.Path.Direction; + +class RightArrowLocation implements ArrowLocation { + + @Override + public void configureDraw(TooltipView view, Canvas canvas) { + Path tooltipPath = new Path(); + view.setTooltipPath(tooltipPath); + RectF rectF = new RectF(canvas.getClipBounds()); + rectF.right -= view.getArrowHeight(); + + rectF.top += 1; + rectF.bottom -= 1; + rectF.left += 1; + rectF.right -= 1; + + tooltipPath.addRoundRect(rectF, view.getCornerRadius(), view.getCornerRadius(), Direction.CW); + + float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF, false); + tooltipPath.moveTo(view.getWidth(), middle); + int arrowDy = view.getArrowWidth() / 2; + tooltipPath.lineTo(rectF.right, middle - arrowDy); + tooltipPath.lineTo(rectF.right, middle + arrowDy); + tooltipPath.close(); + + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setColor(view.getTooltipColor()); + view.setPaint(paint); + } +} diff --git a/library/src/main/java/com/venmo/view/TooltipView.java b/library/src/main/java/com/venmo/view/TooltipView.java index 506dfe2..d13d368 100644 --- a/library/src/main/java/com/venmo/view/TooltipView.java +++ b/library/src/main/java/com/venmo/view/TooltipView.java @@ -22,14 +22,19 @@ public class TooltipView extends TextView { private int arrowHeight; private int arrowWidth; private int cornerRadius; - private @IdRes int anchoredViewId; - private @ColorRes int tooltipColor; + private + @IdRes + int anchoredViewId; + private + @ColorRes + int tooltipColor; private ArrowLocation arrowLocation; private ArrowAlignment arrowAlignment; private int alignmentOffset; private int arrowPositioning; private Paint paint; private Path tooltipPath; + public static final int LEFT = 1, TOP = 2, RIGHT = 3, BOTTOM = 4; public TooltipView(Context context) { super(context); @@ -61,8 +66,20 @@ private void init(AttributeSet attrs, int defStyle) { R.dimen.tooltip_default_arrow_width); arrowPositioning = a.getInteger(R.styleable.TooltipView_arrowLocation, res.getInteger(R.integer.tooltip_default_arrow_location)); - arrowLocation = arrowPositioning == 0 ? new TopArrowLocation() - : new BottomArrowLocation(); + switch (arrowPositioning) { + case LEFT: + arrowLocation = new LeftArrowLocation(); + break; + case TOP: + arrowLocation = new TopArrowLocation(); + break; + case RIGHT: + arrowLocation = new RightArrowLocation(); + break; + case BOTTOM: + arrowLocation = new BottomArrowLocation(); + break; + } arrowAlignment = ArrowAlignment.getAlignment( a.getInteger(R.styleable.TooltipView_arrowAlignment, res.getInteger( R.integer.tooltip_default_arrow_alignment))); @@ -76,7 +93,18 @@ private void init(AttributeSet attrs, int defStyle) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + arrowHeight); + int widthOffset = 0, heightOffset = 0; + switch (arrowPositioning) { + case TOP: + case BOTTOM: + heightOffset = arrowHeight; + break; + case LEFT: + case RIGHT: + widthOffset = arrowHeight; + break; + } + setMeasuredDimension(getMeasuredWidth()+widthOffset, getMeasuredHeight() + heightOffset); } @Override @@ -200,7 +228,7 @@ public void setAlignmentOffsetResource(@DimenRes int resId) { } private int getDimension(TypedArray a, @StyleableRes int styleableId, - @DimenRes int defaultDimension) { + @DimenRes int defaultDimension) { int result = a.getDimensionPixelSize(styleableId, NOT_PRESENT); if (result == NOT_PRESENT) { result = getResources().getDimensionPixelSize(defaultDimension); diff --git a/library/src/main/java/com/venmo/view/TopArrowLocation.java b/library/src/main/java/com/venmo/view/TopArrowLocation.java index 7e07e82..ba7f01a 100644 --- a/library/src/main/java/com/venmo/view/TopArrowLocation.java +++ b/library/src/main/java/com/venmo/view/TopArrowLocation.java @@ -4,7 +4,6 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; -import android.view.View; import static android.graphics.Path.Direction; @@ -12,20 +11,21 @@ class TopArrowLocation implements ArrowLocation { @Override public void configureDraw(TooltipView view, Canvas canvas) { - view.setTooltipPath(new Path()); + Path tooltipPath = new Path(); + view.setTooltipPath(tooltipPath); RectF rectF = new RectF(canvas.getClipBounds()); rectF.top += view.getArrowHeight(); - view.getTooltipPath().addRoundRect(rectF, view.getCornerRadius(), view.getCornerRadius(), + tooltipPath.addRoundRect(rectF, view.getCornerRadius(), view.getCornerRadius(), Direction.CW); - float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF); + float middle = ArrowAlignmentHelper.calculateArrowMidPoint(view, rectF,true); - view.getTooltipPath().moveTo(middle, 0f); + tooltipPath.moveTo(middle, 0f); int arrowDx = view.getArrowWidth() / 2; - view.getTooltipPath().lineTo(middle - arrowDx, rectF.top); - view.getTooltipPath().lineTo(middle + arrowDx, rectF.top); - view.getTooltipPath().close(); + tooltipPath.lineTo(middle - arrowDx, rectF.top); + tooltipPath.lineTo(middle + arrowDx, rectF.top); + tooltipPath.close(); view.setPaint(new Paint(Paint.ANTI_ALIAS_FLAG)); view.getTooltipPaint().setColor(view.getTooltipColor()); diff --git a/library/src/main/res/values/dimens.xml b/library/src/main/res/values/dimens.xml index 899ba52..7d2536a 100644 --- a/library/src/main/res/values/dimens.xml +++ b/library/src/main/res/values/dimens.xml @@ -3,6 +3,6 @@ 16dp 4dp 0dp - 1 + 2 3 \ No newline at end of file