Android上一个扫描框风格的新手引导库

本文出处
炎之铠csdn博客:http://blog.csdn.net/totond
炎之铠邮箱:yanzhikai_yjk@qq.com
本文原创,转载请注明本出处!

简介

Github地址:https://github.com/totond/YGuider
  这是一个扫描框风格的新手引导,效果如上图。

使用

Gradle

compile 'com.yanzhikaijky:YGuider:0.9.2'

支持特性

  • 目前暂时只支持一个扫描框的引导(多扫描框的在设计)
  • 传入View对象就会根据它的位置信息生成坐标区域,保存在目标区域中。(所以View对象传入之后位置有更变的,请在startGuide()前重新调用prepare()
  • 传入区域坐标矩形(left,top,right,bottom)也可以设置目标。
  • 可以自定义弹窗布局。
  • 可以自定义画扫描框的画笔

具体的详细操作方法可以查看Wiki

使用方法

Demo使用

Demo里面已经包含了使用YGuider的各种姿势,不过有一些注释掉而已,欢迎Fork来体验。_

简单使用

需要传入Activity对象来创建YGuider,然后加入想要被“扫描”的目标,最后调用prepare()方法就可以了完成准备了:


        mYGuider = new YGuider(this);
        mYGuider.addNextTarget(new RectF(70, 70, 170, 170), "点击这里可以立刻出现所有提示文字,大家好,我是YGuider!", 90, 0);
        mYGuider.addNextTarget(btn1, "这里是根据传入View来确定的区域!", 150, 10);
        mYGuider.addNextTarget(new RectF(50, 500, 150, 650), "这里是根据传入矩形区域坐标来确定的!", 100, 10);
        mYGuider.addNextTarget(
                        btn2, "通过设置偏移量来控制PopupWindow出现的位置,还可以设置它的大小!"
                        , -350, -350
                        , 430, ViewGroup.LayoutParams.WRAP_CONTENT);
        mYGuider.addNextTarget(
                        new RectF(500, 200, 600, 270), "可以动态改变两个按钮的文字",
                        -350, 50
                        , 300, ViewGroup.LayoutParams.WRAP_CONTENT
                        , "", "Finish");

        mYGuider.prepare();

最后在需要调用的时候,使用startGuide()方法开始新手引导:

                mYGuider.startGuide();

方法介绍

由于方法过多,放在这里太占地方,所以请移步Wiki查看各个方法的使用。

关于设置目标的方法


    /**
     * 增加一个扫描区域
     * @param targetView 目标View
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     */
    public void addNextTarget(View targetView, String text, int wOffsetX, int wOffsetY);

    /**
     * 增加一个扫描区域
     * @param targetView 目标View
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     * @param wWidth 弹出窗口的宽度
     * @param wHeight 弹出窗口的高度
     */
    public void addNextTarget(View targetView, String text, int wOffsetX, int wOffsetY, int wWidth, int wHeight);

    /**
     * 增加一个扫描区域
     * @param targetView 目标View
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     * @param wWidth 弹出窗口的宽度
     * @param wHeight 弹出窗口的高度
     * @param jumpText 跳过选项的文字
     * @param nextText 下一步选项的文字
     */
    public void addNextTarget(View targetView, String text, int wOffsetX, int wOffsetY, int wWidth, int wHeight, String jumpText, String nextText);

    /**
     * 增加一个扫描区域
     * @param targetRegion 目标区域的坐标矩阵
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     */
    public void addNextTarget(RectF targetRegion, String text, int wOffsetX, int wOffsetY);

    /**
     * 增加一个扫描区域
     * @param targetRegion 目标区域的坐标矩阵
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     * @param wWidth 弹出窗口的宽度
     * @param wHeight 弹出窗口的高度
     */
    public void addNextTarget(RectF targetRegion, String text, int wOffsetX, int wOffsetY, int wWidth, int wHeight);

    /**
     * 增加一个扫描区域
     * @param targetRegion 目标区域的坐标矩阵
     * @param text 说明文字
     * @param wOffsetX 弹出窗口的X位置偏移量(初始位置为目标View中间)
     * @param wOffsetY 弹出窗口的Y位置偏移量(初始位置为目标View正下方)
     * @param wWidth 弹出窗口的宽度
     * @param wHeight 弹出窗口的高度
     * @param jumpText 跳过选项的文字
     * @param nextText 下一步选项的文字
     */
    public void addNextTarget(RectF targetRegion, String text, int wOffsetX, int wOffsetY, int wWidth, int wHeight, String jumpText, String nextText);

    /**
     * 增加一些Target
     * @param targets 一些ScanTarget对象
     */
    public void addTarget(ScanTarget... targets);

注意,执行完上面的增加操作之后需要prepare(),才能让YGuider获得目标View位置属性。


    /**
     * 开始Guide
     */
    public void startGuide();

    /**
     * 进入下一个引导
     */
    public void startNextGuide();

    /**
     * 退出新手引导
     */
    public void cancelGuide();

    /**
     * 移除目标
     * @param index 目标的index
     * @return 移除目标成功与否
     */
    public boolean removeTarget(int index);

    /**
     * 清除所有扫描目标
     */
    public void clearTargets();

    /**
     * 判断在当前ContentView是否已经初始化宽高属性
     * 如果是,则直接获取目标View的位置信息,写入目标列表
     * 如果不是,则等到ContentView初始化宽高属性之后再获取
     */
    public void prepare();

设置自定义属性的方法

这些方法用于设置一些YGuider本身已有默认值的属性,替换


    /**
     * 设置扫描框动画刷新的时间间隔,默认值是20
     * @param refreshTime 单位是ms
     */
    public void setMaskRefreshTime(int refreshTime);

    /**
     * 设置扫描框移动动画的持续时间,默认值是500
     * @param moveDuration 单位是ms
     */
    public void setMaskMoveDuration(int moveDuration);

    /**
     * 设置扫描框扩大动画的持续时间,默认值是500
     * @param expandDuration 单位是ms
     */
    public void setExpandDuration(int expandDuration);

    /**
     * 设置遮罩层的颜色,最后是设置成透明的,默认颜色是#aa222222
     * @param color 颜色
     */
    public void setMaskColor(@ColorInt int color);

    /**
     * 设置画扫描框的画笔
     * @param paint 画笔
     */
    public void setMaskPaint(Paint paint);

    /**
     * 设置弹窗里面TextView文字出现的速度,默认值是100
     * @param refreshTime 每次增加文字的时间间隔,单位ms
     */
    public void setWindowTyperRefreshTime(int refreshTime);

    /**
     * 弹窗里面说明文字的字体大小,默认值是18sp
     * @param size 字体大小
     */
    public void setWindowTyperTextSize(int size);

    /**
     * 设置弹窗里面TextView文字的增长速度,默认值是1
     * @param increase 每次增加多少个字符
     */
    public void setWindowTyperIncrease(int increase);

    /**
     * 设置跳过按钮的文字
     * @param jumpText 跳过文字
     */
    public void setJumpText(String jumpText);

    /**
     * 设置下一步按钮的文字
     * @param nextText 下一步文字
     */
    public void setNextText(String nextText);

    /**
     * 设置弹窗背景
     * @param idRes 背景DrawableId
     */
    public void setWindowBackground(@DrawableRes int idRes);

    /**
     * 设置跳过和下一步按钮文字大小
     * @param size 文字字体大小
     */
    public void setWindowJumpAndNextTextSize(int size);

    /**
     * 设置自定义弹窗布局
     * 注意新的布局要有TyperTextView类,id设置为ttv_tips
     * 跳过按钮和下一步按钮可以选择实现,但是有的话id请分别设置为tv_jump和tv_next,其他可以自定义
     * @param layouId 布局的id
     */
    public void setWindowContent(@LayoutRes int layouId);

关于TyperTextView

这个逐字播放TextView是我改写自hanks-zyh的HTextView里面的TyperTextView,修改了不少东西,它是一个TextView,Text,TextSize和TextColor已经在代码里面写了,除了这些属性还是其他还是可以在xml文件里面定义的。

回调

YGuider的回调分为状态回调OnGuiderChangedListener和点击回调OnGuiderClickListener

/**
 * YGuider状态变化的回调
 */
public interface OnGuiderChangedListener {
    /**
     * 引导开始时候回调
     */
    void onGuiderStart();

    /**
     * 跳转到下一个目标时候的回调
     * @param nextIndex 下一个目标的index
     */
    void onGuiderNext(int nextIndex);

    /**
     * 引导完成之后的回调
     */
    void onGuiderFinished();
}

/**
 * 各种点击事件的回调
 */
public interface OnGuiderClickListener {
    /**
     * 当遮罩层空白处被点击时候的回调
     */
    void onMaskClick();

    /**
     * 当下一步按钮被点击时的回调
     * @param nextIndex 下一目标的index
     */
    void onNextClick(int nextIndex);

    /**
     * 当前高亮/扫描目标区域被点击时的回调
     * @param index 当前目标区域的index
     */
    void onTargetClick(int index);

    /**
     * 当跳过按钮被点击时的回调
     */
    void onJumpClick();
}

注意:这些都是接口,实现它们的话就必须重写里面的所有方法,所以这里有一个继承它们的抽象类OnGuiderListener实现它的子类的话可以选择性地重写一些回调方法(这个设计参考了GestureDetector的SimpleOnGestureDetector),所以有下面设置回调的方法:

    /**
     * 设置点击回调
     * @param guiderClickListener 可以传入OnGuiderClickListener和OnGuiderListener的子类
     */
    public void setOnGuiderClickListener(OnGuiderClickListener guiderClickListener){
        mMask.setOnGuiderClickListener(guiderClickListener);
    }

    /**
     * 设置状态回调
     * @param onGuiderChangedListener 可以传入OnGuiderChangedListener和OnGuiderListener的子类
     */
    public void setOnGuiderChangedListener(OnGuiderChangedListener onGuiderChangedListener){
        mMask.setOnGuiderChangedListener(onGuiderChangedListener);
    }

    /**
     * 设置状态所有回调
     * @param onGuiderListener 可以传入OnGuiderListener的子类
     */
    public void setOnGuiderListener(OnGuiderListener onGuiderListener){
        mMask.setOnGuiderListener(onGuiderListener);
    }

后续

YGuider原理分析正在路上,后续更新目标是设计让YGuider可以使用多个扫描框(目前最大的难题是觉得那样会很丑),在这里请求意见和建议,请多多指教小弟。

版权

TyperTextView

YGuider里面使用到的那个文字逐字出现的控件,是改写自hanks-zyh的HTextView里面的TyperTextView,虽然被我改了很多,也在这里说明一下。

开源协议

YGuider遵循Apache2.0协议。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,287评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,983评论 4 60
  • 片上系统(SoC)指的是在芯片上集成了一个完整的系统,包括中央处理器,媒体处理器,存储器接口,存储器,系统控制器,...
    壹诺思维阅读 2,753评论 2 5
  • 离开牡丹园已是正午十二点了,一直沉浸在赏花的喜悦与兴奋里,早已饥肠辘辘的我们却不曾觉得。宋哥带我们到牡丹园附近的农...
    风月儿阅读 714评论 0 3