`
lonesane
  • 浏览: 23540 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用PorterDuffXfermode实现遮罩层

阅读更多

最近在开发一个小游戏中,用到一个显示当前进度的进度条,如下图所示

由于中间黄色部分是进度条区域,带有一定的弧度而不是规则的长方形。刚开始想偷懒用了很多办法来实现效果都不理想。后来想到使用遮罩层可以非常方便的实现这个功能。

可以通过修改Paint的Xfermode来实现遮罩的效果。Xfermode的功能非常强大,在API DEMO的Graphics中的最后一项有demo。看一下怎么实现我们的这个进度条吧。

 

 

首先用图片处理软件制作一个和中间黄色区域相同的图形,我们将在代码中设置它做为遮罩。


View的draw方法

 

public void draw(Canvas canvas) {
		//背景部分,也就是上面的图形
		Bitmap background = BitmapFactory.decodeResource(getResources(),
				R.drawable.guage);
		//遮罩,就是提取来部分
		Bitmap mask = BitmapFactory.decodeResource(getResources(),
				R.drawable.mask);
		
		canvas.drawColor(Color.WHITE);
		canvas.drawBitmap(background, 0, 0, null);
		Paint paint = new Paint();
		paint.setFilterBitmap(false);

		int x = 0;
		int y = 0;

		// draw the src/dst example into our offscreen bitmap
		int sc = canvas.saveLayer(x, y, x + background.getWidth(), y + background.getHeight(), null,
				Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
						| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
						| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
						| Canvas.CLIP_TO_LAYER_SAVE_FLAG);
		// canvas.drawBitmap(mDstB, 0, 0, paint);
		canvas.drawRect(0, 0, background.getWidth() / 2, background
				.getHeight(), paint);
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		// canvas.drawBitmap(mSrcB, 0, 0, paint);
		canvas.drawBitmap(mask, 0f, 0f, paint);
		paint.setXfermode(null);
		canvas.restoreToCount(sc);

	}
 

 

只用控制绘制的矩形的长度就可以实现进度条的效果了。


             

 

 

  • 大小: 11.9 KB
  • 大小: 10.6 KB
  • 大小: 3.3 KB
  • 大小: 3.2 KB
  • 大小: 3.3 KB
分享到:
评论
6 楼 IWSo 2013-11-14  
这思路很赞
5 楼 yang668 2012-09-22  
呵呵 很好 ,
4 楼 jiyuan18 2012-03-30  
楼主高手!解决了我一大问题
3 楼 justin8335 2011-03-20  
很好,这个技巧不错。收藏
2 楼 lonesane 2010-11-03  
yinxiangjake 写道
为什么不直接使用两张长方形透明的图片,不就好了

使用两张图片也可以哈,不过这样貌似可以节省一点图片空间
1 楼 yinxiangjake 2010-10-26  
为什么不直接使用两张长方形透明的图片,不就好了

相关推荐

    node-v14.17.3-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    c语言UDP传输系统源码.rar

    c语言UDP传输系统源码.rar

    node-v16.2.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于matlab多目标遗传算法matlab程序.rar

    基于matlab多目标遗传算法matlab程序.rar

    MCSkinn (我的世界)皮肤制作工具

    软件可以给需要制作自己喜爱的MC皮肤的玩家来自己制作皮肤,快来下载吧!

    数据可视化-Pyecharts绘制饼图

    数据可视化-Pyecharts绘制饼图

    操作系统基础知识.zip

    操作系统是计算机系统中至关重要的组成部分,它作为计算机硬件与软件之间的桥梁,负责管理和控制计算机的硬件和软件资源,确保它们得到合理的分配和使用。操作系统不仅影响计算机的性能,还决定了用户界面的友好程度以及计算机系统的安全性和稳定性。因此,深入理解和掌握操作系统的知识对于计算机专业人士来说至关重要。

    欧母龙PLC例程源码小车控制程序

    欧母龙PLC例程源码小车控制程序提取方式是百度网盘分享地址

    么么哒.mp3

    么么哒.mp3

    node-v14.3.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    python修改网站会员登陆密码

    登录密码是一种用于验证用户身份并授权其访问特定系统、应用程序或网站的机制。它是用户在注册或创建账户时自行设置的秘密字符组合,通常与用户名配对使用。登录密码是保护用户隐私和数据安全的重要措施之一。

    node-v13.9.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v16.13.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v13.10.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    毕业设计 基于Pytorch毕业论文知识图谱(Neo4j)构建平台源码+详细文档+全部数据资料(高分项目).zip

    【资源说明】 毕业设计 基于Pytorch毕业论文知识图谱(Neo4j)构建平台源码+详细文档+全部数据资料(高分项目).zip毕业设计 基于Pytorch毕业论文知识图谱(Neo4j)构建平台源码+详细文档+全部数据资料(高分项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过mac/window10/11测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    机械设计外扇叶金属轴装配step非常好的设计图纸100%好用.zip

    机械设计外扇叶金属轴装配step非常好的设计图纸100%好用.zip

    node-v13.4.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Maven:构建自动化与项目管理的利器.zip

    Maven作为一款强大的项目管理工具,为开发者提供了自动化构建、依赖管理、项目文档生成等功能。通过掌握Maven的核心概念和基本使用,开发者可以更加高效地管理项目,提高开发效率和质量。同时,Maven的灵活性和可扩展性也使得它能够适应各种复杂的项目需求。因此,无论是初学者还是资深开发者,都应该学习和掌握Maven这一项目管理利器。

    欧母龙PLC例程源码洗涤器电机插管改善

    欧母龙PLC例程源码洗涤器电机插管改善提取方式是百度网盘分享地址

Global site tag (gtag.js) - Google Analytics