Android实现放大镜效果的方法实例(附源码)
程序员文章站
2023-12-21 00:02:58
前言
应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。
源码分析
publi...
前言
应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。
源码分析
public class shaderview extends view { private final bitmap bitmap; private final shapedrawable drawable; // 放大镜的半径 private static final int radius = 80; // 放大倍数 private static final int factor = 3; private final matrix matrix = new matrix(); public shaderview(context context) { super(context); bitmap bmp = bitmapfactory.decoderesource(getresources(),r.drawable.demo); bitmap = bmp; bitmapshader shader = new bitmapshader(bitmap.createscaledbitmap(bmp, bmp.getwidth() * factor, bmp.getheight() * factor, true), tilemode.clamp, tilemode.clamp); // 圆形的drawable drawable = new shapedrawable(new ovalshape()); drawable.getpaint().setshader(shader); drawable.setbounds(0, 0, radius * 2, radius * 2); } @override public boolean ontouchevent(motionevent event) { final int x = (int) event.getx(); final int y = (int) event.gety(); // 这个位置表示的是,画shader的起始位置 matrix.settranslate(radius - x * factor, radius - y * factor); drawable.getpaint().getshader().setlocalmatrix(matrix); // bounds,就是那个圆的外切矩形 drawable.setbounds(x - radius, y - radius, x + radius, y + radius); invalidate(); return true; } @override public void ondraw(canvas canvas) { super.ondraw(canvas); canvas.drawbitmap(bitmap, 0, 0, null); drawable.draw(canvas); } }
基本原理就是使用shapedrawable
构造一个圆形的drawable
,然后它的paint
的shader
设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。
不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。
再来看看放大镜的另外一种实现吧
public class pathview extends view { private final path mpath = new path(); private final matrix matrix = new matrix(); private final bitmap bitmap; // 放大镜的半径 private static final int radius = 80; // 放大倍数 private static final int factor = 2; private int mcurrentx, mcurrenty; public pathview(context context) { super(context); mpath.addcircle(radius, radius, radius, direction.cw); matrix.setscale(factor, factor); bitmap = bitmapfactory.decoderesource(getresources(), r.drawable.demo); } @override public boolean ontouchevent(motionevent event) { mcurrentx = (int) event.getx(); mcurrenty = (int) event.gety(); invalidate(); return true; } @override public void ondraw(canvas canvas) { super.ondraw(canvas); // 底图 canvas.drawbitmap(bitmap, 0, 0, null); // 剪切 canvas.translate(mcurrentx - radius, mcurrenty - radius); canvas.clippath(mpath); // 画放大后的图 canvas.translate(radius - mcurrentx * factor, radius - mcurrenty * factor); canvas.drawbitmap(bitmap, matrix, null); } }
这里使用的是path
类,将canvas
剪切出一块圆形区域,在其上绘制放大的部分。
源码下载:点击这里
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
推荐阅读
-
Android实现放大镜效果的方法实例(附源码)
-
Android编程实现仿美团或淘宝的多级分类菜单效果示例【附demo源码下载】
-
ASP.NET MVC使用ActionFilterAttribute实现权限限制的方法(附demo源码下载)
-
Android实现轮播效果的两种方法
-
Android基于API的Tabs3实现仿优酷tabhost效果实例
-
PHP在线调试执行的实现方法(附demo源码)
-
Android 中TextView中跑马灯效果的实现方法
-
Android自定义View的实现方法实例详解
-
Android实现下载zip压缩文件并解压的方法(附源码)
-
Android编程实现上方通知栏里闪动效果的方法