12
2015
05

遮罩效果

公司安卓项目中要用到一个效果:透过一个圆形区域来显示一张图片,图片可以拖动。在flash中这种效果做起来是很简单的,画个圆形的遮罩就可以了。安卓好像没有遮罩的概念,还得自己来做。

通过百度搜索,发现两种方法,一种是通过图片的组合模式,将两幅图叠加到一起,这个方法简单,但是灵活性低,没有太在意,链接地址也没记住;另一种方法是通过canvas(原来安卓中也有canvas,和js太像了),对于canvas,我还是比较熟悉的。

canvas方法参考:http://blog.csdn.net/jiasudu1/article/details/7419432

安卓Canvas API:http://developers.androidcn.com/reference/android/graphics/Canvas.html

可能有人和我一样,不知道安卓里边怎么创建一个Bitmap,参考:http://blog.csdn.net/chenzheng_java/article/details/6266345

第一次在自己手机上测试,并没有得到理想的结果,clipPath传入的是一个圆,但是得到的确实一个小矩形;在公司的安卓测试设备上测试倒是可以,一开始以为又是安卓系统的兼容问题,后来搜了一下,发现原来是3d加速的问题。和html5中的canvas一样,安卓中的canvas也是分3d和2d的(不知道理解的对不对),有些移动设备是默认开启3d加速的(可能现在大多数设备都会开启吧),而canvas的clipPath方法是不支持3d加速的(还有好多方法不支持,这里就不列举了)。

解决方法:

1、既然是3d加速引起的,首先想到的是关闭3d加速。安卓里边关闭3d加速是以view为单位的,关闭方法如下:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

亲试,可行。

参考:http://blog.csdn.net/joejames/article/details/41484787

不知道这个方法只是关闭了调用方法的view的3d加速效果,还是整个Application的。

2、还有一个方法,没有看懂,可能是说先draw一遍,再用吧,而不是直接用源图片。感觉和flash里边解决图片的安全沙箱问题的思路类似。

参考:http://stackoverflow.com/questions/16889815/canvas-clippath-only-works-on-android-emulator

«1»