android放大镜效果实现

简介: public class ShaderView extends View {       private final Bitmap bitmap;       private final ShapeDrawable drawable;       // 放大镜的半径          private static final int RADIUS
  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


目录
打赏
0
0
0
0
498
分享
相关文章
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
711 0
通过howler.js实现在Android下的微信浏览器自动播放音频
通过howler.js实现在Android下的微信浏览器自动播放音频
594 0
通过howler.js实现在Android下的微信浏览器自动播放音频
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
472 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
android 多级下拉菜单实现教程 greendao使用
android 多级下拉菜单实现教程 greendao使用
271 0
android 多级下拉菜单实现教程 greendao使用
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
344 0
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
511 0

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
    12
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    23
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    15
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    2
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    3
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    5
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    2
  • 8
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    6
  • 9
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    4
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    1
  • 1
    android FragmentManager 删除所有Fragment 重建
    18
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    30
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    35
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    144
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    46
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    58
  • 8
    Android历史版本与APK文件结构
    160
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    41