package com.zhl.userguideview;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import java.util.LinkedList;
/**
* 描述:一个用于“应用新特性”的用户指引view
*/
public class UserGuideView extends View implements ViewTreeObserver.OnScrollChangedListener {
public static final int VIEWSTYLE_RECT = 0;
public static final int VIEWSTYLE_CIRCLE = 1;
public static final int VIEWSTYLE_OVAL = 2;
public static final int MASKBLURSTYLE_SOLID = 0;
public static final int MASKBLURSTYLE_NORMAL = 1;
private final int dip100, dip50, dip150, dip10, dip200, dip250, dip300;
private Bitmap fgBitmap;// 前景
private Bitmap jtUpLeft, jtUpRight, jtDownRight, jtDownLeft;// 指示箭头
private Canvas mCanvas;// 绘制蒙版层的画布
private Paint mPaint;// 绘制蒙版层画笔
private int screenW, screenH;// 屏幕宽高
private View targetView;
private boolean touchOutsideCancel = true;
private int borderWitdh = 10;
private int margin = 40;
private int highLightStyle = VIEWSTYLE_RECT;
public int maskblurstyle = MASKBLURSTYLE_SOLID;
private Bitmap tipBitmap;
private int radius;
private int maskColor = 0x99000000;// 蒙版层颜色
private OnDismissListener onDismissListener;
private int statusBarHeight = 0;// 状态栏高度
private String text = "提示:";
private Paint textPaint;
private int bg_color = 0xffff8800;
private Paint bottomPaint;
private RectF rect1;
private OnNextClickListener onNextClickListener;
private String[] list;
private int clickCount = 0;
private String title = "";
private String[] tipTexts;
private View[] views;
private Bitmap[] tipBitmaps;
private OnScrollListener onScrollListener;
private boolean isCenter;
private boolean isLeft, isRight, isMillden, isDr, isRd;
private int left;
private int top;
private int right;
private int bottom;
private int jtTop;
private int textH;
public UserGuideView(Context context) {
this(context, null);
}
public UserGuideView(Context context, AttributeSet set) {
this(context, set, -1);
}
public UserGuideView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
if (attrs != null) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.UserGuideView);
highLightStyle = array.getInt(R.styleable.UserGuideView_HighlightViewStyle, VIEWSTYLE_RECT);
maskblurstyle = array.getInt(R.styleable.UserGuideView_MaskBlurStyle, MASKBLURSTYLE_SOLID);
text = array.getString(R.styleable.UserGuideView_textcontext);
BitmapDrawable drawable = (BitmapDrawable) array.getDrawable(R.styleable.UserGuideView_tipView);
maskColor = array.getColor(R.styleable.UserGuideView_maskColor, maskColor);
if (drawable != null) {
tipBitmap = drawable.getBitmap();
}
array.recycle();
}
dip100 = dip2px(context, 50);
dip10 = dip2px(context, 5);
dip50 = dip2px(context, 25);
dip200 = dip2px(context, 100);
dip250 = dip2px(context, 125);
dip150 = dip2px(context, 75);
dip300 = dip2px(context, 150);
// 计算参数
cal(context);
// 初始化对象
init(context);
}
/**
* 计算参数
*
* @param context 上下文环境引用
*/
private void cal(Context context) {
// 获取屏幕尺寸数组
int[] screenSize = MeasureUtil.getScreenSize((Activity) context);
// 获取屏幕宽高
screenW = screenSize[0];
screenH = screenSize[1];
Rect frame = new Rect();
((Activity) context).getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
statusBarHeight = frame.top;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
statusBarHeight = 44;
}
}
/**
* 初始化对象
*/
private void init(Context context) {
// 关闭硬件加速
// setLayerType(LAYER_TYPE_SOFTWARE,null);
// 实例化画笔并开启其抗锯齿和抗抖动
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(45);
textPaint.setTypeface(Typeface.SANS_SERIF);
bottomPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
bottomPaint.setColor(bg_color);
bottomPaint.setStrokeWidth(2);
// 设置画笔透明度为0是关键!
mPaint.setARGB(0, 255, 0, 0);
// 设置混合模式为DST_IN
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
BlurMaskFilter.Blur blurStyle = null;
switch (maskblurstyle) {
case MASKBLURSTYLE_SOLID:
blurStyle = BlurMaskFilter.Blur.SOLID;
break;
case MASKBLURSTYLE_NORMAL:
blurStyle = BlurMaskFilter.Blur.NORMAL;
break;
}
mPaint.setMaskFilter(new BlurMaskFilter(15, blurStyle));
// 生成前景图Bitmap
fgBitmap = Bitmap.createBitmap(screenW, screenH, Bitmap.Config.ARGB_8888);
// 将其注入画布
mCanvas = new Canvas(fgBitmap);
// 绘制前景画布
mCanvas.drawColor(maskColor);
// 实例化箭头图片
jtDownRight = BitmapFactory.decodeResource(getResources(), R.drawable.jt_down_right);
jtDownLeft = BitmapFactory.decodeResource(getResources(), R.drawable.jt_down_left);
jtUpLeft = BitmapFactory.decodeResource(getResources(), R.drawable.jt_up_left);
jtUpRight = BitmapFactory.decodeResource(getResources(), R.drawable.jt_up_right);
}
@Override
protected void onDraw(Canvas canvas) {
init(null);
if (targetView == null) {
return;
}
// 绘制前景
canvas.drawBitmap(fgBitmap, 0, 0, null);
left = 0;
top = 0;
right = 0;
bottom = 0;
int vWidth = targetView.getWidth();
int vHeight = targetView.getHeight();
if (isCenter)
drawSureButton(canvas, screenW / 2 - dip250, screenH / 2 + dip150, screenW / 2 + dip250, screenH / 2 + dip250);
Rect tagetRect = new Rect();
targetView.getGlobalVisibleRect(tagetRect);
tagetRect.offset(0, -statusBarHeight);
left = tagetRect.left;
top = tagetRect.top;
right = tagetRect.right;
bottom = tagetRect.bottom;
switch (highLightStyle) {
case VIEWSTYLE_RECT:
RectF rect = new RectF(left - borderWitdh, top - borderWitdh, right + borderWitdh, bottom + borderWitdh);
mCanvas.drawRoundRect(rect, 20, 20, mPaint);
break;
case VIEWSTYLE_CIRCLE:
radius = vWidth > vHeight ? vWidth / 2 - dip100 : vHeight / 2 - dip100;
if (radius < 50) {
radius = 100;
}
mCanvas.drawCircle(left + vWidth / 2, top + vHeight / 2, radius, mPaint);
break;
android用户指引的操作类
1星 需积分: 9 5 浏览量
2016-05-10
11:06:18
上传
评论
收藏 19KB ZIP 举报
xielinhua88
- 粉丝: 3
- 资源: 10
最新资源
- 聊天系统(java+applet).zip
- 毕业设计:基于SSM的mysql-高校学生请假管理系统(源码 + 数据库 + 说明文档)
- 博客系统(struts+hibernate+spring).rar
- c语言学生成绩管理系统源码.zip
- 毕业设计:基于SSM的mysql-网约车用户服务平台(源码 + 数据库 + 说明文档)
- 内容管理系统(hibernate3+struts2+spring2)130224.rar
- 基于Java的班级管理系统课程设计源码
- 内容管理系统(hibernate3+struts2+spring2).rar
- 路由器刷breed Web控制台助手v5.8版本.rar
- Java 在 JEP 12 提供的特性预览
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈