[原创]andorid最方便定制的新手引导浮层新手引导指引页半透明挖空制作与开源github以及分享实现思路

首先文章非常简单,代码非常精简,也就是说这里的技术只是打造一个非常方便扩展的view,剩下的事情没有学习成本,只需要跟平常开发一样写布局摆放到指定位置就行,越是精简越是非常容易扩展,整个引导浮层就镂空区域没法使用现成view,或者xml写出来的。

设计思路和扩展原理

1、引导箭头是自己摆放,方便用户定制,自己用布局嵌套就好
2、方便用户随意摆放到任何位置,如对话框、顶层decorview或者放置到fragment里面于是我打算设计成一个view,而不是一个封装死的框架.而且这个view只处理镂空形状问题.
3、镂空形状的设计要方便扩展,我采取接口的方式传递画板和画笔 默认实现了圆形和矩形,用户可以轻松实现其他形状定制。

镂空实现原理

超级简单的,我之前看了别人那个就头疼,于是自己着手写了一个镂空的,采用的绘制模式是`
det_out模式来实现,其实吧,实现方式多种多样的.

image.png

首先要说明白一点就是det表示底层图层, src表示顶层的图层
从图中得知,dstout模式 就是把src盖到dstout的右下角,导致右下角消失不见了。

所以我这里是绘制了一个矩形半透明 然后上层 绘制一个要镂空的任意形状, 颜色随便,我这里保持不变。

开源完整地址

https://github.com/qssq/HollowOutView
导入依赖

compile 'cn.qssq666:hollowoutview:0.1'

使用方法

 HollowOutView hollowOutView = (HollowOutView) findViewById(R.id.hollowoutview);
        //在中心点100的区域绘制一个50px大小的圆圈 透明区域
        HollowOutView.CiceleHollowedShapeInfo circle=new HollowOutView.CiceleHollowedShapeInfo().setCx(100).setCy(100).setRadius(100);
        hollowOutView.addGuideDrawInfo(circle);
        //添加一个矩形 镂空透明区域 所有单位都是px,自己转换
        HollowOutView.RectHollowedShapeInfo rect=new HollowOutView.RectHollowedShapeInfo().setHeight(100).setWidth(90).setLeft(400).setTop(800);
        hollowOutView.addGuideDrawInfo(rect);
        hollowOutView.applyChanage();

非完整代码 HollowOutView镂空view代码如下.

/**
 * Created by qssq on 2018/4/29 qssq666@foxmail.com
 */
public class HollowedOutView extends View {

    public Paint getPaint() {
        return paint;
    }

    private Paint paint;

    public HollowedOutView(Context context) {
        super(context);
        init(context);
    }

    public HollowedOutView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    protected void init(Context context) {


        paint = new Paint();
        paint.setFlags(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.parseColor("#7f000000"));//百分之50
        paint.setColor(Color.parseColor("#32000000"));//百分之20
        paint.setColor(Color.parseColor("#c8000000"));//百分之80
        setLayerType(LAYER_TYPE_SOFTWARE, null);//关闭硬件加速

    }

    public HollowedOutView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);

        Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);//从绘制模式图片得知 这种模式会导致挖空的区域消失
        paint.setXfermode(mXfermode);
        for (int i = 0; i < infos.size(); i++) {

            HollowedOutShapeInfoI guideDrawInfo = infos.get(i);
            guideDrawInfo.executeDraw(canvas, paint);

        }
        paint.setXfermode(null);


    }

    protected List<HollowedOutShapeInfoI> infos = new ArrayList<>();

    public void addGuideDrawInfo(HollowedOutShapeInfoI info) {

    }

    public void addGuideDrawInfos(List<HollowedOutShapeInfoI> infos) {
        this.infos.addAll(infos);

    }

    public void clearGuideDrawInfo() {

        infos.clear();
    }

    /**
     * 镂空形状接口 可用户自定义
     */
    public interface HollowedOutShapeInfoI {
        /**
         * 要挖空的形状
         *
         * @param canvas
         * @param paint
         */
        void executeDraw(Canvas canvas, Paint paint);
    }

    public static class RectHollowedShapeInfo implements HollowedOutShapeInfoI {


        public int getLeft() {
            return left;
        }

        public void setLeft(int left) {
            this.left = left;
        }

        public int getTop() {
            return top;
        }

        public void setTop(int top) {
            this.top = top;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        int left;
        int top;
        int width;
        int height;

        @Override
        public void executeDraw(Canvas canvas, Paint paint) {
            canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
        }

    }

    //默认实现的镂空圆形图标


    public static class CiceleHollowedShapeInfo implements HollowedOutShapeInfoI {

        public int getCx() {
            return cx;
        }

        /**
         * 要绘制的圆圈的中心点x坐标
         *
         * @param cx
         */
        public void setCx(int cx) {
            this.cx = cx;
        }

        /**
         * 要绘制的中心点y坐标
         *
         * @return
         */
        public int getCy() {
            return cy;
        }

        public void setCy(int cy) {
            this.cy = cy;
        }

        public int getRadius() {
            return radius;
        }

        public void setRadius(int radius) {
            this.radius = radius;
        }

        int cx;
        int cy;
        /**
         * 圆角半径
         */
        int radius;

        @Override
        public void executeDraw(Canvas canvas, Paint paint) {


            canvas.drawCircle(
                    cx,
                    cy,
                    radius, paint);
        }
        /**
         * 要挖空的形状
         *
         * @param canvas
         */
    }


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

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,135评论 3 23
  • Core Animation其实是一个令人误解的命名。你可能认为它只是用来做动画的,但实际上它是从一个叫做Laye...
    小猫仔阅读 3,691评论 1 4
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,104评论 5 13
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,471评论 6 30
  • 注:安装环境由于多是外网数据,会有被墙以及下载过慢导致失败的情况。建议开个VPN后再进行安装,本人选的香港节点 比...
    Alanxx阅读 292评论 0 2