Android之放大镜实现的两种方式
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);// 圆形的drawabledrawable = new ShapeDrawable(new OvalShape());drawable.getPaint().setShader(shader);drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic boolean onTouchEvent(MotionEvent event) {mCurrentX = (int) event.getX();mCurrentY = (int) event.getY();invalidate();return true;}@Overridepublic 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);}
}
Android之放大镜实现的两种方式相关推荐
- android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...
本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...
- Android点击图片随机,android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...
- android打开另外的app两种方式,内置到自己本身的app,重新打开app,
android打开另外的app两种方式,内置到自己本身的app空间,重新打开app空间, 目录 1.内置到自己本身的app空间, 2.重新打开app空间, 1.内置到自己本身的app空间, 被打开的a ...
- Android页面数据传递的两种方式
在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...
- android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的idivBg = ...
- android动态居中布局,Android动态添加布局的两种方式
释放双眼,带上耳机,听听看~! 前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的 ...
- android动态改变布局,Android 动态添加布局的两种方式
前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的两种方式,分别是 动态添加xml ...
- android客户端认证服务端的两种方式
Your app shouldn't suffer SSL's problems http://thoughtcrime.org/blog/authenticity-is-broken-in-ssl- ...
- Android获取IP地址的两种方式(准确版)
原文:https://blog.csdn.net/sinat_16458039/article/details/50260589 最近看了好多网上获取IP地址的例子,发现好多都不完全准确,这里我写一下 ...
最新文章
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行...
- tomcat 部署站点时遇到的部分问题以及解决方案
- 【Flutter】Flutter 调试 ( 调试控制相关功能 | 断点管理 | 代码运行控制 )
- 表的插入、更新、删除、合并操作_17_按照条件删除表中记录
- c#按ESC退出 或者接受其他键盘消息
- native2ascii命令
- anaconda和python都有_Anaconda和python有什么区别-Anaconda和python区别介绍
- apb外设怎么分配地址
- android的蓝牙和数据库的开源项目地址
- KlayGE 4.4中渲染的改进(三):高质量无限地形
- 加权二叉树的实现与单元测试(python)
- 江山三侠—Flash短片轻松学(第2季)
- 泰勒公式的计算机应用,泰勒公式应用
- ASTC压缩格式总结
- [UVALive 4490] Help Bubu
- 从MWC到AWE,中国柔性黑科技为消费电子产业撒下蒲公英的种子
- coldfusion_ColdFusion中的数据结构简介
- golang中的包管理工具——govendor和godep简单学习
- Python模块学习 ---- struct 数据格式转换
- session机制详解
热门文章
- 跟我一起学.NetCore之日志(Log)模型核心
- Swagger扩展为你添油加气
- 死磕 Redis,我有这么几招
- .NET 5.0预览版6发布:支持Windows ARM64设备
- 这一次,终于弄懂了协变和逆变
- 解析“60k”大佬的19道C#面试题(上)
- 基于 Redis 实现 CAS 操作
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
- Asp.net Core全局异常监控和记录日志
- 基于 EntityFramework 生成 Repository 模式代码