Android放大镜的实现
16lz
2021-12-04
- 复制到剪贴板 Java代码
- view plaincopy to clipboardprint?
- 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);
- }
- }
基本原理就是使用ShapeDrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。
不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。
再来看看放大镜的另外一种实现吧 复制到剪贴板 Java代码
- view plaincopy to clipboardprint?
- 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);
- }
- }
这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样
更多相关文章
- Android实现图片放大缩小
- Android实现图片反转、翻转、旋转、放大和缩小
- android图片放大 缩小 旋转
- Android放大镜的实现
- TextView
- android 双击屏幕触发事件,放大图片,不用接入借口api,不用OnGestur
- Android放大镜的实现
- android 双击图片放大缩小
- Gallery放大缩小