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

去年某个时候,我偶然看到一篇文章,讲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放大镜的实现代码相关推荐

  1. android 启动画面广告,Android 应用启动欢迎界面广告的实现实例

    Android 应用启动欢迎界面广告 0.写在前面 在这篇教程中来实现一个类似于微信的的延迟3秒再进入主界面的效果. 1.项目准备 先新建一个空的android项目.里面只自带一个MainActivi ...

  2. android 网易item广告,Android仿网易严选商品详情页

    仿照网易严选商品详情页面,整个页面分为两个部分,上面一部分是Native的ScrollView,下面一部分则是WebView,其目的是为了可以进行分步加载.滑动到ScrollView底部时,继续向上拖 ...

  3. android仿头条广告,Android仿今日头条手界面

    public class MyIndicator extends HorizontalScrollView implements ViewPager.OnPageChangeListener { pr ...

  4. android崩溃无日志,Android 收集Crash日志----UncaughtExceptionHandler

    Android应用不可避免地会发生crash,也称之为崩溃,无论你的程序写得多么完美,总是无法完全避免crash的发生,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕 ...

  5. android html拦截广告,Android WebView拦截iframe标签内部跳转教程

    最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理. 比如,下面是一段html代码,嵌套这iframe标签, ...

  6. Android播放无声音,Android呼叫Mediaplayer播放无声音频

    与Aurora push集成的项目. 从服务器推送的消息将由广播接收. 这时android 音频播放,广播跳到一个活动并在该活动中播放音频,但是每次推送都没有新消息. 任何声音. 代码如下androi ...

  7. android html拦截广告,android去除webview加载的html中的底部广告

    目前自己在做一个视频app,资源使用第三方的视频html,但是发现有有的视频资源html有广告,所以就有了这篇记录 找到的这个有广告的html,底部广告是动态的添加到网页底部的 方式一 :onPage ...

  8. 土豆视频外部调用无广告播放器代码

    视频调用无广告演示: <embed src="http://marketing.tudou.com/global/dwPlayer/DiggPlayer.swf?iid=1702223 ...

  9. 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器

    魔力视频播放器是一种视频播放器,适用于Android,Windows Phone,IOS,支持RMVB.AVI.MKV.FLV.FLAC.APE等格式文件. 支持UPnP(DLNA),可以把电影放在存 ...

最新文章

  1. MP实战系列(二)之集成swagger
  2. 如何使用拦截器获取Controller方法名和注解信息?
  3. 40 个 SpringBoot 常用的注解,你知道几个?
  4. 通信数字信号处理基本知识
  5. Linux用户和组相关的配置文件
  6. phpStudy mysql升级至5.7
  7. 收藏!5V转3.3V电平的19种方法技巧
  8. 总是忘记的oracle 函数
  9. 华为发布《大交通时代》:开启未来数字交通宏图
  10. [BZOJ2820]YY的GCD
  11. vba编写的出库单(可添加出库项目记录、生成、打印出库单)
  12. IceSword1.22冰刃驱动枚举网络端口逆向分析
  13. 英语语法(1)——简单句
  14. 一个百万富翁碰到一个陌生人,陌生人找他谈了一个换钱的计划.该计划如下:我每天给你10万,而你第一天给我一分钱,第二天我仍给你十万,你给我二分钱,第三天我仍给你十万,你给我四分钱......你每天给我的
  15. 华润微CS88M312单片机带ADC 的8位低功耗MCU
  16. Java版本电子招标采购系统源代码—企业战略布局下的采购寻源
  17. Visual Studio 2008 项目安装和部署
  18. Virtualbox centos虚拟机网络互联总结
  19. 少壮不努力 老大徒伤悲
  20. 计算机网络实用知识,计算机网络实用技术知识点之ISDN的定义及特性

热门文章

  1. 计算机故障检修课过时,第三场公开课|电脑故障维修以及笔记本知识科普
  2. php分布式的锁,laravel分布式并发锁
  3. java 枚举迭代_Java中的枚举和迭代器之间的区别
  4. servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
  5. 算法设计与分析复习第一二章(时间复杂度和蛮力法)
  6. 故障error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: “
  7. mysql 导入导出脚本_MySQL导入和导出sql脚本
  8. 华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
  9. linux设置命令nmui,Linux网络配置及管理
  10. sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)