From 4cc0b65786bda276e1389229f2c0c4e007cbf179 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 17 Apr 2018 14:23:13 +0800 Subject: [PATCH 1/6] update dependencies description --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index b1df11e..6c33f17 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,27 @@ void onNext() 如果还存在没有显示的引导视图,这个方法会继续显示下一张,否则会关闭弹窗 +## 添加依赖 + +1. 在根目录的build.gradle文件中添加jitpack仓库 + + ```groovy + allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } + } + ``` + +2. 添加**GuideView**依赖 + + ```groovy + dependencies { + compile 'com.github.easilycoder:GuideView:0.0.1' + } + ``` + ### 使用示例 ```kotlin From 3a69399179fc482de79bd1db010d9bd19878ba04 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 17 Apr 2018 19:13:41 +0800 Subject: [PATCH 2/6] bugfix:lack of the plugin dependencies --- .idea/caches/build_file_checksums.ser | Bin 580 -> 580 bytes build.gradle | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 4c803d7c23e94d7fac128c8039afa116bde37079..e8461d21a8c6e342135769b65c5f4132bfededb9 100644 GIT binary patch delta 66 zcmV-I0KNaj1jGc8m;}>K`W=y+;t-BH4%-NMVj2G^#r@<%d+L*p0bT=aX=0P_0T&RX YcC2$WiB0%?43eHhsYQ^J=>aVPc=Wj)Z~y=R delta 66 zcmV-I0KNaj1jGc8m;}vWnEH{N;t)Ib3a+*G2OpY673IsP;aVPcp0%BhyVZp diff --git a/build.gradle b/build.gradle index a047347..d6f4812 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,8 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - + // add JitPack dependencies + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } From 677dcf77a9f7b72e634989fcd68a2c6db0d9b57c Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 10 May 2018 18:03:34 +0800 Subject: [PATCH 3/6] update:targetView is clickable when showing guideView --- .idea/caches/build_file_checksums.ser | Bin 580 -> 580 bytes .../easily/tech/guideview/MainActivity.kt | 6 +++ .../easily/tech/guideview/lib/GuideView.java | 48 ++++++++++++++++++ .../tech/guideview/lib/GuideViewBundle.java | 26 ++++++++++ .../tech/guideview/lib/GuideViewFragment.java | 8 +++ 5 files changed, 88 insertions(+) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index e8461d21a8c6e342135769b65c5f4132bfededb9..32a128f173ab2ac86a8ce889de9741602b3d0ef3 100644 GIT binary patch delta 47 zcmV+~0MP%$1jGc8mjz=J|4d<>GFL#aiOlj#91 F0eId36R!XO diff --git a/app/src/main/java/easily/tech/guideview/MainActivity.kt b/app/src/main/java/easily/tech/guideview/MainActivity.kt index f7ff2bc..cdbbd2b 100644 --- a/app/src/main/java/easily/tech/guideview/MainActivity.kt +++ b/app/src/main/java/easily/tech/guideview/MainActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.RelativeLayout +import android.widget.Toast import easily.tech.guideview.lib.GuideViewBundle import easily.tech.guideview.lib.GuideViewBundle.Direction.* import easily.tech.guideview.lib.GuideViewBundle.TransparentOutline.TYPE_OVAL @@ -31,6 +32,10 @@ class MainActivity : AppCompatActivity() { val hintViewRight: View = View.inflate(this, R.layout.guideview_right, null) val hintViewBottom: View = View.inflate(this, R.layout.guideview_bottom, null) + tvContent.setOnClickListener { + Toast.makeText(this, "target view is clicked", Toast.LENGTH_SHORT).show() + } + hintViewLeft.tvLeftNext.setOnClickListener { guideViewFragment.onNext() } @@ -54,6 +59,7 @@ class MainActivity : AppCompatActivity() { .setHintViewMargin(0, -160, 0, 0) .setTransparentSpace(space, space, space, space) .setOutlineType(TYPE_RECT) + .setTargetViewClickable(true) .setHintViewParams(params) .setHintViewDirection(LEFT).build()) .addGuidViewBundle(GuideViewBundle.Builder() diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideView.java b/lib/src/main/java/easily/tech/guideview/lib/GuideView.java index 84b09f8..154c37f 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideView.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideView.java @@ -13,6 +13,7 @@ import android.os.Build; import android.util.DisplayMetrics; import android.view.Gravity; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -37,6 +38,11 @@ @SuppressLint("ViewConstructor") final class GuideView extends RelativeLayout { + interface TargetViewClickListener { + void onGuideViewClicked(); + } + + private boolean hasAddHintView = false; public boolean isShowing = false; private int[] targetViewLocation = new int[2]; @@ -50,6 +56,7 @@ final class GuideView extends RelativeLayout { private Paint transparentPaint; private GuideViewBundle bundle; private FrameLayout decorView; + private TargetViewClickListener targetViewClickListener; GuideView(Context context, GuideViewBundle bundle) { super(context); @@ -63,6 +70,24 @@ final class GuideView extends RelativeLayout { decorView = (FrameLayout) ((Activity) getContext()).getWindow().getDecorView(); } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (bundle.isTargetViewClickAble() && isTouchOnTargetView(ev)) { + // dispatch touch event the the root activity + // make the targetView receive the touch event + if (getContext() instanceof Activity) { + ((Activity) getContext()).dispatchTouchEvent(ev); + } + if (ev.getAction() == MotionEvent.ACTION_UP) { + if (targetViewClickListener != null) { + targetViewClickListener.onGuideViewClicked(); + } + } + return true; + } + return super.dispatchTouchEvent(ev); + } + @Override protected void onDraw(Canvas canvas) { if (bundle == null) { @@ -105,6 +130,25 @@ private void drawBackGround(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, backgroundPaint); } + private boolean isTouchOnTargetView(MotionEvent ev) { + if (bundle == null || bundle.getTargetView() == null) { + return false; + } + int yAxis = (int) ev.getRawY(); + int xAxis = (int) ev.getRawX(); + View targetView = bundle.getTargetView(); + int[] location = new int[2]; + targetView.getLocationOnScreen(location); + int left = location[0]; + int top = location[1]; + int right = left + targetView.getMeasuredWidth(); + int bottom = top + targetView.getMeasuredHeight(); + if (yAxis >= top && yAxis <= bottom && xAxis >= left && xAxis <= right) { + return true; + } + return false; + } + private void addHintView() { if (hasAddHintView || bundle.getHintView() == null) { @@ -163,6 +207,10 @@ private boolean getTargetViewPosition() { return false; } + public void setTargetViewClickListener(TargetViewClickListener targetViewClickListener) { + this.targetViewClickListener = targetViewClickListener; + } + public void show() { if (bundle.getTargetView() == null) { return; diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java b/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java index e544aa5..983dd04 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java @@ -115,6 +115,14 @@ public boolean isDismissOnClicked() { return config.isDismissOnClicked; } + public boolean isTargetViewClickAble() { + return config.isTargetViewClickable; + } + + public boolean isDismissOnTouchInTargetView() { + return config.isDismissOnClickTargetView; + } + public static class Builder { private static int MASK_LAYER_COLOR = 0xd9000000; @@ -138,6 +146,13 @@ public static class Builder { private boolean hasTransparentLayer = true; // whether click the whole screen can dismissed the guideView.If false,you need to handle the click and dismiss event yourself private boolean isDismissOnClicked = true; + + + private boolean isDismissOnClickTargetView=true; + + private boolean isTargetViewClickable; + + private int hintViewDirection; private int outlineType = TYPE_OVAL; @@ -199,6 +214,17 @@ public Builder setMaskColor(int maskColor) { return this; } + public Builder setTargetViewClickable(boolean targetViewClickAble) { + isTargetViewClickable = targetViewClickAble; + return this; + } + + public Builder setDismissOnTouchInTargetView(boolean dismissOnTouchInTargetView) { + isDismissOnClickTargetView = dismissOnTouchInTargetView; + return this; + } + + public GuideViewBundle build() { return new GuideViewBundle(this); } diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java index e927bb5..a7f2e13 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java @@ -103,6 +103,14 @@ private void showGuideView() { } GuideView guideView = new GuideView(getContext(), currentBundle); wrapClickListener(guideView); + guideView.setTargetViewClickListener(new GuideView.TargetViewClickListener() { + @Override + public void onGuideViewClicked() { + if (currentBundle != null && currentBundle.isDismissOnTouchInTargetView()) { + dismiss(); + } + } + }); flContainer.addView(guideView); guideView.show(); currentGuideView = guideView; From 152c63cf8c2d94637b8a9d0e007840b5906ce917 Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 14 May 2018 14:26:16 +0800 Subject: [PATCH 4/6] feature:show guidevew with condition setting;detech the guideView hide event --- .idea/caches/build_file_checksums.ser | Bin 580 -> 580 bytes .../easily/tech/guideview/MainActivity.kt | 4 +++ .../easily/tech/guideview/lib/GuideView.java | 3 ++ .../tech/guideview/lib/GuideViewBundle.java | 30 ++++++++++++++++++ .../tech/guideview/lib/GuideViewFragment.java | 17 ++++++---- 5 files changed, 47 insertions(+), 7 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 32a128f173ab2ac86a8ce889de9741602b3d0ef3..fc6263805dcdc306056ba0d58853ba172c192e86 100644 GIT binary patch delta 46 zcmV+}0MY-%1jGc8m;_D3!>zHLPyqvMX=0P_0T&RXcC2$WiB0%?43eHhsYQ^J=>aVP Ec-1u%l>h($ delta 46 zcmV+}0MY-%1jGc8m;_0C)w{8rPyqvBaB!3F0T&Q!8aVP Ec)e5-egFUf diff --git a/app/src/main/java/easily/tech/guideview/MainActivity.kt b/app/src/main/java/easily/tech/guideview/MainActivity.kt index cdbbd2b..60a8edd 100644 --- a/app/src/main/java/easily/tech/guideview/MainActivity.kt +++ b/app/src/main/java/easily/tech/guideview/MainActivity.kt @@ -56,6 +56,7 @@ class MainActivity : AppCompatActivity() { .setTargetView(tvContent) .setHintView(hintViewLeft) .setDismissOnClicked(false) + .condition(false) .setHintViewMargin(0, -160, 0, 0) .setTransparentSpace(space, space, space, space) .setOutlineType(TYPE_RECT) @@ -68,6 +69,9 @@ class MainActivity : AppCompatActivity() { .setHintView(hintViewTop) .setDismissOnClicked(false) .setHintViewParams(params) + .setGuideViewHideListener { + Toast.makeText(this,"dismissed",Toast.LENGTH_SHORT).show() + } .setHintViewMargin(-dp2px(this, 55f), 0, 0, 0) .setTransparentSpace(space, space, space, space) .setHintViewDirection(TOP) diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideView.java b/lib/src/main/java/easily/tech/guideview/lib/GuideView.java index 154c37f..8188697 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideView.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideView.java @@ -244,5 +244,8 @@ public void hide() { if (getParent() != null && getParent() instanceof ViewGroup) { ((ViewGroup) getParent()).removeView(this); } + if (bundle != null && bundle.getGuideViewHideListener() != null) { + bundle.getGuideViewHideListener().onGuideViewHide(); + } } } diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java b/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java index 983dd04..2d5012c 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideViewBundle.java @@ -36,6 +36,11 @@ public interface Direction { int BOTTOM = 0x0004; } + public interface GuideViewHideListener { + void onGuideViewHide(); + } + + /** * Transparent focus area outline type */ @@ -123,6 +128,14 @@ public boolean isDismissOnTouchInTargetView() { return config.isDismissOnClickTargetView; } + public boolean condition() { + return config.condition; + } + + public GuideViewHideListener getGuideViewHideListener() { + return config.guideViewHideListener; + } + public static class Builder { private static int MASK_LAYER_COLOR = 0xd9000000; @@ -147,6 +160,11 @@ public static class Builder { // whether click the whole screen can dismissed the guideView.If false,you need to handle the click and dismiss event yourself private boolean isDismissOnClicked = true; + // set a condition,whether the added GuideViewBundle can be shown,default is true + private boolean condition = true; + + private GuideViewHideListener guideViewHideListener; + private boolean isDismissOnClickTargetView=true; @@ -225,6 +243,18 @@ public Builder setDismissOnTouchInTargetView(boolean dismissOnTouchInTargetView) } + + public Builder condition(boolean condition) { + this.condition = condition; + return this; + } + + public Builder setGuideViewHideListener(GuideViewHideListener guideViewHideListener) { + this.guideViewHideListener = guideViewHideListener; + return this; + } + + public GuideViewBundle build() { return new GuideViewBundle(this); } diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java index a7f2e13..6f5a00e 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java @@ -91,12 +91,15 @@ private void showGuideView() { flContainer.setBackgroundColor(currentBundle == null ? Color.TRANSPARENT : currentBundle.getMaskColor()); currentGuideView.hide(); } - // if there is no available guideView,just dismiss the whole dialogFragment - if (guideViewBundles == null || guideViewBundles.isEmpty()) { - dismiss(); - return; - } - currentBundle = guideViewBundles.remove(0); + // loop to get the available guideView bundle data + do { + if (guideViewBundles == null || guideViewBundles.isEmpty()) { + currentBundle = null; + } else { + currentBundle = guideViewBundles.remove(0); + } + } while (currentBundle != null && !currentBundle.condition()); + if (currentBundle == null) { dismiss(); return; @@ -107,7 +110,7 @@ private void showGuideView() { @Override public void onGuideViewClicked() { if (currentBundle != null && currentBundle.isDismissOnTouchInTargetView()) { - dismiss(); + onNext(); } } }); From 001f8f079019c2ddb8a407ab5b8ec662567550ae Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 16 May 2018 13:36:51 +0800 Subject: [PATCH 5/6] =?UTF-8?q?bugfix:=E5=B1=8F=E5=B9=95=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=90=8E=E5=AF=BC=E8=87=B4=E8=A7=86=E5=9B=BE=E8=A2=AB=E5=85=B3?= =?UTF-8?q?=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/easily/tech/guideview/lib/GuideViewFragment.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java index 6f5a00e..a5141da 100644 --- a/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java +++ b/lib/src/main/java/easily/tech/guideview/lib/GuideViewFragment.java @@ -30,6 +30,7 @@ public class GuideViewFragment extends DialogFragment { private FrameLayout flContainer; private GuideViewBundle currentBundle; private GuideView currentGuideView; + private boolean isShowing; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -54,7 +55,10 @@ public void onStart() { } window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - showGuideView(); + if (!isShowing){ + isShowing=true; + showGuideView(); + } } public void setGuideViewBundles(List guideViewBundles) { @@ -139,6 +143,7 @@ public void dismiss() { currentBundle = null; currentGuideView = null; } + isShowing=false; super.dismiss(); } } From dc5cffaf10235fe1e4ae9e81b71bbee509a37fa2 Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 16 May 2018 13:52:05 +0800 Subject: [PATCH 6/6] update readme --- .idea/misc.xml | 2 +- README.md | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 99202cc..c0f68ed 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -25,7 +25,7 @@ - + diff --git a/README.md b/README.md index 6c33f17..a6b866f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,29 @@ [![](https://jitpack.io/v/easilycoder/GuideView.svg)](https://jitpack.io/#easilycoder/GuideView) +# FEATURE UPDATE + +* 在显示引导图的情况下,targetView可以设置支持点击。在这种情况下,dialogFragment的事件会被透传到targetView上,触发其原有的点击逻辑; + + ```Java + // 设置targetView是否可以接受点击事件 + GuideViewBundle.Builder#setTargetViewClickable(); + //设置targetView点击之后是否展示下一页的引导视图(如果没有下一页则关闭整个引导视图) + GuideViewBundle.Builder#setDismissOnTouchInTargetView(); + ``` + +* 支持设置GuideView(即每一页的引导视图)关闭的监听; + + ```Java + GuideViewBundle.Builder#setGuideViewHideListener(); + ``` + +* 支持设定显示条件的布尔值,方便链式调用API + + ```java + // 如果传入的condition值为false,那么即使对应的GuideViewBundle被add进GuideViewFragment中也不会被显示 + GuideViewBundle.Builder#condition(condition) + ``` + # GuideView:基于DialogFragment实现