GuideView的封装实现app功能引导页
本文实例为大家分享了GuideView的封装实现app功能引导页的具体代码,供大家参考,具体内容如下
packageoschina.comxianbing100.yindao; importandroid.app.Activity; importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.Canvas; importandroid.graphics.Paint; importandroid.graphics.PorterDuff; importandroid.graphics.PorterDuffXfermode; importandroid.graphics.RectF; importandroid.os.Build; importandroid.support.annotation.RequiresApi; importandroid.util.Log; importandroid.view.Gravity; importandroid.view.View; importandroid.view.ViewGroup; importandroid.view.ViewTreeObserver; importandroid.widget.FrameLayout; importandroid.widget.RelativeLayout; importjava.util.List; /** *author:Majunbao *date:2019/3/416:32 *description:App第一次打开功能蒙版引导 */ publicclassGuideViewextendsRelativeLayoutimplementsViewTreeObserver.OnGlobalLayoutListener{ privatefinalStringTAG=getClass().getSimpleName(); privateContextmContent; privateListmViews; privatebooleanfirst=true; /** *targetView前缀。SHOW_GUIDE_PREFIX+targetView.getId()作为保存在SP文件的key。 */ privatestaticfinalStringSHOW_GUIDE_PREFIX="show_guide_on_view_"; /** *GuideView偏移量 */ privateintoffsetX,offsetY; /** *targetView的外切圆半径 */ privateintradius; /** *需要显示提示信息的View */ privateViewtargetView; /** *自定义View */ privateViewcustomGuideView; /** *透明圆形画笔 */ privatePaintmCirclePaint; /** *背景色画笔 */ privatePaintmBackgroundPaint; /** *targetView是否已测量 */ privatebooleanisMeasured; /** *targetView圆心 */ privateint[]center; /** *绘图层叠模式 */ privatePorterDuffXfermodeporterDuffXfermode; /** *绘制前景bitmap */ privateBitmapbitmap; /** *背景色和透明度,格式#aarrggbb */ privateintbackgroundColor; /** *Canvas,绘制bitmap */ privateCanvastemp; /** *相对于targetView的位置.在target的那个方向 */ privateDirectiondirection; /** *形状 */ privateMyShapemyShape; /** *targetView左上角坐标 */ privateint[]location; privatebooleanonClickExit; privateOnClickCallbackonclickListener; privateRelativeLayoutguideViewLayout; publicvoidrestoreState(){ Log.v(TAG,"restoreState"); offsetX=offsetY=0; radius=0; mCirclePaint=null; mBackgroundPaint=null; isMeasured=false; center=null; porterDuffXfermode=null; bitmap=null; needDraw=true; //backgroundColor=Color.parseColor("#00000000"); temp=null; //direction=null; } publicint[]getLocation(){ returnlocation; } publicvoidsetLocation(int[]location){ this.location=location; } publicGuideView(Contextcontext){ super(context); this.mContent=context; init(); } publicintgetRadius(){ returnradius; } publicvoidsetRadius(intradius){ this.radius=radius; } publicvoidsetOffsetX(intoffsetX){ this.offsetX=offsetX; } publicvoidsetOffsetY(intoffsetY){ this.offsetY=offsetY; } publicvoidsetDirection(Directiondirection){ this.direction=direction; } publicvoidsetShape(MyShapeshape){ this.myShape=shape; } publicvoidsetCustomGuideView(ViewcustomGuideView){ this.customGuideView=customGuideView; if(!first){ restoreState(); } } publicvoidsetBgColor(intbackground_color){ this.backgroundColor=background_color; } publicViewgetTargetView(){ returntargetView; } publicvoidsetTargetView(ViewtargetView){ this.targetView=targetView; //restoreState(); if(!first){ //guideViewLayout.removeAllViews(); } } privatevoidinit(){ } publicvoidshowOnce(){ if(targetView!=null){ mContent.getSharedPreferences(TAG,Context.MODE_PRIVATE).edit().putBoolean(generateUniqId(targetView),true).commit(); } } privatebooleanhasShown(){ if(targetView==null) returntrue; returnmContent.getSharedPreferences(TAG,Context.MODE_PRIVATE).getBoolean(generateUniqId(targetView),false); } privateStringgenerateUniqId(Viewv){ returnSHOW_GUIDE_PREFIX+v.getId(); } publicint[]getCenter(){ returncenter; } publicvoidsetCenter(int[]center){ this.center=center; } @RequiresApi(api=Build.VERSION_CODES.JELLY_BEAN) publicvoidhide(){ Log.v(TAG,"hide"); if(customGuideView!=null){ targetView.getViewTreeObserver().removeOnGlobalLayoutListener(this); this.removeAllViews(); ((FrameLayout)((Activity)mContent).getWindow().getDecorView()).removeView(this); restoreState(); } } publicvoidshow(){ Log.v(TAG,"show"); if(hasShown()) return; if(targetView!=null){ targetView.getViewTreeObserver().addOnGlobalLayoutListener(this); } this.setBackgroundResource(R.color.transparent); ((FrameLayout)((Activity)mContent).getWindow().getDecorView()).addView(this); first=false; } /** *添加提示文字,位置在targetView的下边 *在屏幕窗口,添加蒙层,蒙层绘制总背景和透明圆形,圆形下边绘制说明文字 */ privatevoidcreateGuideView(){ Log.v(TAG,"createGuideView"); //添加到蒙层 //if(guideViewLayout==null){ //guideViewLayout=newRelativeLayout(mContent); //} //Tips布局参数 LayoutParamsguideViewParams; guideViewParams=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); guideViewParams.setMargins(0,center[1]+radius+10,0,0); if(customGuideView!=null){ //LayoutParamsguideViewParams=newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); if(direction!=null){ intwidth=this.getWidth(); intheight=this.getHeight(); intleft=center[0]-radius; intright=center[0]+radius; inttop=center[1]-radius; intbottom=center[1]+radius; switch(direction){ caseTOP: this.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL); guideViewParams.setMargins(offsetX,offsetY-height+top,-offsetX,height-top-offsetY); break; caseLEFT: this.setGravity(Gravity.RIGHT); guideViewParams.setMargins(offsetX-width+left,top+offsetY,width-left-offsetX,-top-offsetY); break; caseBOTTOM: this.setGravity(Gravity.CENTER_HORIZONTAL); guideViewParams.setMargins(offsetX,bottom+offsetY,-offsetX,-bottom-offsetY); break; caseRIGHT: guideViewParams.setMargins(right+offsetX,top+offsetY,-right-offsetX,-top-offsetY); break; caseLEFT_TOP: this.setGravity(Gravity.RIGHT|Gravity.BOTTOM); guideViewParams.setMargins(offsetX-width+left,offsetY-height+top,width-left-offsetX,height-top-offsetY); break; caseLEFT_BOTTOM: this.setGravity(Gravity.RIGHT); guideViewParams.setMargins(offsetX-width+left,bottom+offsetY,width-left-offsetX,-bottom-offsetY); break; caseRIGHT_TOP: this.setGravity(Gravity.BOTTOM); guideViewParams.setMargins(right+offsetX,offsetY-height+top,-right-offsetX,height-top-offsetY); break; caseRIGHT_BOTTOM: guideViewParams.setMargins(right+offsetX,bottom+offsetY,-right-offsetX,-top-offsetY); break; } }else{ guideViewParams=newLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); guideViewParams.setMargins(offsetX,offsetY,-offsetX,-offsetY); } //guideViewLayout.addView(customGuideView); this.addView(customGuideView,guideViewParams); } } /** *获得targetView的宽高,如果未测量,返回{-1,-1} * *@return */ privateint[]getTargetViewSize(){ int[]location={-1,-1}; if(isMeasured){ location[0]=targetView.getWidth(); location[1]=targetView.getHeight(); } returnlocation; } /** *获得targetView的半径 * *@return */ privateintgetTargetViewRadius(){ if(isMeasured){ int[]size=getTargetViewSize(); intx=size[0]; inty=size[1]; return(int)(Math.sqrt(x*x+y*y)/2); } return-1; } booleanneedDraw=true; @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); Log.v(TAG,"onDraw"); if(!isMeasured) return; if(targetView==null) return; //if(!needDraw)return; drawBackground(canvas); } privatevoiddrawBackground(Canvascanvas){ Log.v(TAG,"drawBackground"); needDraw=false; //先绘制bitmap,再将bitmap绘制到屏幕 bitmap=Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.ARGB_8888); temp=newCanvas(bitmap); //背景画笔 PaintbgPaint=newPaint(); if(backgroundColor!=0) bgPaint.setColor(backgroundColor); else bgPaint.setColor(getResources().getColor(R.color.shadow)); //绘制屏幕背景 temp.drawRect(0,0,temp.getWidth(),temp.getHeight(),bgPaint); //targetView的透明圆形画笔 if(mCirclePaint==null) mCirclePaint=newPaint(); porterDuffXfermode=newPorterDuffXfermode(PorterDuff.Mode.SRC_OUT);//或者CLEAR mCirclePaint.setXfermode(porterDuffXfermode); mCirclePaint.setAntiAlias(true); if(myShape!=null){ RectFoval=newRectF(); switch(myShape){ caseCIRCULAR://圆形 temp.drawCircle(center[0],center[1],radius,mCirclePaint);//绘制圆形 break; caseELLIPSE://椭圆 //RectF对象 oval.left=center[0]-150;//左边 oval.top=center[1]-50;//上边 oval.right=center[0]+150;//右边 oval.bottom=center[1]+50;//下边 temp.drawOval(oval,mCirclePaint);//绘制椭圆 break; caseRECTANGULAR://圆角矩形 //RectF对象 oval.left=center[0]-150;//左边 oval.top=center[1]-50;//上边 oval.right=center[0]+150;//右边 oval.bottom=center[1]+50;//下边 temp.drawRoundRect(oval,radius,radius,mCirclePaint);//绘制圆角矩形 break; } }else{ temp.drawCircle(center[0],center[1],radius,mCirclePaint);//绘制圆形 } //绘制到屏幕 canvas.drawBitmap(bitmap,0,0,bgPaint); bitmap.recycle(); } publicvoidsetOnClickExit(booleanonClickExit){ this.onClickExit=onClickExit; } publicvoidsetOnclickListener(OnClickCallbackonclickListener){ this.onclickListener=onclickListener; } privatevoidsetClickInfo(){ finalbooleanexit=onClickExit; setOnClickListener(newOnClickListener(){ @RequiresApi(api=Build.VERSION_CODES.JELLY_BEAN) @Override publicvoidonClick(Viewv){ if(onclickListener!=null){ onclickListener.onClickedGuideView(); } if(exit){ hide(); } } }); } @Override publicvoidonGlobalLayout(){ if(isMeasured) return; if(targetView.getHeight()>0&&targetView.getWidth()>0){ isMeasured=true; } //获取targetView的中心坐标 if(center==null){ //获取右上角坐标 location=newint[2]; targetView.getLocationInWindow(location); center=newint[2]; //获取中心坐标 center[0]=location[0]+targetView.getWidth()/2; center[1]=location[1]+targetView.getHeight()/2; } //获取targetView外切圆半径 if(radius==0){ radius=getTargetViewRadius(); } //添加GuideView createGuideView(); } /** *定义GuideView相对于targetView的方位,共八种。不设置则默认在targetView下方 */ enumDirection{ LEFT,TOP,RIGHT,BOTTOM, LEFT_TOP,LEFT_BOTTOM, RIGHT_TOP,RIGHT_BOTTOM } /** *定义目标控件的形状,共3种。圆形,椭圆,带圆角的矩形(可以设置圆角大小),不设置则默认是圆形 */ enumMyShape{ CIRCULAR,ELLIPSE,RECTANGULAR } /** *GuideView点击Callback */ interfaceOnClickCallback{ voidonClickedGuideView(); } publicstaticclassBuilder{ staticGuideViewguiderView; staticBuilderinstance=newBuilder(); ContextmContext; privateBuilder(){ } publicBuilder(Contextctx){ mContext=ctx; } publicstaticBuildernewInstance(Contextctx){ guiderView=newGuideView(ctx); returninstance; } publicBuildersetTargetView(Viewtarget){ guiderView.setTargetView(target); returninstance; } publicBuildersetBgColor(intcolor){ guiderView.setBgColor(color); returninstance; } publicBuildersetDirction(Directiondir){ guiderView.setDirection(dir); returninstance; } publicBuildersetShape(MyShapeshape){ guiderView.setShape(shape); returninstance; } publicBuildersetOffset(intx,inty){ guiderView.setOffsetX(x); guiderView.setOffsetY(y); returninstance; } publicBuildersetRadius(intradius){ guiderView.setRadius(radius); returninstance; } publicBuildersetCustomGuideView(Viewview){ guiderView.setCustomGuideView(view); returninstance; } publicBuildersetCenter(intX,intY){ guiderView.setCenter(newint[]{X,Y}); returninstance; } publicBuildershowOnce(){ guiderView.showOnce(); returninstance; } publicGuideViewbuild(){ guiderView.setClickInfo(); returnguiderView; } publicBuildersetOnclickExit(booleanonclickExit){ guiderView.setOnClickExit(onclickExit); returninstance; } publicBuildersetOnclickListener(finalOnClickCallbackcallback){ guiderView.setOnclickListener(callback); returninstance; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。