diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 4c803d7..fc62638 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ 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 b1df11e..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实现 @@ -79,6 +103,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 diff --git a/app/src/main/java/easily/tech/guideview/MainActivity.kt b/app/src/main/java/easily/tech/guideview/MainActivity.kt index f7ff2bc..60a8edd 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() } @@ -51,9 +56,11 @@ class MainActivity : AppCompatActivity() { .setTargetView(tvContent) .setHintView(hintViewLeft) .setDismissOnClicked(false) + .condition(false) .setHintViewMargin(0, -160, 0, 0) .setTransparentSpace(space, space, space, space) .setOutlineType(TYPE_RECT) + .setTargetViewClickable(true) .setHintViewParams(params) .setHintViewDirection(LEFT).build()) .addGuidViewBundle(GuideViewBundle.Builder() @@ -62,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/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 } 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..8188697 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; @@ -196,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 e544aa5..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 */ @@ -115,6 +120,22 @@ public boolean isDismissOnClicked() { return config.isDismissOnClicked; } + public boolean isTargetViewClickAble() { + return config.isTargetViewClickable; + } + + 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; @@ -138,6 +159,18 @@ 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; + + // set a condition,whether the added GuideViewBundle can be shown,default is true + private boolean condition = true; + + private GuideViewHideListener guideViewHideListener; + + + private boolean isDismissOnClickTargetView=true; + + private boolean isTargetViewClickable; + + private int hintViewDirection; private int outlineType = TYPE_OVAL; @@ -199,6 +232,29 @@ 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 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 e927bb5..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) { @@ -91,18 +95,29 @@ 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; } GuideView guideView = new GuideView(getContext(), currentBundle); wrapClickListener(guideView); + guideView.setTargetViewClickListener(new GuideView.TargetViewClickListener() { + @Override + public void onGuideViewClicked() { + if (currentBundle != null && currentBundle.isDismissOnTouchInTargetView()) { + onNext(); + } + } + }); flContainer.addView(guideView); guideView.show(); currentGuideView = guideView; @@ -128,6 +143,7 @@ public void dismiss() { currentBundle = null; currentGuideView = null; } + isShowing=false; super.dismiss(); } }