Android放大镜效果实现

简介:

概述

我相信很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析。

源码分析


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

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

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


  
  
  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 * FACTOR); 
  43.          canvas.drawBitmap(bitmap, matrix, null); 
  44.     } 

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




本文作者:佚名
来源:51CTO
目录
相关文章
|
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使用
248 0
android 多级下拉菜单实现教程 greendao使用
|
XML 开发工具 Android开发
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
308 0
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
|
Android开发
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
677 0
|
存储 Dart Java
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
|
XML Android开发 数据格式
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
486 0