概述

我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。

源码分析

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放大镜效果实现相关推荐

  1. android远程打电话,Android打电话功能 Android实战教程第三篇之简单实现拨打电话功能...

    想了解Android实战教程第三篇之简单实现拨打电话功能的相关内容吗,杨道龙在本文为您仔细讲解Android打电话功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android拨打电话 ...

  2. Android好评功能,Android自定义View实现五星好评效果

    本文实例为大家分享了Android实现五星好评效果的具体代码,供大家参考,具体内容如下 这个效果想必大家都非常熟悉,那么Android如何自定义实现这种效果呢? 首先自定义属性: 下面看看具体实现: ...

  3. android Textview 功能,Android:TextView的常用功能

    android:autoText如果设置,将自动执行输入值的拼写纠正.此处无效果,在显示输入法并输入的时候起作用 android:bufferType指定getText()方式取得的文本类别.选项ed ...

  4. android提醒功能,android service实现循环定时提醒功能

    人每天都要喝8杯水才能保持健康,于是苦逼的程序员总是一遍代码就忘了时间,于是我突发奇想能不能开发一个apk能够实现固定的间隔时间定时提醒我要喝水了呢? apk基本功能: 1)能够设置间隔时间 2)在a ...

  5. android侧边栏功能,Android实现滑动侧边栏

    在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改.实现一个滑动侧边栏思路也很简单: ...

  6. android倒计时功能,android实现倒计时功能(开始、暂停、0秒结束)

    本文实例为大家分享了android实现倒计时功能的具体代码,供大家参考,具体内容如下 [思路]:通过 timer 执行周期延时的任务,handler 中将计时信息更新,并在计时结束时结束 timer ...

  7. android倒计时功能,Android 实现列表倒计时功能

    Android 实现列表倒计时功能 发布时间:2020-08-21 21:47:11 来源:脚本之家 阅读:147 作者:Choi晨 单个计时器,然后遍历数据 刷新条目: 两种实现方式:1.Handl ...

  8. android 放大镜功能,Android实现放大镜效果的方法实例(附源码)

    前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...

  9. android 侧滑功能,Android侧滑粘稠效果的实现

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 * 之前在UI中国上看到一个侧滑效果,觉得还不错,于是就想实现一下. UI效果是这样的:http://www.ui.cn/deta ...

  10. Android 分词功能,Android版中文分词:原理、接入和启动优化

    中文分词 中文分词功能是一项常用的基础功能,有很多开源的工程实现,目前能应用于Android手机端的中文分词器没有很完善的版本.经过调研,我选择了结巴分词,该开源工程思路简单,易于理解,分词效果也还不 ...

最新文章

  1. crt证书iis 中引用 程序目录提示 System.UnauthorizedAccessException:拒绝访问
  2. android视频拷到iphone6s,爱思助手怎么把电脑视频导入iphone6s
  3. 关于Nowpaper
  4. idea创建包怎么让包分层_干货 | 通勤包怎么选?我推荐这6只
  5. 自动刷新获取wifi信号强度,android
  6. 深入理解ASP.NET Core依赖注入
  7. 使用fuse.js_如何使用Fuse.js将搜索添加到React应用
  8. 使用VLC转码,在HTML5页面播放实时监控
  9. html5+shim脚本,HTML5探秘:用requestAnimationFrame优化Web动画
  10. python可变类型和不可变深浅拷贝类型_python3笔记十四:python可变与不可变数据类型+深浅拷贝...
  11. pip install 出现报asciii码错误的解决
  12. 8.Mac PHPStorm 快捷键
  13. 怎么制作你的第一个机器人
  14. paip 输入法编程----二级汉字2350个常用汉字2350个
  15. unity3D的FingerGestures插件
  16. PDF文件加密解密-文件设置密码
  17. Threejs入门之五:Threejs中的辅助对象
  18. 国内外AI绘画『文生图』大模型效果对比
  19. java访问domino数据库_关于Java与Domino数据库之间的操作
  20. 建设世界仪器强国的使命与任务

热门文章

  1. 淘宝API 添加上传商品图片
  2. 谷歌图像识别 API
  3. 中国高校IPv6升级成果初显,城市热点助力高校加快IPv6部署进程
  4. Python基础(8)字符串及常用操作
  5. python组合的语法_在Python中使用语法sugar-to-function组合是个好主意吗?
  6. 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517
  7. IDEA 安装字体 安装JetBrains Mono字体
  8. Python3---有关日期的处理---最近自然周最近自然月最近一周最近一月---dateutil模块
  9. CodeForces128A - Statues 解题报告
  10. 告警关联中的频繁项集挖掘问题