专栏名称: 开发者全社区
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
开发者全社区  ·  刘亦菲妈妈,真美! ·  昨天  
开发者全社区  ·  金融圈大瓜 ·  2 天前  
开发者全社区  ·  捡漏清华刷屏,这也行? ·  2 天前  
开发者全社区  ·  原来如此:很多公司都不招大龄程序员了。。。 ·  3 天前  
51好读  ›  专栏  ›  开发者全社区

Android Shader 实战 各种炫酷效果的基石

开发者全社区  · 公众号  · android  · 2017-04-15 08:45

正文

相关阅读:

吊炸天!74款APP完整源码!

谈谈我做技术面试官的经历--Android面试官给你的面试题和建议

Android自定义View - 最通俗易懂的自定义View原理系列

来源:http://blog.csdn.net/qian520ao

源码下载地址:见文末“阅读原文”


自定义view中画笔Paint有设置着色器方法paint.setShader(),我们来看一下这个Shader的子类




1

SweepGradient [雷达实战]



效果图



使用方式



启动雷达 | 关闭雷达 扫描

startScan();   
stopScan();



SweepGradient【梯度渐变】



上图我们可以看到SweepGradient有两个构造方法,分别是多色渐变和两色渐变,我介绍一下各自的参数。




绘制雷达


有了这个SweepGradient,绘制雷达就轻松多了,我们只要把雷达的基线绘制好,然后通过paint处理的着色器绘制渐变的圆进行旋转就是我们所要的雷达效果了。


1.首先我们在values目录下面创建attrs.xml文件,设置自定义view的参数供布局使用



2.在代码中我们获取布局中定义的参数



3.onMeasure的时候,我们根据用户的不同宽高设置,设置对应的布局大小



上述热身运动做完之后我们开始绘制雷达,首先我们将画板canvas移动到屏幕的中心点,然后根据用户设定圆圈个数来绘制圆圈,最后在用设置着色器的paint来绘制过渡颜色的圆,最后进行旋转即可。



初始化paint和shader



我们通过Handler让雷达动起来。


雷达旋转的方法是旋转canvas,这其中有两种实现方式

( Matrix详解http://www.gcssloop.com/customview/Matrix_Basic )





2

BitmapShader [多边形图片实战]




从上图可以看出BitmapShader 只有一个构造方法,



上面的这张德莱文X轴是CLAMP模式,Y轴是REPETA模式,那么问题来了,激光强还是斧头强。



这时候我们如果在onDraw的时候,在中心位置绘制一个圆,那么是不是就能够相当于以上图为背景,扣出一个圆呢。

 //中心画一个半径为宽的圆
canvas.drawCircle(mWidth / 2, 
    mHeight / 2, mWidth / 2, mPaint); 



那么就好理解了,paint设置了BitmapShader相当于绘制了底层的图片背景,你可以设置了BitmapShader之后,canvas用这枝画笔去绘制任何图像,相当于从背景图扣出对应的形状。


有一点要注意的是BitmapShader通过构造函数初始化设置bitmap时候,默认这个着色背景为当前bitmap的大小,可以通过setLocalMatrix去重新设置着色背景的形状/范围



效果图



那么我们撸起袖子来通过这个BitmapShader来绘制多边形,我们首先画一个五角形


思路:


首先我们将中心点移动到五角形的中心,以r为半径,我们睁眼说瞎话的设A角度为0°,那么就可以计算B,C,D,E各自的角度,然后按照我们上片自定义菜单( http://blog.csdn.net/qian520ao/article/details/60509040 )得出的公式


x=Math.sin(2∗PI/360∗angle)∗r
y=Math.cos(2∗PI/360∗angle)∗r
x=Math.sin(Math.toRadians(angle))∗r
y=Math.cos(Math.toRadians(angle))∗r







请到「今天看啥」查看全文