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;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。