Android放大镜的实现
Android放大镜的实现
偶然看到一篇文章,讲Android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。
- 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);
- }
- }
|
评论暂时关闭