Android自己设置View_BitmapShader实现望远镜效果
日拱一卒,功不唐捐
一、背景
这个特效来源于有一天逛网站的时候,一家网站实现了这样的一个效果:在你向下滚动页面的时候,他的背景的图片随着你的滑动,以窗口的方式展现着图片的某一部分。浏览完就想着以Android的方式能不能实现,也就演变成了以下的效果。
Telescope
二、知识点BitmapShader
【官方】Shader用于绘制位图作为纹理。位图可以设置模式为重复或者镜像或者平铺。
简单来说,Shader可以用来实现少量渐变,反转,镜像,重复等效果。本文的效果核心使用的是Shader中的BitmapShader——位图Shader。
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
从构造方法可以看出,第一个参数为位图bitmap,第二个和第三个参数分别为横方向和纵方向的平铺模式。
平铺模式有如下几种模式:
- CLAMP :拉伸,水平拉伸图片左右方向最后一个像素,,垂直拉伸图片上下方向的最后一个像素。
- MIRROR:镜像,水平和垂直方向重复图像,交替镜像,使相邻的图像始终相连。
- REPEAT:重复,水平和垂直方向不断重复图片。
三、基本思路
1、创立一张图片,将画笔设置为带有图像填充功能;
2、根据获取手指所点击位置的坐标,根据取得的坐标绘制圆形或者者其余图形。
四、实现
从上述基本思路来看,步骤还是很简单,那么接下来分析实现的代码。
mPaint = new Paint(); mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.photo2);
首先就是初始化画笔和创立一张位图。接下来为核心内容。
mPaint.setShader(new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); canvas.drawCircle(400,400,300,mPaint);
BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)新创立一个BitmapShader,并将水平和垂直方向的平铺模式设置为CLAMP拉伸模式,将BitmapShader属性设置给画笔,使画笔具备图像填充功能,这是后面画笔可以绘制出一个带有图片的圆形的起因。接着利用Canvas在坐标(400,400)处绘制出一个半径为300的圆形。
目前基本的绘制已经结束,运行代码可以看出会有圆形图片在界面显示,如下图:
Paint.jpeg
从上面的图片来看,是不是发现其实这就是一个圆形的头像,到这里我们可以想到前面有一篇Android自己设置菱形图片使用PorterDuffXfermode的相关属性绘制菱形的头像,其实这里我们也可以使用BitmapShader进行操作,代码相比较更加简洁。
目前实现的是静态的图像,接下来实现随着手指动态移动的效果。
private float mTouchEventY = -1;private float mTouchEventX = -1; ...... @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mTouchEventX = event.getX(); mTouchEventY = event.getY(); return true; case MotionEvent.ACTION_MOVE: mTouchEventX = event.getX(); mTouchEventY = event.getY(); postInvalidate(); break; } postInvalidate(); return super.onTouchEvent(event); }
首先我们创立两个全局变量mTouchEventX,mTouchEventY。在onTouchEvent事件中,手指MotionEvent.ACTION_DOWN的时候,动态获取手指的位置,在ACTION_DOWN的代码中记得return true,这涉及到事件的分发机制,当return false时,代表手指的down事件未完成,那么事件将不会继续向下传递,也就是说ACTION_DOWN动作后的ACTION_MOVE是不会触发的。
同样的,我们在MotionEvent.ACTION_MOVE中也动态获取手指的位置,也就是随着手指动态调整圆形的位置。
最后在Canvas绘制圆形的时候,将获取到的位置设置进去,随着手指的不断移动,不断获取到位置值,也就实现了动态绘制图像的效果。
canvas.drawCircle(mTouchEventX,mTouchEventY,300,mPaint);
五、最后
在上述的过程中,发现BitmapShader可以很容易的实现不规则头像。另外,上述也只使用了BitmapShader的拉伸模式,还有镜像和重复模式可以实现更多的特效,有待发掘。
文章同步个人博客:https://fuusy.github.io
项目地址: fuusy/ShaderTelescope.git
公众号:小猿说
小猿说.jpg
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android自己设置View_BitmapShader实现望远镜效果