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,一经查实,立即删除!

相关文章

android获取3g或wifi流量信息,Android代碼----android獲取3G或wifi流量信息

Android代碼----android獲取3G或wifi流量信息日期:2017/2/23 18:01:39 &nbsp 編輯:關於Android編程android獲取3G或wifi流量信息:[java]IBatteryStats battryStats IBatteryStats.Stub.asInterface(ServiceManager.getService("…

如何在android进行ltp测试,Android系统完整性度量架构IMA-EVM

错误2:/bin/bash:m4: command not found解决 :sudo apt-get install m4错误3:prebuilts/misc/linux-x86/bison/bison:No such file or directory原因 :ubuntu64位系统运行32位程序的问题,需要安装运行32位程序的兼容…

android 如何 root权限获取,如何获取android手机root权限获取

安卓手机的卡与不卡,和是否root无关。安卓的卡,是其开发时就注定的,其原因如下:1.内存小/少手机内存在手机出厂的时候就已经固定了,其总量无法调整,不能像电脑一样加内存条。所以想提升可用内存&#xff0c…

日语输入法 android8.0,讯飞输入法发布 AndroidV8.0.6855 专注提升输入效率

作为最懂用户的讯飞输入法,近日发布全新 Android V8.0.6855 版本,坚持以用户体验为基础,不断优化产品性能,提升用户体验。本次新版更加专注于输入效率,带来了 BiuBiu 键盘、离线语音等多个输入功能的提升。BiuBiu 键盘…

imx6 android快速启动,freescale imx6 开机启动速度优化之Bootchart工具的使用问题

之前有安装bootchart,先执行以下命令,卸载掉bootchart工具sudo apt-get autoremove bootchartbootchart安装1、安装$sudo apt-get install bootchart$sudo apt-get install pybootchartgui2、编写android 上log文件的打包和自动生成bootchart.png的脚本文…

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

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

html 输入框 相加,JS中,如何实现两个输入框中内容的数字相加?

事件function count(){var adocument.getElementById("txt1").value;var bdocument.getElementById("txt2").value;var fdocument.getElementById("select").value;switch(f){case :document.getElementById("fruit").valueab;break;c…

多层html怎么找到密码输入框,Vant PasswordInput 密码输入框

介绍带网格的输入框组件,可以用于输入支付密码、短信验证码等,通常与数字键盘组件配合使用引入import Vue from vue;import { PasswordInput, NumberKeyboard } from vant;Vue.use(PasswordInput);Vue.use(NumberKeyboard);代码演示基础用法:value"…

2021曾都二中高考成绩查询入口,2021高考-随州设4个考区11个考点·

今起距2021年高考还有9天学子们也将进入最后的冲刺时间距离高考还有9天近日随州日报记者从市招生考试委员会获悉2021年随州市普通高考考试报名人数14010人共设四个考区11个考点组织考试随州2021年普通高考报名人数14010人,其中市直5639人,随县1632人&…

背计算机专业英语词汇,计算机专业英语词汇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人阅读摘要:美国计算机专业博士的申请个人陈述范文美国计算机专业博士申请个人陈述范文共享,公文个人陈述是美国博士申请公文中非常关键的构成部分,针对计划申请办理美国计算机专业博士研究生的同学们…

计算机网络中tdm是什么,计算机网络-复习题(1)

《计算机网络》期末复习题1、TCP/IP体系结构定义了一个几层模型?2、对于协议ICMP、ARP、PPP、RARP不属于TCP/IP协议的网络层协议的是那个?3、以下四个IP地址哪个是不合法的主机地址的是那个?A.10011110.11100011.01100100.10010100B. 1110111…

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

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

中北大学计算机学,中北大学计算机类专业好吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼该专业排名全国75,比兰州大学,太原理工,中国地质等前得多,排名来自教育。2北京工商大学C73河北工程大学C74石家庄铁道大学C75中北大学C76东北电力大学C77长春工业大学C78上海师范大学…

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

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

计算机课件知识,计算机基础知识1认识计算机课件.ppt

《计算机基础知识1认识计算机课件.ppt》由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关《计算机基础知识1认识计算机课件.ppt》文档请在天天文库搜索。1、计算机基础知识(一)认识计算机知道一台完整PC(个人计算机)由哪些硬…

计算机网络与通信的课程报告,计算机网络与通信课程设计报告.doc

第第 PAGE \* MERGEFORMAT 1 页 共 NUMPAGES \* MERGEFORMAT 63 页PAGE \* MERGEFORMAT1《计算机网络与通信》课程设计报告题 目: 计算机网络与通信课程设计姓 名: 林征丹 林志斌专 业: 通信工程班 级: 141学 号: 201…

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

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

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

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