`
lonesane
  • 浏览: 23834 次
  • 性别: 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  
为什么不直接使用两张长方形透明的图片,不就好了

相关推荐

    Android-用于头像选取的遮罩的画圆实现方式

    总的来说,实现Android头像选取的遮罩画圆主要涉及到自定义`View`的绘制、`Canvas`的使用以及图形混合模式的应用。通过理解这些基础知识,开发者可以构建出各种复杂的图形效果,满足不同应用的需求。

    Android实现新手引导半透明蒙层效果

    本文将详细介绍如何实现Android新手引导半透明蒙层效果,包括自定义View、Paint和Canvas的使用, PorterDuffXfermode的应用,以及 Bitmap和Canvas的结合使用等。 知识点1:自定义View的使用 在实现Android新手引导...

    Android中实现蒙板效果的代码实现

    蒙板效果通常是通过遮罩层来部分隐藏或改变原图像的颜色,以此达到预期的设计效果。本教程将深入讲解如何在Android中使用Bitmap进行位图操作,以实现一个具有蒙板效果的类进度条程序。 首先,我们需要了解Bitmap...

    Android刮刮卡效果实现代码

    总的来说,Android刮刮卡效果的实现主要涉及到自定义View的绘制逻辑,Bitmap和Canvas的使用,以及PorterDuffXfermode的模式选择。通过这种方式,开发者可以轻松地在应用中创建有趣的互动元素,提升用户体验。

    Android编程绘制圆形图片的方法

    总之,Android编程中绘制圆形图片的关键在于创建一个遮罩层并使用混合模式来剪裁图片,使其呈现出圆形效果。自定义控件`RoundView`的实现方式提供了一个简单易懂的示例,可以帮助开发者在自己的项目中实现类似的功能...

    安卓切换动画相关-Activity切换动画--模糊水波纹折叠效果.zip

    模糊效果在Android中通常是通过Bitmap的遮罩处理来实现的,开发者可以使用BitmapShader或PorterDuffXfermode来创建一个模糊的背景。例如,当一个新Activity即将展示时,旧Activity的视图可以被模糊处理,为过渡动画...

    Android 完美实现图片圆角和圆形( bug修复后)

    如果是圆形,我们会使用`getCircularBitmap()`方法,该方法通过在一个新的Bitmap上画一个圆形遮罩来裁剪原始Bitmap。对于圆角矩形,我们使用`getMatrixForCornerRadii()`方法来创建一个Matrix,该Matrix将应用于...

    Android调用系统相机和自定义相机实例圆形取景框。Camera工具类

    6. 创建圆形取景框:在CameraSurfaceView的onDraw()方法中,我们可以绘制一个圆形的遮罩层,使得用户看到的取景区域为圆形。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); ...

    Android ImageView圆角图片 + 剪切

    // 设置遮罩层 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } ``` 通过以上方法,我们不仅可以实现`ImageView`的...

    Android应用源码之Android创建抗锯齿透明背景圆角图像-IT计算机-毕业设计.zip

    3. ** PorterDuffXfermode**:利用Porter-Duff模式的`PorterDuff.Mode.CLEAR`,可以清除指定区域,实现圆角效果。首先创建一个带有圆角的遮罩Bitmap,然后在绘制时将遮罩与原Bitmap结合,清除非圆角部分。 4. **...

    AndroidAnimation-Android自定义View之星球运动.zip

     //设置遮罩模式为SRC_IN显示原图层中原图层与遮罩层相交部分  paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)  canvas.drawBitmap(srcB, width / -2F, height / -2F , paint)  ...

Global site tag (gtag.js) - Google Analytics