博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android放大镜效果的简单实现
阅读量:6690 次
发布时间:2019-06-25

本文共 2482 字,大约阅读时间需要 8 分钟。

package com.example.myapi.pictobig;import com.example.myapi.R;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;  import android.widget.ImageView;  /**  * 图片放大镜工具类  * @author yw-tony  *  */  public class PicToBigTools extends ImageView{      private Bitmap bitmap;      private ShapeDrawable drawable;      /*放大镜的半径*/      private static final int RADIUS = 80;      /*放大倍数*/      private static final int FACTOR = 3;      private Matrix matrix = new Matrix();      /**     * 构造方法     * @param context     */    public PicToBigTools(Context context) {          super(context);          Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pictobig_icon);          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();                          /**设置图片等比例缩放*/        // 获得图片的宽高        int width = bitmap.getWidth();        int height = bitmap.getHeight();         // 计算缩放比例        float scaleWidth = ((float) RADIUS*2) / width;        float scaleHeight = ((float) RADIUS*2) / height;        matrix.postScale(scaleWidth,scaleHeight);                        //这个位置表示的是,画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();//更新UI        return true;      }            @Override      public void onDraw(Canvas canvas) {          super.onDraw(canvas);          canvas.drawBitmap(bitmap, 0, 0, null);          drawable.draw(canvas);//绘制图片      }  }

 

转载地址:http://fezoo.baihongyu.com/

你可能感兴趣的文章
Python_(1)数据类型及其常见使用方法(图文)
查看>>
如何查看WWN号
查看>>
主页被劫持问题
查看>>
linux中awk学习小结
查看>>
WCF分布式开发常见错误(23):the fact that the server certificate isn't configured with HTTP.SYS...
查看>>
第一个Indigo Service
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记之三十二 【无入侵的Ajax】
查看>>
监听启动报TNS-12537、TNS-12560错误
查看>>
XXX管理平台系统——项目教训
查看>>
会写代码的项目经理
查看>>
通过Lua解释器来扩展丰富nginx功能,实现复杂业务的处理
查看>>
禁用WPF窗体的最大化按钮
查看>>
玩转React样式
查看>>
TinyHttpd中sockaddr与struct sockaddr_in的区别
查看>>
嘉峪关市与甘肃省广电网络公司对接智慧城市建设项目
查看>>
PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack
查看>>
代码实现从某个表中查询数据插入到另一个表中
查看>>
提高代码质量-工具篇
查看>>
require() 源码解读
查看>>
kvm虚拟化学习笔记(十六)之kvm虚拟化存储池配置
查看>>