资源描述:
《自定义view实现水波纹效果》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、自定义view实现水波纹效果我先们来学习效果1:效果1实现本质:用一张波形图和一个圆形图的图片,然后圆形图在波形图上方,然后使用安卓的图片遮罩模式desIn(不懂?那么先记住有这样一个遮罩模式).(只显示上部图像和下部图像公共部分的下半部分),是不是很难懂?那么我在说清一点并且配图.假设圆形图在波形图上面,那么只会显示两者相交部分的波形图下面是解释效果图(正方形蓝色图片在黄色圆形上面):这次的实现我们都选择继承view,在实现的过程中我们需要关注如下几个方法:1.onMeasure():最先回调,用于控件的测
2、量;2.onSizeChanged():在onMeasure后面回调,可以拿到view的宽高等数据,在横竖屏切换时也会回调;3.onDraw():真正的绘制部分,绘制的代码都写到这里面;先来看看我们定义的变量://波形图BitmapwaveBitmap;//圆形遮罩图BitmapcircleBitmap;//波形图srcRectwaveSrcRect;//波形图dstRectwaveDstRect;//圆形遮罩srcRectcircleSrcRect;//圆形遮罩dstRectcircleDstRect;//
3、画笔Paintmpaint;//图片遮罩模式PorterDuffXfermodemode;//控件的宽intviewWidth;//控件的高intviewHeight;//图片过滤器PaintFlagsDrawFilterpaintFlagsDrawFilter;//每次移动的距离intspeek=10;//当前移动距离intnowOffSet;介绍一个方法:voidandroid.graphics.Canvas.drawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpai
4、nt)11此方法的参数:参数1:你的图片参数2:矩形.也就是说此矩形决定你画出图片参数1的哪个位置,比如说你的矩形是设定是Rectrect=newRect(0,0,图片宽,图片高)那么将会画出图片全部参数3:矩形.决定你图片缩放比例和在view中的位置.假设你的矩形Rectrect=newRect(0,0,100,100)那么你将在自定义view中(0,0)点到(100,100)绘画此图片并且如果图片大于(小于)此矩形那么按比例缩小(放大)来看看初始化方法//初始化privatevoidinit(){mpai
5、nt=newPaint();//处理图片抖动mpaint.setDither(true);//抗锯齿mpaint.setAntiAlias(true);//设置图片过滤波mpaint.setFilterBitmap(true);//设置图片遮罩模式mode=newPorterDuffXfermode(PorterDuff.Mode.DST_IN);//给画布直接设定参数paintFlagsDrawFilter=newPaintFlagsDrawFilter(0,Paint.DITHER_FLAG
6、Paint.
7、ANTI_ALIAS_FLAG
8、Paint.FILTER_BITMAP_FLAG);//初始化图片//使用drawable获取的方式,全局只会生成一份,并且系统会进行管理,//而BitmapFactory.decode()出来的则decode多少次生成多少张,务必自己进行recycle;//获取波形图waveBitmap=((BitmapDrawable)getResources().getDrawable(R.drawable.wave_2000)).getBitmap();//获取圆形遮罩图circleB
9、itmap=((BitmapDrawable)getResources().getDrawable(R.drawable.circle_500)).getBitmap();//不断刷新波形图距离读者可以先不看这部分内容因为需要结合其他方法newThread(){publicvoidrun(){while(true){try{//移动波形图nowOffSet=nowOffSet+speek;//如果移动波形图的末尾那么重新来if(nowOffSet>=waveBitmap.getWidth()){nowOffS
10、et=0;}sleep(30);postInvalidate();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}};}.start();}以下获取view的宽高并设置对应的波形图和圆形图矩形(会在onMesure回调后执行)@OverrideprotectedvoidonSizeCh