android放大镜无广告,Android放大镜的实现代码

快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。

去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。

Java代码

package chroya.demo.magnifier;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.BitmapShader;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Shader.TileMode;

import android.graphics.drawable.ShapeDrawable;

import android.graphics.drawable.shapes.OvalShape;

import android.view.MotionEvent;

import android.view.View;

/**

* 放大镜实现方式1

* @author chroya

*

*/

public class ShaderView extends View{

private Bitmap bitmap;

private ShapeDrawable drawable;

//放大镜的半径

private static final int RADIUS = 80;

//放大倍数

private static final int FACTOR = 3;

private Matrix matrix = new Matrix();

public ShaderView(Context context) {

super(context);

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show);

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设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。

不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。

玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。

再来看看放大镜的另外一种实现吧 ^-^

Java代码

package chroya.demo.magnifier;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Path;

import android.graphics.Path.Direction;

import android.view.MotionEvent;

import android.view.View;

/**

* 放大镜实现方式2

* @author chroya

*

*/

public class PathView extends View{

private Path mPath = new Path();

private Matrix matrix = new Matrix();

private 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.show);

}

@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剪切出一块圆形区域,在其上绘制放大的部分。

两种方式的效果都一样,如图:

90000d278f65542d0a7a747bfb5e9632.png

放大两倍的效果。

ba453ea30ab9cb84ef78d17c82581813.png

放大三倍

貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。

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

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

相关文章

鸿蒙和宙斯谁厉害,漫威宇宙宙斯vs奥丁,到底谁更强

宙斯在漫威里,是希腊神话中的众神之王,奥林匹斯十二主神之一,也是奥林匹斯大部分神和神奇女侠戴安娜的父亲,同时也是沙赞的力量来源之一能力:不朽(只有宙斯的血能杀死宙斯)宙斯神力雷霆之怒控制天气宙斯的力量并不是某…

背计算机专业英语词汇,计算机专业英语词汇1500词(五)

201. exit n. & vi. 出口;退出202. report vt. & n. 报告,报表203. execution n. 执行204. backup n. 备份,后备,后援205. version n. 版本206. find v. 寻找,发现207. pointer n. 指针,指示字208.…

优考试在线考试系统计算机,使用优考试在线考试系统解决企业员工考核评比

随着信息时代的高速发展,很多实体传统的东西已经慢慢搬到网络上了,在线考试就是在其中发展的很迅速的一种,企业的员工考核、员工的培训、评比都可以使用企业在线考试系统来解决了,电脑微信小程序手机考试相结合,让考试…

计算机专业申请phd美国,美国计算机专业博士的申请个人陈述范文

美国计算机专业博士的申请个人陈述范文2020-08-24 618人阅读摘要:美国计算机专业博士的申请个人陈述范文美国计算机专业博士申请个人陈述范文共享,公文个人陈述是美国博士申请公文中非常关键的构成部分,针对计划申请办理美国计算机专业博士研究生的同学们…

计算机桌面壁纸怎样拉伸,win10桌面壁纸怎么拉伸?手把手教你拉伸win10桌面壁纸的方法...

现在大家喜欢用自己拍摄的照片做电脑桌面壁纸,设置好win10桌面壁纸后,总感觉壁纸很显大,想要重新拉伸一下。那么win10桌面壁纸如何拉伸?针对此疑问,小编手把手教你拉伸win10桌面壁纸的方法。1、首先来看一下原因&#…

html+dom+深入,DOM 深入学习 - 1

本文章记录本人在深入学习Javascirpt DOM中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。DOM 版本w3c 指定的DOM规范包括多个版本,不同的版本(或称知为级别)又包含不同的子规法和模块,不同浏览器对DOM的支持…

计算机应用常用的30个函数,Excel中常用函数的使用

ISSN1009—30“咖船rKno别b内eand伯叻肋叻电奠知识…

cam350怎么看顶层_厉害的人是怎么分析问题的?(实操干货)

“经常做一个方案,几十页PPT还没把问题讲清楚,老板一个问题就貌似发现了关键,这到底是一种怎么样的思维方式?”我在职场这么多年,也遇到过很多次这样的问题。在我初入职场时,经领导点拨后,也产生…

抓球球的机器人应该怎么玩_王者荣耀:在游戏中当自己优势队友劣势的时候应该怎么玩?...

游戏里时常会有这么一种情况出现,我们疯狂Carry,一看战绩十几杠几,C得不行,但是队伍就是要输,颓势总是无法挽回。今天我就给大家说一下,是什么样的原因导致这种情况的发生。队友劣势的原因分析:…

ajax获得excel文件流在前端打开_主流前端技术讲解,面试必考!

Vue.js是Web前端的一个框架,用来快速开发单页面应用。当Vue.js开发变成主流的时候,许多公司的技术团队都打算把下一个新项目换成用Vue.js来开发。但是当我们详细了解Vue.js以后,会发现一个很尴尬的问题,那就是Vue.js的页面是采用客…

计算机无法用telnet,telnet不是内部或外部命令解决办法 Windows10开启Telnet功能方法...

一般情况下,Windows10正式版系统的telnet服务都是处于关闭状态的,需要我们手动开启才可以。telnet服务可以调试端口,其重要性不容小视。今天,就告诉教大家Windows如何配置telnet服务?虽然说今天以Windows10来示例&…

计算机主板另一个名称,主板名称太复杂 看这几点就秒懂了

现在的主板厂商特看重个性化和市场细分,恨不得给每个人定制最适合的主板,所以主板型号多到爆,名称还都特别长,看得人眼晕还看不懂。其实这些名字虽然拉拉杂杂一长串,但都带有很好理解的“关键词”,只要扫一…

亚马逊产品描述计算机语言编辑,亚马逊Listing产品描述编辑讲解

烂人的虚伪我从头看到尾优质答主01-24TA获得超过2782个赞自建listing,就是根据自己的产品,自己打造产品客户端的展示内容,让顾客了解自己的产品,有下单的欲望!建好如果效果不好,还要进行优化,最…

计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看

电脑硬盘内存怎么查看在我们买电脑的时候我们一般都会选择去看看电脑硬盘内存的大小。那么电脑硬盘内存怎么查看呢?下面就由jy135小编来告诉大家吧,欢迎阅读。方法一、在电脑系统中查看1、这里以 Windows7 系统为例,选中桌面的“计算机”图标&#xff0…

linux messages 时间错乱_BATJ 常考的 21 条 Linux 命令,速度收藏!

来源: http://t.cn/EqTIhES一、文件和目录1. cd命令(它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径)cd /home 进入 / home 目录cd .. 返回上一级目录 cd ../.. 返回上两级目录 …

layui导航栏页面滚动固定_网站建设页面导航如何降低用户寻找的时间

做为正确引导客户体验网站的莱单导航栏,从检索视角上而言,也起着关键的功效,莱单导航栏不但联系网站的外界,也联系着网站主页面及其别的网页,是全部网站的“管理中心”,因此网站建设中莱单导航栏设计方案&a…

c++ new 数组_用Java实现JVM第八章《数组和字符串》

案例介绍本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串。本章需要新增实现数组指令;newarray、anewarray、arraylength、aload、astore、multianewarray、ldc,同时需要…

计算机IP为什么只有255,为什么电脑IP地址最大值是255?

一、为什么电脑IP地址最大值是255?目前我们常用的IP地址叫IPV4地址,如IP地址:192.168.1.1它是4个字节(Byte)的数据,在计算机中1个字节(Byte)8个二进制位(bit)所以一个IP地址共有4832个二进制位,通常被分割为4组&#x…

c++数据结构队列栈尸体_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)...

第三章:栈和队列下面讲解栈的应用主要内容有:栈的应用、括号匹配、中 后 前 缀表达式转换1.栈的应用1.1括号匹配我们在数学运算中 [(Ab)*c] - (E-F) 往往都会有[ ] 和 ( ) 来表示运算的优先级,我们把这样的[ ] 和 ( ) 提取出来组成的序列叫做…

测试你是什么样的双眼皮软件,来测试你适合哪种双眼皮?

你的脸型适合哪种双眼皮?自己可以来测试下很多人喜欢大眼睛,双眼皮,觉得越宽越大越好看。我觉得只要和自己五官协调就是最好看的。不同脸型适合什么样的双眼皮?1、平行型:适合眼睛比较大、眉弓比较高、眉毛距眼睛较远且…