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);}
}

这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。

下面我们用这个工具来查看一套PC配置,让你看得更清楚,工程下载地址http://download.csdn.net/detail/hustpzb/4523274



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

他把数学书当小说看,初中没毕业却敢自荐中科大数学研究生,现在天才都这么狂妄了吗?...

全世界只有3.14 % 的人关注了爆炸吧知识他的脑子不太像人脑太聪明了今天,超模君来介绍一位看数学书像看小说一样的天才吧。他是初中没毕业,靠自学8年,便成为文 革后第一个被中科大破格录取的数学研究生。他只坚持做了10年数学研究&#xff0c…

MyEclipse6.5配置反编译插件

在MyEclipse6.5 的中安装jadclipse(反编译工具) 1.将jad.exe 复制到myeclipse安装目录的jre\bin目录下,如:C:\Program Files\MyEclipse 6.5\jre\bin\jad.exe ; 2.然后将net.sf.jadclipse_3.3.0.jar复制到myeclipse安装目录下的eclipse\plugin…

微软RPA工具Power Automate Desktop

什么是RPARPA(机器人流程自动化)系统是一种应用程序,它通过模仿用户在电脑上的操作方法, 实现自动化操作流程,协助人在计算机、手机等计算设备中完成重复的工作流任务。Power Automate Desktop2021年3月2日,Microsoft终于宣布面向…

java for循环的几种写法

J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。在Java程序中&…

MS UC 2013-2-Deploy Microsoft Exchange Server 2013-4-Post-Installation Tasks

Blog:http://dynamic.blog.51cto.com MSN:LiuJinFengmsn.com QQ:316190099《MS UC 2013 -系列》博文:1) 以TechNet Library为技术资料原型。2) 以0-《统一沟通-微软-实战》为基础。3) 以1-《统一沟通-微软-技巧》为参照。4&#x…

作为一个程序员,进步完全取决于自己

2015-12-14 我曾经在Hacker News网站上读过一篇帖子的评论,其中一个年轻的程序员说他们不想呆在那些只会让思想陈旧的老程序员离开而不是对他们再次培训的公司里,因为他明白,有一天他们也会这样。 也许这个人的本意是好的,但是他…

mysql 参数化 c_MySQL(16):参数化、封装

1.sql语句参数化创建testInsertParam.py文件,向学生表中插入一条数据#encodingutf-8import pymysqltry:connpymysql.connect(hostlocalhost,port3306,dbtest1,userroot,passwdmysql,charsetutf8)cs1conn.cursor()students_ninput("请输入学生姓名:&…

如何优雅地向导师/老板表示:“上周工作没什么进展”?

全世界只有3.14 % 的人关注了爆炸吧知识学生时代最怕导师问进度实验数据有了吗?结论有了吗?社畜时最怕老板问进度客户签合同了吗方案改出来了吗重点从来都不是被问,而是没什么进展还要硬着头皮汇报应对这种情况小编总结了三句口诀:反客为主&…

如何判断一个字符串是不是纯数字

代码:public class NumberDemo { public static void main(String[] args) { String str1"1122.2.2"; String str2"111"; String str3"111.2"; String str4"111s"; String str5"111.s"; String str6"…

如何在控制台应用程序中使用分布式日志Exceptionless

Exceptionless 在所有类型的 .NET 应用程序中运行。让我们来看看如何在控制台应用程序中开始使用 Exceptionless。要使用 Exceptionless,请像这样添加 Exceptionless 命名空间:using Exceptionless;完成后,定义 Exceptionless 客户端&#xf…

JavaScript开发的技巧

1、 使用取代 和!操作符会在需要的情况下自动转换数据类型。但和!不会,它们会同时比较值和数据类型,这也使得它们要比和!快。 1 if("1""1"){ //速度慢2 3 }4 if ("1" "1") { //速…

Android之如果解决Android studio项目里面的类名不能重命名

问题:改类名修改不了 今天师傅要我给那个在activity里面不规范的类名,类名是SearchUser.改成SearchUserActivity,发现改不了出了一下问题,如下图 如何解决的: 点击下面的(85:56)行&#xff0c…

python葡萄酒数据集_利用python分析红葡萄酒数据

在本次分析中,我使用了随机森林回归,并涉及数据标准化和超参数调优。在这里,我使用随机森林分类器,对好酒和不太好的酒进行二元分类。首先导入数据包:importnumpy as npimportpandas as pdimportmatplotlib.pyplot as …

Razor视图引擎浅析

从Web Form开始,视图的机制其实就没改变过,动态编译视图脚本。所不同的是,Razor就仅仅是模板,没在嵌入与网站等相关的东西,应该是SRP的一个体现。 可惜,这种功能分离仍做得不彻底,MVC中&#xf…

Codeforces 365C - Matrix(hash + yy)

题意:给定你一个数串s,再给你一个 a ,问你在矩阵d(第i,j个元素为si*sj)有多少个小矩形的和为a 解题思路:可知 a (s[x] s[x1] ....s[y])* (s[p]s[p1]....s[q]); 我们只需要枚举各字串的和…

耗时3年,集齐102位中国摄影师,央视这部纪录片BBC也无法超越......

全世界只有3.14 % 的人关注了爆炸吧知识地球上已知的植物有三十多万种,其中十分之一生长在中国。这些植物不仅为中国带来福祉,还不断迁徙到世界各地。在人类的不懈努力下,它们又获得了新的姿态,为不同的文明带来不一样的色彩。《影…

十五天精通WCF——第十一天 如何对wcf进行全程监控

说点题外话,我们在玩asp.net的时候,都知道有一个叼毛玩意叫做“生命周期”,我们可以用httpmodule在先于页面的page_load中 做一些拦截,这样做的好处有很多,比如记录日志,参数过滤,全局登录验证等…

Android之MVP 模式:简单易懂的介绍方式

转载:https://segmentfault.com/a/1190000003927200 Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了,我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模…

mysql dw解决方案_MySQL 的 DW 解决方案(MySQL + Infobright)

随着 BI (DW) 在各个企业中重要性的不断提升,各个数据库厂家都希望能搭上这辆班车。这不,MySQL 也联合 Infobright 一起推出了开源的 数据仓库解决方案,而且是开源的。 其实现的各种DW该有的功能就不多说了,但是 Infobright 有一点…

【原】Python基础-函数

#不定长参数,这里prams是一个元组集合def print_params(*prams): for e in prams: print(e) print(prams) #输出(xxx, (1, 2, 3), hello) print_params("xxx", (1,2,3), "hello") #关键字参数,使用参数名提供的参数,主要…