android放大镜效果实现

简介: <div style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> <div class="dp-highlighter bg_html" style="font-family:Consolas,'Courier New',Courier,mono,serif; font-size:
  1. public class ShaderView extends View {  
  2.     private final Bitmap bitmap;  
  3.     private final ShapeDrawable drawable;  
  4.     // 放大镜的半径  
  5.   
  6.     private static final int RADIUS = 80;  
  7.     // 放大倍数  
  8.   
  9.     private static final int FACTOR = 3;  
  10.     private final Matrix matrix = new Matrix();  
  11.   
  12.     public ShaderView(Context context) {  
  13.         super(context);  
  14.         Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.demo);  
  15.         bitmap = bmp;  
  16.         BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bmp,  
  17.                 bmp.getWidth() * FACTOR, bmp.getHeight() * FACTOR, true),  
  18.                 TileMode.CLAMP, TileMode.CLAMP);  
  19.         // 圆形的drawable  
  20.   
  21.         drawable = new ShapeDrawable(new OvalShape());  
  22.         drawable.getPaint().setShader(shader);  
  23.         drawable.setBounds(0, 0, RADIUS * 2, RADIUS * 2);  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onTouchEvent(MotionEvent event) {  
  28.         final int x = (int) event.getX();  
  29.         final int y = (int) event.getY();  
  30.         // 这个位置表示的是,画shader的起始位置  
  31.   
  32.         matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR);  
  33.         drawable.getPaint().getShader().setLocalMatrix(matrix);  
  34.         // bounds,就是那个圆的外切矩形  
  35.   
  36.         drawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS, y + RADIUS);  
  37.         invalidate();  
  38.         return true;  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onDraw(Canvas canvas) {  
  43.         super.onDraw(canvas);  
  44.         canvas.drawBitmap(bitmap, 0, 0, null);  
  45.         drawable.draw(canvas);  
  46.     }  
  47. }  


基本原理就是使用ShapeDrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。

不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。


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

[html]  view plain copy
  1. public class PathView extends View {  
  2.     private final Path mPath = new Path();  
  3.     private final Matrix matrix = new Matrix();  
  4.     private final Bitmap bitmap;  
  5.     // 放大镜的半径  
  6.   
  7.     private static final int RADIUS = 80;  
  8.     // 放大倍数  
  9.   
  10.     private static final int FACTOR = 2;  
  11.     private int mCurrentX, mCurrentY;  
  12.   
  13.     public PathView(Context context) {  
  14.         super(context);  
  15.         mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW);  
  16.         matrix.setScale(FACTOR, FACTOR);  
  17.   
  18.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.demo);  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean onTouchEvent(MotionEvent event) {  
  23.         mCurrentX = (int) event.getX();  
  24.         mCurrentY = (int) event.getY();  
  25.   
  26.         invalidate();  
  27.         return true;  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onDraw(Canvas canvas) {  
  32.         super.onDraw(canvas);  
  33.         // 底图  
  34.   
  35.         canvas.drawBitmap(bitmap, 0, 0, null);  
  36.         // 剪切  
  37.   
  38.         canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS);  
  39.         canvas.clipPath(mPath);  
  40.         // 画放大后的图  
  41.   
  42.         canvas.translate(RADIUS - mCurrentX * FACTOR, RADIUS - mCurrentY  
  43.                 * FACTOR);  
  44.         canvas.drawBitmap(bitmap, matrix, null);  
  45.     }  
  46. }  


这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。

下面我们用这个工具来查看一套PC配置,让你看得更清楚,工程下载地址http://download.csdn.net/detail/hustpzb/4523274


目录
相关文章
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
缓存 JSON Java
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
448 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
|
Android开发 容器
Android实现面包屑效果,支持Fragment联动
Android实现面包屑效果,支持Fragment联动
|
Android开发
Android实现连线题效果
Android实现连线题效果
|
移动开发 JavaScript Android开发
通过howler.js实现在Android下的微信浏览器自动播放音频
通过howler.js实现在Android下的微信浏览器自动播放音频
546 0
通过howler.js实现在Android下的微信浏览器自动播放音频
|
数据库 Android开发
android 多级下拉菜单实现教程 greendao使用
android 多级下拉菜单实现教程 greendao使用
249 0
android 多级下拉菜单实现教程 greendao使用
|
存储 API Android开发
深入剖析Android四大组件(四)——Messenger实现Android IPC
深入剖析Android四大组件(四)——Messenger实现Android IPC
149 2
|
监控 前端开发 Java
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
453 0
|
XML 开发工具 Android开发
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
308 0
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
|
Android开发
Android自定义控件(七)——ShapeDrawable实现放大镜效果
Android自定义控件(七)——ShapeDrawable实现放大镜效果
504 0
Android自定义控件(七)——ShapeDrawable实现放大镜效果