转自http://chroya.iteye.com/blog/924577
快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。    去年某个时候,我偶然看到一篇文章,讲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剪切出一块圆形区域,在其上绘制放大的部分。    两种方式的效果都一样,如图:

    放大两倍的效果。

     放大三倍

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

    工程见附件。

编辑器加载中...

转载于:https://www.cnblogs.com/meieiem/archive/2011/11/15/2249181.html

android 放大镜相关推荐

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

    快三个月了没写博客了,因为工作调动,很多经验.心得都没有时间记录下来.现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上.进入正题. 去年某个时候,我偶然看到一篇文章,讲android里面 ...

  2. android 放大镜动画,Android在图片上进行放大镜效果(放大镜形状)

    Android 图片上放大镜效果实现 1.[文件] ZoomView.java ~ 5KB     下载(55) package com.study.hello; import android.con ...

  3. android 放大镜 Magnifier 简单实现

    public class MainActivity extends Activity implements OnTouchListener {private int x;//绘画开始的横坐标 priv ...

  4. android 放大镜功能,Android实现放大镜效果的方法实例(附源码)

    前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView ex ...

  5. android 各类demo链接

    http://gundumw100.iteye.com/blog/940084 带磁性的悬浮窗体,类似于360绿色小人  主要实现的是:  1.悬浮所有窗体之上  2.有吸引力,吸附于屏幕边上  3. ...

  6. android代码精华 各路大神写的代码精华,大家一起分享

    http://blog.csdn.net/kan1kan5/article/details/41960259 http://gundumw100.iteye.com/blog/940084 带磁性的悬 ...

  7. Android图片不规则裁剪

    demo链接: Android自定义不规则裁剪 扩展链接: Android:谈谈最被误读的属性adjustViewBounds 定义:1.adjustViewBounds影响的是ImageView的比 ...

  8. linux命令hwclock,Linux命令之hwclock - 查询和设置硬件时钟

    常用参数 -r, --show         读取并打印硬件时钟(read hardware clock and print result ) -s, --hctosys      将硬件时钟同步到 ...

  9. android图片凹凸效果,图像滤镜处理算法:柔化、光照、放大镜、哈哈镜

    本文的最后提供了完整的Android工程下载,图像处理部分主要采用JNI,算法使用C实现,因为在开发过程中发现使用Java来进行数值处理时,速度绝对是不堪忍受的.现在代码中依然保留了一些Java的滤镜 ...

最新文章

  1. 【ACM】杭电OJ 1106 函数atoi
  2. .net 开源组件推荐 之 StackExchange
  3. 软件测试艺术一:程序正确性证明
  4. js操作元素节点对象innerHTML
  5. J2EE中下载和安装spring插件
  6. v-model数据绑定分析
  7. 太惨了,今年没年终奖了!
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的OA办公系统
  9. DLA SQL分析函数:SQL语句审计与分析的利器
  10. 阿里Seata的分布式事务实现
  11. Blender 常用快捷键记录 (二)
  12. 如何在linux上运行asp网站,linux上搭建asp网站
  13. 报错: com.alibaba.druid.pool.DruidDataSource : abandon connection, owner thread
  14. wait和notify,sleep
  15. 无线智能报警暨家电控制
  16. 宇视摄像头尾线防水处理
  17. dellT440和T620重装系统问题总结
  18. 系统设计-网关(一)
  19. 数据结构与算法-单链表的常见面试题(单链表的长度,单链表倒数第k个数据)
  20. oracle 查看scott权限,Oracle创建表空间、创建用户以及授权、查看权限 、scott解锁...

热门文章

  1. 六:Dubbo与Zookeeper、SpringMvc整合和使用
  2. 恢复Cisco3640的IOS
  3. 【转】DontDestroyOnLoad(Unity3D开发之五)
  4. capistrano
  5. [转]获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息)
  6. html+js浏览器检测
  7. 骁龙617 android7,骁龙617手机有哪些?骁龙617手机汇总
  8. ACM-最短路之中的一个个人的旅行——hdu2066
  9. 洛谷——P3807 【模板】卢卡斯定理
  10. 取出数组最大值与最小值