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剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样,如图:
放大两倍的效果。
放大三倍
貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。
android放大镜无广告,Android放大镜的实现代码相关推荐
- android 启动画面广告,Android 应用启动欢迎界面广告的实现实例
Android 应用启动欢迎界面广告 0.写在前面 在这篇教程中来实现一个类似于微信的的延迟3秒再进入主界面的效果. 1.项目准备 先新建一个空的android项目.里面只自带一个MainActivi ...
- android 网易item广告,Android仿网易严选商品详情页
仿照网易严选商品详情页面,整个页面分为两个部分,上面一部分是Native的ScrollView,下面一部分则是WebView,其目的是为了可以进行分步加载.滑动到ScrollView底部时,继续向上拖 ...
- android仿头条广告,Android仿今日头条手界面
public class MyIndicator extends HorizontalScrollView implements ViewPager.OnPageChangeListener { pr ...
- android崩溃无日志,Android 收集Crash日志----UncaughtExceptionHandler
Android应用不可避免地会发生crash,也称之为崩溃,无论你的程序写得多么完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕 ...
- android html拦截广告,Android WebView拦截iframe标签内部跳转教程
最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理. 比如,下面是一段html代码,嵌套这iframe标签, ...
- Android播放无声音,Android呼叫Mediaplayer播放无声音频
与Aurora push集成的项目. 从服务器推送的消息将由广播接收. 这时android 音频播放,广播跳到一个活动并在该活动中播放音频,但是每次推送都没有新消息. 任何声音. 代码如下androi ...
- android html拦截广告,android去除webview加载的html中的底部广告
目前自己在做一个视频app,资源使用第三方的视频html,但是发现有有的视频资源html有广告,所以就有了这篇记录 找到的这个有广告的html,底部广告是动态的添加到网页底部的 方式一 :onPage ...
- 土豆视频外部调用无广告播放器代码
视频调用无广告演示: <embed src="http://marketing.tudou.com/global/dwPlayer/DiggPlayer.swf?iid=1702223 ...
- 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
魔力视频播放器是一种视频播放器,适用于Android,Windows Phone,IOS,支持RMVB.AVI.MKV.FLV.FLAC.APE等格式文件. 支持UPnP(DLNA),可以把电影放在存 ...
最新文章
- MP实战系列(二)之集成swagger
- 如何使用拦截器获取Controller方法名和注解信息?
- 40 个 SpringBoot 常用的注解,你知道几个?
- 通信数字信号处理基本知识
- Linux用户和组相关的配置文件
- phpStudy mysql升级至5.7
- 收藏!5V转3.3V电平的19种方法技巧
- 总是忘记的oracle 函数
- 华为发布《大交通时代》:开启未来数字交通宏图
- [BZOJ2820]YY的GCD
- vba编写的出库单(可添加出库项目记录、生成、打印出库单)
- IceSword1.22冰刃驱动枚举网络端口逆向分析
- 英语语法(1)——简单句
- 一个百万富翁碰到一个陌生人,陌生人找他谈了一个换钱的计划.该计划如下:我每天给你10万,而你第一天给我一分钱,第二天我仍给你十万,你给我二分钱,第三天我仍给你十万,你给我四分钱......你每天给我的
- 华润微CS88M312单片机带ADC 的8位低功耗MCU
- Java版本电子招标采购系统源代码—企业战略布局下的采购寻源
- Visual Studio 2008 项目安装和部署
- Virtualbox centos虚拟机网络互联总结
- 少壮不努力 老大徒伤悲
- 计算机网络实用知识,计算机网络实用技术知识点之ISDN的定义及特性
热门文章
- 计算机故障检修课过时,第三场公开课|电脑故障维修以及笔记本知识科普
- php分布式的锁,laravel分布式并发锁
- java 枚举迭代_Java中的枚举和迭代器之间的区别
- servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
- 算法设计与分析复习第一二章(时间复杂度和蛮力法)
- 故障error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: “
- mysql 导入导出脚本_MySQL导入和导出sql脚本
- 华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
- linux设置命令nmui,Linux网络配置及管理
- sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)