Android放大镜的实现

时间:2022-05-24 03:10:27

package chroya.demo.magnifier;

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;

/**

 * 放大镜实现方式1

 * @author chroya

 *

 */

public class ShaderView extends View{


private Bitmap bitmap;


private ShapeDrawable drawable;


//放大镜的半径


private static final int RADIUS = 80;


//放大倍数


private static final int FACTOR = 3;


private Matrix matrix = new Matrix();

public ShaderView(Context context) {


super(context);


Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show);


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();


//这个位置表示的是,画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();


return true;


}

@Override


public void onDraw(Canvas canvas) {


super.onDraw(canvas);


canvas.drawBitmap(bitmap, 0, 0, null);


drawable.draw(canvas);


}

}

二:

package chroya.demo.magnifier;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.view.MotionEvent;
import android.view.View;

/**
 * 放大镜实现方式2
 * @author chroya
 *
 */
public class PathView extends View{
private Path mPath = new Path();
private Matrix matrix = new Matrix();
private Bitmap bitmap;
//放大镜的半径
private static final int RADIUS = 80;
//放大倍数
private static final int FACTOR = 2;
private int mCurrentX, mCurrentY;

public PathView(Context context) {
super(context);
mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW);
matrix.setScale(FACTOR, FACTOR);

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.show);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
mCurrentX = (int) event.getX();
mCurrentY = (int) event.getY();

invalidate();
return true;
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//底图
canvas.drawBitmap(bitmap, 0, 0, null);
//剪切
canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS);
canvas.clipPath(mPath);
//画放大后的图
canvas.translate(RADIUS-mCurrentX*FACTOR, RADIUS-mCurrentY*FACTOR);
canvas.drawBitmap(bitmap, matrix, null);
}
}