Advertisement
Guest User

Untitled

a guest
Aug 29th, 2019
624
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 22.07 KB | None | 0 0
  1. import android.animation.Animator;
  2. import android.animation.ValueAnimator;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.res.Configuration;
  6. import android.content.res.Resources;
  7. import android.graphics.Canvas;
  8. import android.graphics.Color;
  9. import android.graphics.Paint;
  10. import android.graphics.Point;
  11. import android.graphics.PorterDuff;
  12. import android.graphics.PorterDuffXfermode;
  13. import android.graphics.Rect;
  14. import android.graphics.RectF;
  15. import android.graphics.Typeface;
  16. import android.graphics.Xfermode;
  17. import android.os.Build;
  18. import android.text.Spannable;
  19. import android.view.MotionEvent;
  20. import android.view.View;
  21. import android.view.ViewGroup;
  22. import android.view.ViewTreeObserver;
  23. import android.view.animation.AlphaAnimation;
  24. import android.widget.FrameLayout;
  25.  
  26. import smartdevelop.ir.eram.showcaseviewlib.config.DismissType;
  27. import smartdevelop.ir.eram.showcaseviewlib.config.Gravity;
  28. import smartdevelop.ir.eram.showcaseviewlib.listener.GuideListener;
  29.  
  30. /**
  31.  * Created by Mohammad Reza Eram on 20/01/2018.
  32.  */
  33.  
  34. public class MyGuideView
  35.         extends FrameLayout
  36. {
  37.  
  38.     static final String TAG = "GuideView";
  39.  
  40.     private static final int INDICATOR_HEIGHT = 40;
  41.     private static final int MESSAGE_VIEW_PADDING = 5;
  42.     private static final int SIZE_ANIMATION_DURATION = 700;
  43.     private static final int APPEARING_ANIMATION_DURATION = 400;
  44.     private static final int CIRCLE_INDICATOR_SIZE = 6;
  45.     private static final int LINE_INDICATOR_WIDTH_SIZE = 3;
  46.     private static final int STROKE_CIRCLE_INDICATOR_SIZE = 3;
  47.     private static final int RADIUS_SIZE_TARGET_RECT = 15;
  48.     private static final int MARGIN_INDICATOR = 15;
  49.  
  50.     private static final int BACKGROUND_COLOR = 0x99000000;
  51.     private static final int CIRCLE_INNER_INDICATOR_COLOR = 0xffcccccc;
  52.     private static final int CIRCLE_INDICATOR_COLOR = Color.WHITE;
  53.     private static final int LINE_INDICATOR_COLOR = Color.WHITE;
  54.  
  55.     private final Paint selfPaint = new Paint();
  56.     private final Paint paintLine = new Paint();
  57.     private final Paint paintCircle = new Paint();
  58.     private final Paint paintCircleInner = new Paint();
  59.     private final Paint targetPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  60.     private final Xfermode X_FER_MODE_CLEAR = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
  61.  
  62.     public View target;
  63.     private ViewGroup layout;
  64.     private RectF targetRect;
  65.     private final Rect selfRect = new Rect();
  66.  
  67.     private float density, stopY;
  68.     private boolean isTop;
  69.     private boolean mIsShowing;
  70.     private int yMessageView = 0;
  71.  
  72.     private float startYLineAndCircle;
  73.     private float circleIndicatorSize = 0;
  74.     private float circleIndicatorSizeFinal;
  75.     private float circleInnerIndicatorSize = 0;
  76.     private float lineIndicatorWidthSize;
  77.     private int messageViewPadding;
  78.     private float marginGuide;
  79.     private float strokeCircleWidth;
  80.     private float indicatorHeight;
  81.  
  82.     private boolean isPerformedAnimationSize = false;
  83.  
  84.     private GuideListener mGuideListener;
  85.     private Gravity mGravity;
  86.     private DismissType dismissType;
  87.     private GuideMessageView mMessageView;
  88.  
  89.     public void setLayout(ViewGroup layout)
  90.     {
  91.         this.layout = layout;
  92.     }
  93.  
  94.     private MyGuideView(Context context, View view)
  95.     {
  96.         super(context);
  97.         setWillNotDraw(false);
  98.         setLayerType(View.LAYER_TYPE_HARDWARE, null);
  99.         this.target = view;
  100.         density = context.getResources().getDisplayMetrics().density;
  101.         init();
  102.  
  103.         int[] locationTarget = new int[2];
  104.         target.getLocationOnScreen(locationTarget);
  105.         targetRect = new RectF(locationTarget[0], locationTarget[1], locationTarget[0] + target.getWidth(), locationTarget[1] + target.getHeight());
  106.  
  107.         mMessageView = new GuideMessageView(getContext());
  108.         mMessageView.setPadding(messageViewPadding, messageViewPadding, messageViewPadding, messageViewPadding);
  109.         mMessageView.setColor(Color.WHITE);
  110.  
  111.         addView(mMessageView, new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
  112.  
  113.         setMessageLocation(resolveMessageViewLocation());
  114.  
  115.         ViewTreeObserver.OnGlobalLayoutListener layoutListener = new ViewTreeObserver.OnGlobalLayoutListener()
  116.         {
  117.             @Override
  118.             public void onGlobalLayout()
  119.             {
  120.                 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN)
  121.                 {
  122.                     getViewTreeObserver().removeOnGlobalLayoutListener(this);
  123.                 }
  124.                 else
  125.                 {
  126.                     getViewTreeObserver().removeGlobalOnLayoutListener(this);
  127.                 }
  128.  
  129.                 setMessageLocation(resolveMessageViewLocation());
  130.                 int[] locationTarget = new int[2];
  131.                 target.getLocationOnScreen(locationTarget);
  132.  
  133.                 targetRect = new RectF(locationTarget[0], locationTarget[1], locationTarget[0] + target.getWidth(), locationTarget[1] + target.getHeight());
  134.  
  135.                 selfRect.set(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom());
  136.  
  137.                 marginGuide = (int) (isTop ? marginGuide : -marginGuide);
  138.                 startYLineAndCircle = (isTop ? targetRect.bottom : targetRect.top) + marginGuide;
  139.                 stopY = yMessageView + indicatorHeight;
  140.                 startAnimationSize();
  141.                 getViewTreeObserver().addOnGlobalLayoutListener(this);
  142.             }
  143.         };
  144.         getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
  145.     }
  146.  
  147.     private void startAnimationSize()
  148.     {
  149.         if (!isPerformedAnimationSize)
  150.         {
  151.             final ValueAnimator circleSizeAnimator = ValueAnimator.ofFloat(0f, circleIndicatorSizeFinal);
  152.             circleSizeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
  153.             {
  154.                 @Override
  155.                 public void onAnimationUpdate(ValueAnimator valueAnimator)
  156.                 {
  157.                     circleIndicatorSize = (float) circleSizeAnimator.getAnimatedValue();
  158.                     circleInnerIndicatorSize = (float) circleSizeAnimator.getAnimatedValue() - density;
  159.                     postInvalidate();
  160.                 }
  161.             });
  162.  
  163.             final ValueAnimator linePositionAnimator = ValueAnimator.ofFloat(stopY, startYLineAndCircle);
  164.             linePositionAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
  165.             {
  166.                 @Override
  167.                 public void onAnimationUpdate(ValueAnimator valueAnimator)
  168.                 {
  169.                     startYLineAndCircle = (float) linePositionAnimator.getAnimatedValue();
  170.                     postInvalidate();
  171.                 }
  172.             });
  173.  
  174.             linePositionAnimator.setDuration(SIZE_ANIMATION_DURATION);
  175.             linePositionAnimator.start();
  176.             linePositionAnimator.addListener(new Animator.AnimatorListener()
  177.             {
  178.                 @Override
  179.                 public void onAnimationStart(Animator animator)
  180.                 {
  181.  
  182.                 }
  183.  
  184.                 @Override
  185.                 public void onAnimationEnd(Animator animator)
  186.                 {
  187.                     circleSizeAnimator.setDuration(SIZE_ANIMATION_DURATION);
  188.                     circleSizeAnimator.start();
  189.                     isPerformedAnimationSize = true;
  190.                 }
  191.  
  192.                 @Override
  193.                 public void onAnimationCancel(Animator animator)
  194.                 {
  195.  
  196.                 }
  197.  
  198.                 @Override
  199.                 public void onAnimationRepeat(Animator animator)
  200.                 {
  201.  
  202.                 }
  203.             });
  204.         }
  205.     }
  206.  
  207.     private void init()
  208.     {
  209.         lineIndicatorWidthSize = LINE_INDICATOR_WIDTH_SIZE * density;
  210.         marginGuide = MARGIN_INDICATOR * density;
  211.         indicatorHeight = INDICATOR_HEIGHT * density;
  212.         messageViewPadding = (int) (MESSAGE_VIEW_PADDING * density);
  213.         strokeCircleWidth = STROKE_CIRCLE_INDICATOR_SIZE * density;
  214.         circleIndicatorSizeFinal = CIRCLE_INDICATOR_SIZE * density;
  215.     }
  216.  
  217.     private int getNavigationBarSize()
  218.     {
  219.         Resources resources = getContext().getResources();
  220.         int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
  221.         if (resourceId > 0)
  222.         {
  223.             return resources.getDimensionPixelSize(resourceId);
  224.         }
  225.         return 0;
  226.     }
  227.  
  228.     private boolean isLandscape()
  229.     {
  230.         int display_mode = getResources().getConfiguration().orientation;
  231.         return display_mode != Configuration.ORIENTATION_PORTRAIT;
  232.     }
  233.  
  234.     @Override
  235.     protected void onDraw(final Canvas canvas)
  236.     {
  237.         super.onDraw(canvas);
  238.         if (target != null)
  239.         {
  240.  
  241.             selfPaint.setColor(BACKGROUND_COLOR);
  242.             selfPaint.setStyle(Paint.Style.FILL);
  243.             selfPaint.setAntiAlias(true);
  244.             canvas.drawRect(selfRect, selfPaint);
  245.  
  246.             paintLine.setStyle(Paint.Style.FILL);
  247.             paintLine.setColor(LINE_INDICATOR_COLOR);
  248.             paintLine.setStrokeWidth(lineIndicatorWidthSize);
  249.             paintLine.setAntiAlias(true);
  250.  
  251.             paintCircle.setStyle(Paint.Style.STROKE);
  252.             paintCircle.setColor(CIRCLE_INDICATOR_COLOR);
  253.             paintCircle.setStrokeCap(Paint.Cap.ROUND);
  254.             paintCircle.setStrokeWidth(strokeCircleWidth);
  255.             paintCircle.setAntiAlias(true);
  256.  
  257.             paintCircleInner.setStyle(Paint.Style.FILL);
  258.             paintCircleInner.setColor(CIRCLE_INNER_INDICATOR_COLOR);
  259.             paintCircleInner.setAntiAlias(true);
  260.  
  261.             final float x = (targetRect.left / 2 + targetRect.right / 2);
  262.             canvas.drawLine(x, startYLineAndCircle, x, stopY, paintLine);
  263.  
  264.             canvas.drawCircle(x, startYLineAndCircle, circleIndicatorSize, paintCircle);
  265.             canvas.drawCircle(x, startYLineAndCircle, circleInnerIndicatorSize, paintCircleInner);
  266.  
  267.             targetPaint.setXfermode(X_FER_MODE_CLEAR);
  268.             targetPaint.setAntiAlias(true);
  269.  
  270.             canvas.drawRoundRect(targetRect, RADIUS_SIZE_TARGET_RECT, RADIUS_SIZE_TARGET_RECT, targetPaint);
  271.         }
  272.     }
  273.  
  274.     public boolean isShowing()
  275.     {
  276.         return mIsShowing;
  277.     }
  278.  
  279.     public void dismiss()
  280.     {
  281.         layout.removeView(this);
  282.         mIsShowing = false;
  283.         if (mGuideListener != null)
  284.         {
  285.             mGuideListener.onDismiss(target);
  286.         }
  287.     }
  288.  
  289.     @Override
  290.     public boolean onTouchEvent(MotionEvent event)
  291.     {
  292.         float x = event.getX();
  293.         float y = event.getY();
  294.  
  295.         if (event.getAction() == MotionEvent.ACTION_DOWN)
  296.         {
  297.             switch (dismissType)
  298.             {
  299.  
  300.                 case outside:
  301.                     if (!isViewContains(mMessageView, x, y))
  302.                     {
  303.                         dismiss();
  304.                     }
  305.                     break;
  306.  
  307.                 case anywhere:
  308.                     dismiss();
  309.                     break;
  310.  
  311.                 case targetView:
  312.                     if (targetRect.contains(x, y))
  313.                     {
  314.                         target.performClick();
  315.                         dismiss();
  316.                     }
  317.                     break;
  318.             }
  319.             return true;
  320.         }
  321.         return false;
  322.     }
  323.  
  324.     private boolean isViewContains(View view, float rx, float ry)
  325.     {
  326.         int[] location = new int[2];
  327.         view.getLocationOnScreen(location);
  328.         int x = location[0];
  329.         int y = location[1];
  330.         int w = view.getWidth();
  331.         int h = view.getHeight();
  332.  
  333.         return !(rx < x || rx > x + w || ry < y || ry > y + h);
  334.     }
  335.  
  336.     private void setMessageLocation(Point p)
  337.     {
  338.         mMessageView.setX(p.x);
  339.         mMessageView.setY(p.y);
  340.         postInvalidate();
  341.     }
  342.  
  343.     public void updateGuideViewLocation()
  344.     {
  345.         requestLayout();
  346.     }
  347.  
  348.     private Point resolveMessageViewLocation()
  349.     {
  350.  
  351.         int xMessageView = 0;
  352.         if (mGravity == Gravity.center)
  353.         {
  354.             xMessageView = (int) (targetRect.left - mMessageView.getWidth() / 2 + target.getWidth() / 2);
  355.         }
  356.         else
  357.         {
  358.             xMessageView = (int) (targetRect.right) - mMessageView.getWidth();
  359.         }
  360.  
  361.         if (isLandscape())
  362.         {
  363.             xMessageView -= getNavigationBarSize();
  364.         }
  365.  
  366.         if (xMessageView + mMessageView.getWidth() > getWidth())
  367.         {
  368.             xMessageView = getWidth() - mMessageView.getWidth();
  369.         }
  370.         if (xMessageView < 0)
  371.         {
  372.             xMessageView = 0;
  373.         }
  374.  
  375.         //set message view bottom
  376.         if (targetRect.top + (indicatorHeight) > getHeight() / 2)
  377.         {
  378.             isTop = false;
  379.             yMessageView = (int) (targetRect.top - mMessageView.getHeight() - indicatorHeight);
  380.         }
  381.         //set message view top
  382.         else
  383.         {
  384.             isTop = true;
  385.             yMessageView = (int) (targetRect.top + target.getHeight() + indicatorHeight);
  386.         }
  387.  
  388.         if (yMessageView < 0)
  389.         {
  390.             yMessageView = 0;
  391.         }
  392.  
  393.         return new Point(xMessageView, yMessageView);
  394.     }
  395.  
  396.     public void show()
  397.     {
  398.         this.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  399.         this.setClickable(false);
  400.         bringToFront();
  401.         layout.addView(this);
  402.         AlphaAnimation startAnimation = new AlphaAnimation(0.0f, 1.0f);
  403.         startAnimation.setDuration(APPEARING_ANIMATION_DURATION);
  404.         startAnimation.setFillAfter(true);
  405.         this.startAnimation(startAnimation);
  406.         mIsShowing = true;
  407.     }
  408.  
  409.     public void setTitle(String str)
  410.     {
  411.         mMessageView.setTitle(str);
  412.     }
  413.  
  414.     public void setContentText(String str)
  415.     {
  416.         mMessageView.setContentText(str);
  417.     }
  418.  
  419.     public void setContentSpan(Spannable span)
  420.     {
  421.         mMessageView.setContentSpan(span);
  422.     }
  423.  
  424.     public void setTitleTypeFace(Typeface typeFace)
  425.     {
  426.         mMessageView.setTitleTypeFace(typeFace);
  427.     }
  428.  
  429.     public void setContentTypeFace(Typeface typeFace)
  430.     {
  431.         mMessageView.setContentTypeFace(typeFace);
  432.     }
  433.  
  434.     public void setTitleTextSize(int size)
  435.     {
  436.         mMessageView.setTitleTextSize(size);
  437.     }
  438.  
  439.     public void setContentTextSize(int size)
  440.     {
  441.         mMessageView.setContentTextSize(size);
  442.     }
  443.  
  444.     public static class Builder
  445.     {
  446.         private View targetView;
  447.         private String title, contentText;
  448.         private Gravity gravity;
  449.         private DismissType dismissType;
  450.         private Context context;
  451.         private Spannable contentSpan;
  452.         private Typeface titleTypeFace, contentTypeFace;
  453.         private GuideListener guideListener;
  454.         private int titleTextSize;
  455.         private int contentTextSize;
  456.         private float lineIndicatorHeight;
  457.         private float lineIndicatorWidthSize;
  458.         private float circleIndicatorSize;
  459.         private float circleInnerIndicatorSize;
  460.         private float strokeCircleWidth;
  461.  
  462.         public Builder(Context context)
  463.         {
  464.             this.context = context;
  465.         }
  466.  
  467.         public Builder setTargetView(View view)
  468.         {
  469.             this.targetView = view;
  470.             return this;
  471.         }
  472.  
  473.         /**
  474.          * gravity GuideView
  475.          *
  476.          * @param gravity it should be one type of Gravity enum.
  477.          **/
  478.         public Builder setGravity(Gravity gravity)
  479.         {
  480.             this.gravity = gravity;
  481.             return this;
  482.         }
  483.  
  484.         /**
  485.          * defining a title
  486.          *
  487.          * @param title a title. for example: submit button.
  488.          **/
  489.         public Builder setTitle(String title)
  490.         {
  491.             this.title = title;
  492.             return this;
  493.         }
  494.  
  495.         /**
  496.          * defining a description for the target view
  497.          *
  498.          * @param contentText a description. for example: this button can for submit your information..
  499.          **/
  500.         public Builder setContentText(String contentText)
  501.         {
  502.             this.contentText = contentText;
  503.             return this;
  504.         }
  505.  
  506.         /**
  507.          * setting spannable type
  508.          *
  509.          * @param span a instance of spannable
  510.          **/
  511.         public Builder setContentSpan(Spannable span)
  512.         {
  513.             this.contentSpan = span;
  514.             return this;
  515.         }
  516.  
  517.         /**
  518.          * setting font type face
  519.          *
  520.          * @param typeFace a instance of type face (font family)
  521.          **/
  522.         public Builder setContentTypeFace(Typeface typeFace)
  523.         {
  524.             this.contentTypeFace = typeFace;
  525.             return this;
  526.         }
  527.  
  528.         /**
  529.          * adding a listener on show case view
  530.          *
  531.          * @param guideListener a listener for events
  532.          **/
  533.         public Builder setGuideListener(GuideListener guideListener)
  534.         {
  535.             this.guideListener = guideListener;
  536.             return this;
  537.         }
  538.  
  539.         /**
  540.          * setting font type face
  541.          *
  542.          * @param typeFace a instance of type face (font family)
  543.          **/
  544.         public Builder setTitleTypeFace(Typeface typeFace)
  545.         {
  546.             this.titleTypeFace = typeFace;
  547.             return this;
  548.         }
  549.  
  550.         /**
  551.          * the defined text size overrides any defined size in the default or provided style
  552.          *
  553.          * @param size title text by sp unit
  554.          * @return builder
  555.          */
  556.         public Builder setContentTextSize(int size)
  557.         {
  558.             this.contentTextSize = size;
  559.             return this;
  560.         }
  561.  
  562.         /**
  563.          * the defined text size overrides any defined size in the default or provided style
  564.          *
  565.          * @param size title text by sp unit
  566.          * @return builder
  567.          */
  568.         public Builder setTitleTextSize(int size)
  569.         {
  570.             this.titleTextSize = size;
  571.             return this;
  572.         }
  573.  
  574.         /**
  575.          * this method defining the type of dismissing function
  576.          *
  577.          * @param dismissType should be one type of DismissType enum. for example: outside -> Dismissing with click on outside of MessageView
  578.          */
  579.         public Builder setDismissType(DismissType dismissType)
  580.         {
  581.             this.dismissType = dismissType;
  582.             return this;
  583.         }
  584.  
  585.         /**
  586.          * changing line height indicator
  587.          *
  588.          * @param height you can change height indicator (Converting to Dp)
  589.          */
  590.         public Builder setIndicatorHeight(float height)
  591.         {
  592.             this.lineIndicatorHeight = height;
  593.             return this;
  594.         }
  595.  
  596.         /**
  597.          * changing line width indicator
  598.          *
  599.          * @param width you can change width indicator
  600.          */
  601.         public Builder setIndicatorWidthSize(float width)
  602.         {
  603.             this.lineIndicatorWidthSize = width;
  604.             return this;
  605.         }
  606.  
  607.         /**
  608.          * changing circle size indicator
  609.          *
  610.          * @param size you can change circle size indicator
  611.          */
  612.         public Builder setCircleIndicatorSize(float size)
  613.         {
  614.             this.circleIndicatorSize = size;
  615.             return this;
  616.         }
  617.  
  618.         /**
  619.          * changing inner circle size indicator
  620.          *
  621.          * @param size you can change inner circle indicator size
  622.          */
  623.         public Builder setCircleInnerIndicatorSize(float size)
  624.         {
  625.             this.circleInnerIndicatorSize = size;
  626.             return this;
  627.         }
  628.  
  629.         /**
  630.          * changing stroke circle size indicator
  631.          *
  632.          * @param size you can change stroke circle indicator size
  633.          */
  634.         public Builder setCircleStrokeIndicatorSize(float size)
  635.         {
  636.             this.strokeCircleWidth = size;
  637.             return this;
  638.         }
  639.  
  640.         public MyGuideView build()
  641.         {
  642.             MyGuideView guideView = new MyGuideView(context, targetView);
  643.             guideView.mGravity = gravity != null ? gravity : Gravity.auto;
  644.             guideView.dismissType = dismissType != null ? dismissType : DismissType.targetView;
  645.             float density = context.getResources().getDisplayMetrics().density;
  646.  
  647.             guideView.setTitle(title);
  648.             if (contentText != null)
  649.             {
  650.                 guideView.setContentText(contentText);
  651.             }
  652.             if (titleTextSize != 0)
  653.             {
  654.                 guideView.setTitleTextSize(titleTextSize);
  655.             }
  656.             if (contentTextSize != 0)
  657.             {
  658.                 guideView.setContentTextSize(contentTextSize);
  659.             }
  660.             if (contentSpan != null)
  661.             {
  662.                 guideView.setContentSpan(contentSpan);
  663.             }
  664.             if (titleTypeFace != null)
  665.             {
  666.                 guideView.setTitleTypeFace(titleTypeFace);
  667.             }
  668.             if (contentTypeFace != null)
  669.             {
  670.                 guideView.setContentTypeFace(contentTypeFace);
  671.             }
  672.             if (guideListener != null)
  673.             {
  674.                 guideView.mGuideListener = guideListener;
  675.             }
  676.             if (lineIndicatorHeight != 0)
  677.             {
  678.                 guideView.indicatorHeight = lineIndicatorHeight * density;
  679.             }
  680.             if (lineIndicatorWidthSize != 0)
  681.             {
  682.                 guideView.lineIndicatorWidthSize = lineIndicatorWidthSize * density;
  683.             }
  684.             if (circleIndicatorSize != 0)
  685.             {
  686.                 guideView.circleIndicatorSize = circleIndicatorSize * density;
  687.             }
  688.             if (circleInnerIndicatorSize != 0)
  689.             {
  690.                 guideView.circleInnerIndicatorSize = circleInnerIndicatorSize * density;
  691.             }
  692.             if (strokeCircleWidth != 0)
  693.             {
  694.                 guideView.strokeCircleWidth = strokeCircleWidth * density;
  695.             }
  696.  
  697.             return guideView;
  698.         }
  699.     }
  700. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement