Android view放大镜 - 1835434698/1835434698.github.io GitHub Wiki

一、简介

因为业务需要使用一款圆形的放大镜,放大镜贴在左上角或者右上角固定不动。但是网上扒了扒了,没有找到满意的代码,要么是不支持图片,要么是不固定随手指一动,要么是嵌套太多东西太重了。无奈之下,自己动手写了一个简单的放大镜。效果如下:

二、代码逻辑

获取view的截图,然后裁剪未方形的bitmap,然后在裁剪未圆形bitamp,然后绘制。

package com.tangzy.tzymvp.view;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;

import com.tangzy.tzymvp.util.Logger;

import java.io.File;
import java.io.FileOutputStream;

/**
 * @author tzy
 * @date 2021/7/8 16:28
 * @discription
 */
class MagnifierView {
    private static final String TAG = "MagnifierView";
    private float mX = -1;
    private float mY = -1;

    private float radius = 100f;//半径
    private float mScale = 1.5f;//半径

    public float getRadius() {
        return radius;
    }

    public void setRadius(float radius) {
        this.radius = radius;
    }

    public float getmScale() {
        return mScale;
    }

    public void setmScale(float mScale) {
        this.mScale = mScale;
    }

    private Paint paint;

    public void setLocation(float x, float y){
        mX = x;
        mY = y;
    }

    public void onDraw(Canvas mCanvas, View view){
        Logger.d(TAG, "onDraw 1 ");
        if (mX >= 0 && mY >= 0){
            Logger.d(TAG, "onDraw 2 ");
            getBitmap(view);
            Logger.d(TAG, "onDraw 3 ");
            if (roundBitmap != null){
                Logger.d(TAG, "onDraw 4 ");
                mCanvas.drawBitmap(roundBitmap, radius,radius, null);
            }
        }
    }
    private  Bitmap originaBitmap;
    private Bitmap roundBitmap;
    private Canvas canvas;

    private void getBitmap(View view) {
        if (mX >= 0 && mY >= 0){

            view.setDrawingCacheEnabled(true);

            if (view.getDrawingCache() != null){
                originaBitmap = Bitmap.createBitmap((int) (2 * radius), (int) (2 * radius), Bitmap.Config.RGB_565);
                canvas = new Canvas(originaBitmap);

                canvas.drawColor(Color.BLACK);
                view.buildDrawingCache();
                canvas.drawBitmap(view.getDrawingCache(), new Rect((int) (mX - radius), (int) (mY - radius), (int) (mX + radius), (int) (mY + radius)), new Rect(0, 0, originaBitmap.getWidth(), originaBitmap.getHeight()),null);

                canvas.save();
                view.destroyDrawingCache();
                view.setDrawingCacheEnabled(false);


                roundBitmap = Bitmap.createBitmap((int) (2*radius*mScale),(int) (2*radius*mScale), Bitmap.Config.ARGB_8888);

                canvas = new Canvas(roundBitmap);
                paint = new Paint();
                Rect src = new Rect(0,0 ,(int) (2*radius),(int) (2*radius));
                Rect dst = new Rect(0,0 ,(int) (2*radius*mScale),(int) (2*radius*mScale));
                RectF rectF = new RectF(dst);
                paint.setAntiAlias(true);

                canvas.drawARGB(0,0,0,0);
                paint.setColor(0xff424242);
                canvas.drawRoundRect(rectF, (int) (radius*mScale), (int) (radius*mScale), paint);

                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
                canvas.drawBitmap(originaBitmap, src, dst, paint);
                canvas.save();
                originaBitmap.recycle();
                canvas = null;
            }
        }
    }
}