From bb48623396520e2cba27bcd72e73322fd04c1c37 Mon Sep 17 00:00:00 2001 From: George Date: Sun, 27 Jun 2021 11:42:27 +0800 Subject: [PATCH] [FIX]simplify the onclick in the top view curtain --- .../curtain/sample/SimpleGuideActivity.java | 35 ++++--------------- .../main/java/com/qw/curtain/lib/Curtain.java | 20 +++++++++-- .../qw/curtain/lib/GuideDialogFragment.java | 18 +++++++++- .../main/java/com/qw/curtain/lib/IGuide.java | 22 ++++++++++++ .../curtain/lib/OnViewInTopClickListener.java | 15 ++++++++ 5 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 curtain/src/main/java/com/qw/curtain/lib/OnViewInTopClickListener.java diff --git a/app/src/main/java/com/qw/curtain/sample/SimpleGuideActivity.java b/app/src/main/java/com/qw/curtain/sample/SimpleGuideActivity.java index dc1280d..5ffea2f 100644 --- a/app/src/main/java/com/qw/curtain/sample/SimpleGuideActivity.java +++ b/app/src/main/java/com/qw/curtain/sample/SimpleGuideActivity.java @@ -11,6 +11,7 @@ import com.qw.curtain.lib.Curtain; import com.qw.curtain.lib.IGuide; +import com.qw.curtain.lib.OnViewInTopClickListener; import com.qw.curtain.lib.Padding; import com.qw.curtain.lib.shape.RoundShape; @@ -60,21 +61,10 @@ private void showInitGuide() { .withPadding(findViewById(R.id.btn_shape_custom), Padding.all(10)) .setTopView(R.layout.view_guide_1) // .setNoCurtainAnimation(true) - .setCallBack(new Curtain.CallBack() { + .addOnTopViewClickListener(R.id.tv_i_know, new OnViewInTopClickListener() { @Override - public void onShow(final IGuide iGuide) { - iGuide.findViewByIdInTopView(R.id.tv_i_know) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - iGuide.dismissGuide(); - } - }); - } - - @Override - public void onDismiss(IGuide iGuide) { - showThirdGuide(); + public void onClick(View current, IGuide currentHost) { + currentHost.dismissGuide(); } }).show(); } @@ -84,21 +74,10 @@ private void showThirdGuide() { new Curtain(SimpleGuideActivity.this) .with(findViewById(R.id.btn_open_left)) .setTopView(R.layout.view_guide_2) - .setCallBack(new Curtain.CallBack() { + .addOnTopViewClickListener(R.id.tv_i_know, new OnViewInTopClickListener() { @Override - public void onShow(final IGuide iGuide) { - iGuide.findViewByIdInTopView(R.id.tv_i_know) - .setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - iGuide.dismissGuide(); - } - }); - } - - @Override - public void onDismiss(IGuide iGuide) { - + public void onClick(View current, IGuide currentHost) { + currentHost.dismissGuide(); } }).show(); } diff --git a/curtain/src/main/java/com/qw/curtain/lib/Curtain.java b/curtain/src/main/java/com/qw/curtain/lib/Curtain.java index 06c65c7..962cafc 100644 --- a/curtain/src/main/java/com/qw/curtain/lib/Curtain.java +++ b/curtain/src/main/java/com/qw/curtain/lib/Curtain.java @@ -6,6 +6,7 @@ import android.view.View; import androidx.annotation.ColorRes; +import androidx.annotation.IdRes; import androidx.annotation.LayoutRes; import androidx.annotation.MainThread; import androidx.annotation.NonNull; @@ -115,11 +116,24 @@ public Curtain withShape(@NonNull View which, Shape shape) { } /** - * set the embellish view of the curtain + * set the describe view of the curtain */ public Curtain setTopView(@LayoutRes int layoutId) { this.buildParams.topLayoutRes = layoutId; return this; + + } + + /** + * set the onClick in the top view + * this method base on setTopView + * @param viewId the view in top view + * @param onClickListener the onClickListener + * @see #setTopView(int) + */ + public Curtain addOnTopViewClickListener(@IdRes int viewId, OnViewInTopClickListener onClickListener) { + this.buildParams.topViewOnClickListeners.append(viewId, onClickListener); + return this; } /** @@ -230,6 +244,8 @@ public static class Param { int animationStyle = Constance.STATE_NOT_SET; + SparseArray topViewOnClickListeners = new SparseArray<>(); + } public interface CallBack { @@ -237,7 +253,7 @@ public interface CallBack { /** * call when show success */ - void onShow(IGuide iGuide); + void onShow(IGuide curtain); /** * call when dismiss diff --git a/curtain/src/main/java/com/qw/curtain/lib/GuideDialogFragment.java b/curtain/src/main/java/com/qw/curtain/lib/GuideDialogFragment.java index 296a306..9837db5 100644 --- a/curtain/src/main/java/com/qw/curtain/lib/GuideDialogFragment.java +++ b/curtain/src/main/java/com/qw/curtain/lib/GuideDialogFragment.java @@ -51,7 +51,6 @@ public static GuideDialogFragment newInstance(Curtain.Param param) { } guideView.setHollowInfo(tobeDraw); guider.setGuideView(guideView); - return guider; } @@ -184,6 +183,23 @@ private void updateTopView() { contentView.removeViewAt(1); } LayoutInflater.from(contentView.getContext()).inflate(topLayoutRes, contentView, true); + //on top view click listeners + SparseArray listeners = param.topViewOnClickListeners; + int onClickListenersSize = listeners.size(); + for (int i = 0; i < onClickListenersSize; i++) { + int idRes = listeners.keyAt(i); + final OnViewInTopClickListener listener = listeners.valueAt(i); + View view = contentView.findViewById(idRes); + if (null == view) { + throw new NullPointerException("the target view was not find in the top view, check your setTopView layout res first"); + } + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + listener.onClick(v, GuideDialogFragment.this); + } + }); + } } } diff --git a/curtain/src/main/java/com/qw/curtain/lib/IGuide.java b/curtain/src/main/java/com/qw/curtain/lib/IGuide.java index 50d2890..52f0706 100644 --- a/curtain/src/main/java/com/qw/curtain/lib/IGuide.java +++ b/curtain/src/main/java/com/qw/curtain/lib/IGuide.java @@ -10,12 +10,34 @@ */ public interface IGuide { + /** + * you can refresh the hollow fields when it showed + * + * @param hollows the hollow fields + */ void updateHollows(HollowInfo... hollows); + /** + * you can refresh the top view + * + * @param layoutId the view res + */ void updateTopView(@LayoutRes int layoutId); + /** + * if you want do more operate in top view (onClickListener or onTouchListener) + * you can find it by this method + * if you just need an onclick listener in top view you can use Curtain.addOnTopViewClickListener instead + * + * @param id + * @param + * @see #Curtain.addOnTopViewClickListener() + */ T findViewByIdInTopView(@IdRes int id); + /** + * dismiss the curtain + */ void dismissGuide(); } diff --git a/curtain/src/main/java/com/qw/curtain/lib/OnViewInTopClickListener.java b/curtain/src/main/java/com/qw/curtain/lib/OnViewInTopClickListener.java new file mode 100644 index 0000000..5e76f21 --- /dev/null +++ b/curtain/src/main/java/com/qw/curtain/lib/OnViewInTopClickListener.java @@ -0,0 +1,15 @@ +package com.qw.curtain.lib; + +import android.view.View; + +public interface OnViewInTopClickListener { + + /** + * the onclick listener of view in the top + * + * @param current the clicked view + * @param currentHost the host curtain or curtainFlow + */ + void onClick(View current, T currentHost); + +}