现实中使用放大镜可以放大对应的区域,软件中有时候也会用到放大镜功能,比如图片上某一点看不清楚,你不需要将整张图片都放大,只需要放大你想看到的部分,这个时候放大镜就派上用场了。

1.实现原理

如何实现放大镜的原理呢?一种方式我们可以采用将原图中的局部区域提取裁剪,然后在图片顶层的自定义控件上放大对应的倍数展示即可;另外一个种方式是将整图都放大相应的倍数,然后截取需要显示的区域,间接实现放大的效果,我使用的是第二种方法。

当然会涉及到平移,绘制边框的附加构件。

下面是实现的自定义类,具体注释见代码:

package com.example.zoompicview;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;/*** @Description TODO 图片放大镜控件实现*/
public class ZoomToolView extends View {private Path path;private Matrix matrix;private Paint paint;private Bitmap bitmap;private static final int RADIUS = 80;// 放大镜半径private static final int FACTOR = 3; // 放大系数private static final int STROKE = 4; // 附加线条宽度private float currentX, currentY;public ZoomToolView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public ZoomToolView(Context context, AttributeSet attrs) {super(context, attrs);init();}public ZoomToolView(Context context) {super(context);init();}private void init() {path = new Path();path.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW);matrix = new Matrix();matrix.setScale(FACTOR, FACTOR);paint = new Paint();paint.setAntiAlias(true);paint.setDither(true);paint.setStrokeWidth(STROKE);paint.setColor(Color.WHITE);paint.setStyle(Paint.Style.STROKE);}public Bitmap getBitmap() {return bitmap;}// 设置Bitmappublic void setBitmap(Bitmap bitmap) {if (null != bitmap) {this.bitmap = bitmap;} else {try {throw new Exception("bitmap can't be null");} catch (Exception e) {e.printStackTrace();}}}@SuppressLint("ClickableViewAccessibility")@Overridepublic boolean onTouchEvent(MotionEvent event) {if (null == bitmap) {return super.onTouchEvent(event);}currentX = event.getX();currentY = event.getY();// 控制不会移动出图片边界if (currentX > bitmap.getWidth()) {currentX = bitmap.getWidth();} else if (currentX < 0) {currentX = 0;}if (currentY > bitmap.getHeight()) {currentY = bitmap.getHeight();} else if (currentY < 0) {currentY = 0;}invalidateView();return true;}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (null == bitmap) {try {throw new Exception("please setBitmap, bitmap can't be null");} catch (Exception e) {e.printStackTrace();}}// 底图canvas.drawBitmap(bitmap, 0, 0, null);// 剪切canvas.translate(currentX - RADIUS, currentY - RADIUS);canvas.clipPath(path);// 移动到path剪切部分显示canvas.translate(RADIUS - currentX * FACTOR, RADIUS - currentY * FACTOR);canvas.drawBitmap(bitmap, matrix, null);// 反向平移并绘制十字和外边框canvas.translate(currentX * FACTOR - RADIUS, currentY * FACTOR - RADIUS);Path line = new Path();line.moveTo(0, RADIUS);line.lineTo(RADIUS * 2, RADIUS);line.moveTo(RADIUS, 0);line.lineTo(RADIUS, RADIUS * 2);canvas.drawPath(line, paint);canvas.drawCircle(RADIUS, RADIUS, RADIUS - STROKE, paint);}private void invalidateView() {if (Looper.getMainLooper() == Looper.myLooper()) {invalidate();} else {postInvalidate();}}}

2.效果图

顶部的放大镜可以随着手指的移动而移动。

3.Demo 下载

点此下载

图片局部放大镜,可在大图上下左右移动并放大对应的区域相关推荐

  1. 抖音短视频系统开发图片局部放大镜,可在大图上下左右移动并放大对应的区域

    如何实现放大镜的原理呢?一种方式我们可以采用将原图中的局部区域提取裁剪,然后在图片顶层的自定义控件上放大对应的倍数展示即可:另外一个种方式是将整图都放大相应的倍数,然后截取需要显示的区域,间接实现放大 ...

  2. jquery图片局部放大镜特效

    部分代码(完整包见资源下载链接) 注:资源上传时默认付费,可以私信我,我看到会回复的 <!DOCTYPE html> <html><head><meta ch ...

  3. opencv图片局部放大镜

    本文可以正常运行,请放心使用. 本文参考博客https://blog.csdn.net/pw1623/article/details/88429661,本文系为这篇博客的学习与改进,添加一些详细的注释 ...

  4. 马赛克 php,php实现图片局部打马赛克的方法

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  5. Html之实例练习(轮播图片、放大镜效果、面板拖动)

    文章目录 一.轮播图片 二.放大镜效果 三.面板拖动 本篇将简单演示一下HTML里的轮播图片.放大镜效果和面板拖动的实例,代码已经打包在文章开头,需要参考的请自行下载 一.轮播图片 1.效果图 2.J ...

  6. svg模糊图片局部清晰透视图

    demo下载地址: http://download.csdn.net/download/one_girl/10163426 html代码: <body><div class=&quo ...

  7. android从九宫格全屏预览,仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图...

    AssNineGridView 仿微信朋友圈展示图片的九宫格图片展示控件,支持点击图片全屏预览大图(可自定义). 写在前面 这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀 ...

  8. 马赛克 php,php实现图片局部打马赛克的方法_php技巧

    本文实例讲述了php实现图片局部打马赛克的方法.分享给大家供大家参考.具体分析如下: 原理: 对图片中选定区域的每一像素,增加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起,就形成了马赛克效果. ...

  9. 如何进行图片局部转TXT文档

    在很多时候大家想要把图片上的文字保存大文档中,都是使用打字的方法,将图片上的文字输入到电脑中,这个方法很笨拙,我们怎么样才能把图片上的局部文字轻轻松松,不费丝毫力气转换到TXT文档中呢?这个时候小编就 ...

最新文章

  1. 云效(原RDC)如何构建一个基于Maven的Java项目
  2. Spring常见的十八中异常Exception
  3. Netflix 如何使用机器学习来提升流媒体质量
  4. JAVA记事本的图形用户界面应用程序含过滤
  5. gSOAP中内存的使用
  6. 一个好用的浏览器暗色浏览插件 Dark Reader
  7. 谷歌能否赶上「元宇宙」这趟快车?
  8. 分布式精华问答:分布式环境下如何保持数据一致性的?| 技术头条
  9. MySQL内核月报 2015.01-MySQL · 捉虫动态· replicate filter 和 GTID 一起使用的问题
  10. 2017杭州云栖大会FAQ(持续更新中)
  11. 业务流程背后的服务管理
  12. kickstart-F
  13. 年末十家手机银行数字化升级大盘点:谁家开发更全面?谁家建设更到位?
  14. 有向图(3.基于十字链表的c++实现)
  15. 网络运维中静态路由 三层交换技术 动态路由 OSPF协议的配置
  16. matlab表示颜色的词语三个字,三个字的形容颜色的词语
  17. AT32F435/437的如何选择选择代码启动地址
  18. Neural Feature Search for RGB-Infrared Person Re-Identification
  19. 《次世代数据存储思维与技术》大纲
  20. VR系列——Oculus Audio sdk文档:一、虚拟现实音频技术简介(1)——概述

热门文章

  1. 想搞定巴西客户?先学学巴西的“淘宝”
  2. B2B2C多用户商城系统运营的小技巧
  3. nodejs 编写发送邮件 nodemailer
  4. echarts展示国内各省各市地图
  5. python汉语分词_使用python进行汉语分词-乾颐堂
  6. 长尾分布系列论文解析(一)Decoupling Representation and Classifier for Long-Tailed Recognition
  7. 万兴软件公司总裁吴太兵:软件出口——中国通用软件产业的春天
  8. Ralink WIFI driver发送速率选择算法分析
  9. 淘宝秒杀脚本(python学习笔记)
  10. 案例!智慧物流系统的规划思路