热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android自定义View引导蒙版

引导蒙版引导蒙版分为三部分1、高亮显示的目标布局2、围绕着目标布局的围栏布局3、用于提示的蒙版布局DEMO地址:https:github.comchaozhouzha
引导蒙版

引导蒙版分为三部分 

1、高亮显示的目标布局 

2、围绕着目标布局的围栏布局 

3、用于提示的蒙版布局

DEMO地址:https://github.com/chaozhouzhang/CustomProgressView

GuideMask guideMask = new GuideMask.Builder(this)//蒙版所在activity.setMaskActivity(this)//目标布局.setTargetView(mIvTest)//蒙版背景颜色包括透明度.setBgColor(Color.parseColor("#40000000"))//蒙版布局.setMaskLayout(R.layout.layout_mask)//关闭蒙版的按钮.setMaskCloseId(R.id.btn_close)//围栏与目标布局的距离.setFencePadding(5,5,5,5)//围栏布局四角的角度.setFenceRadius(100).build();GuideMaskSet guideMaskSet = new GuideMaskSet();
//添加蒙版
guideMaskSet.addGuide(guideMask);
//显示所有蒙版
guideMaskSet.show();

1、自定义FrameLayout

在ViewGroup中,初始化时设置了WILL_NOT_DRAW,设置WILL_NOT_DRAW之后,onDraw()不会被调用,目的是略过绘制的过程,优化了性能。所以,在写自定义ViewGroup布局时,如果需要调用onDraw()进行绘制,则需要在初始化时候,调用setWillNotDraw(false)。

setWillNotDraw(false);

2、使用LayoutInflater解析蒙版布局,并添加到当前自定义布局中

配置root为当前自定义布局,配置attachToRoot为true,也就是解析蒙版布局结束后,直接添加到当前自定义布局中。

LayoutInfalter的使用与源码解析可以看本公众号的文章:

LayoutInfalter的使用与源码解析

mMaskLayoutView = LayoutInflater.from(mMaskActivity).inflate(mMaskLayout, this, true);

3、将自定义布局添加到activity的content布局中

添加:

mContentParent.post(new Runnable() {@Overridepublic void run() {//显示蒙版,也就是将当前蒙版加到mContentParent的FrameLayout布局上mContentParent.addView(GuideMask.this, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));}
});

找到关闭蒙版的ID控件,点击后将自定义布局从activity的content布局中移除:

if (mCloseId != 0) {//在蒙版布局中找到点击关闭蒙版的控件mMaskLayoutView.findViewById(mCloseId).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dismiss();if (mOnDismissListener != null) {mOnDismissListener.onDismiss();}}});
}

移除:

public void dismiss() {mContentParent.post(new Runnable() {@Overridepublic void run() {//关闭蒙版,也就是将当前蒙版从mContentParent的FrameLayout布局上移除mContentParent.removeView(GuideMask.this);}});
}

4、绘制围栏布局,以突出目标布局

4.1、设置围栏的画笔

图像过渡模式,设置为清除模式,用于显示目标布局:

//首先xfermode绘图需要两部分,DST,SRC 两种。可以理解为DST 在下边,SRC在上面。也就是说DST先绘制,SRC 后绘制。
//PorterDuff.Mode.CLEAR:清除模式,[0, 0],即图像中所有像素点的alpha和颜色值均为0。
PorterDuff.Mode mode = PorterDuff.Mode.CLEAR;
mFenceClearMode = new PorterDuffXfermode(mode);
//这个方法用于设置图像的过渡模式,所谓过渡是指图像的饱和度、颜色值等参数的计算结果的图像表现。
//设置围栏区域为清除模式,以达到显示目标布局的目的
mFencePaint.setXfermode(mFenceClearMode);

设置画笔遮罩滤镜,用于凸出目标布局:

//设置画笔遮罩滤镜,传入BlurMaskFilter或EmbossMaskFilter,前者为模糊遮罩滤镜而后者为浮雕遮罩滤镜。
//如果应用启用了硬件加速,将看不到任何阴影效果。
mFencePaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER));
//关闭当前View的硬件加速。
setLayerType(LAYER_TYPE_SOFTWARE, null);

4.2、onDraw绘制围栏

获取目标布局和content布局的位置坐标:

/*** 获取当前蒙版所目标的布局的坐标位置。*/
mTargetView.getGlobalVisibleRect(mTargetRect);

/*** getGlobalVisibleRect()是View可见区域相对与屏幕来说的坐标位置。* getLocalVisibleRect()是View可见区域想对于自己坐标的位置。* 获取当前蒙版所在activity根布局的坐标位置。*/
mContentParent.getGlobalVisibleRect(mContentRect);

计算围栏布局的位置坐标:

/*** 需要绘制的坐标位置*/
int topMargin = mContentRect.top;
int left = mTargetRect.left - mPaddingLeft;
mFenceRectF.left = left;
int right = mTargetRect.right + mPaddingRight;
mFenceRectF.right = right;
int top = mTargetRect.top - mPaddingTop - topMargin;
mFenceRectF.top = top;
int bottom = mTargetRect.bottom + mPaddingBottom - topMargin;
mFenceRectF.bottom = bottom;
/*** rx:x方向上的圆角半径。* ry:y方向上的圆角半径。*/
canvas.drawRoundRect(mFenceRectF, mRadius, mRadius, mFencePaint);

5、建造者模式构建蒙版

GuideMask guideMask = new GuideMask.Builder(this)//蒙版所在activity.setMaskActivity(this)//目标布局.setTargetView(mIvTest)//蒙版背景颜色包括透明度.setBgColor(Color.parseColor("#40000000"))//蒙版布局.setMaskLayout(R.layout.layout_mask)//关闭蒙版的按钮.setMaskCloseId(R.id.btn_close)//围栏与目标布局的距离.setFencePadding(5,5,5,5)//围栏布局四角的角度.setFenceRadius(100).build();

6、整合蒙版集合,关闭蒙版后显示下一个蒙版

/*** 添加蒙版* @param guideMask*/
public void addGuide(GuideMask guideMask) {mGuideMasks.add(guideMask);guideMask.setOnDismissListener(new GuideMask.OnDismissListener() {@Overridepublic void onDismiss() {//关闭后显示下一个蒙版int nextPosition = mPosition + 1;if (mGuideMasks.size() > nextPosition) {GuideMask next = mGuideMasks.get(nextPosition);mPosition++;next.show();}}});
}

推荐阅读
你亲手写的代码,正在出卖你

深夜,聊聊架构设计

深夜,分享一个Git小技巧

编程·思维·职场
欢迎扫码关注


推荐阅读
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 本文详细介绍了如何创建和使用VUE uni-app开发环境,包括通过HBuilderX可视化界面和通过vue-cli命令执行的方法。文章内容简单清晰,易于学习与理解。通过学习本文,读者可以深入了解VUE uni-app开发环境,并通过实践验证掌握具体的使用情况。编程笔记将为读者推送更多相关知识点的文章,欢迎关注! ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有