Android放大镜的实现


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

  1. package chroya.demo.magnifier;   
  2.   
  3. import android.content.Context;   
  4. import android.graphics.Bitmap;   
  5. import android.graphics.BitmapFactory;   
  6. import android.graphics.BitmapShader;   
  7. import android.graphics.Canvas;   
  8. import android.graphics.Matrix;   
  9. import android.graphics.Shader.TileMode;   
  10. import android.graphics.drawable.ShapeDrawable;   
  11. import android.graphics.drawable.shapes.OvalShape;   
  12. import android.view.MotionEvent;   
  13. import android.view.View;   
  14.   
  15. /**  
  16.  * 放大镜实现方式1  
  17.  * @author chroya  
  18.  *  
  19.  */  
  20. public class ShaderView extends View{   
  21.     private Bitmap bitmap;   
  22.     private ShapeDrawable drawable;   
  23.     //放大镜的半径   
  24.     private static final int RADIUS = 80;   
  25.     //放大倍数   
  26.     private static final int FACTOR = 3;   
  27.     private Matrix matrix = new Matrix();   
  28.   
  29.     public ShaderView(Context context) {   
  30.         super(context);   
  31.         Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show);   
  32.         bitmap = bmp;          
  33.         BitmapShader shader = new BitmapShader(   
  34.                 Bitmap.createScaledBitmap(bmp, bmp.getWidth()*FACTOR,   
  35.                         bmp.getHeight()*FACTOR, true), TileMode.CLAMP, TileMode.CLAMP);   
  36.         //圆形的drawable   
  37.         drawable = new ShapeDrawable(new OvalShape());   
  38.         drawable.getPaint().setShader(shader);   
  39.         drawable.setBounds(00, RADIUS*2, RADIUS*2);   
  40.     }      
  41.        
  42.     @Override  
  43.     public boolean onTouchEvent(MotionEvent event) {   
  44.         final int x = (int) event.getX();   
  45.         final int y = (int) event.getY();   
  46.         //这个位置表示的是,画shader的起始位置   
  47.         matrix.setTranslate(RADIUS-x*FACTOR, RADIUS-y*FACTOR);   
  48.         drawable.getPaint().getShader().setLocalMatrix(matrix);   
  49.         //bounds,就是那个圆的外切矩形   
  50.         drawable.setBounds(x-RADIUS, y-RADIUS, x+RADIUS, y+RADIUS);   
  51.         invalidate();   
  52.         return true;   
  53.     }   
  54.        
  55.     @Override  
  56.     public void onDraw(Canvas canvas) {   
  57.         super.onDraw(canvas);   
  58.         canvas.drawBitmap(bitmap, 00null);   
  59.         drawable.draw(canvas);   
  60.     }   
  61. }  
  • 1
  • 2
  • 3
  • 下一页

相关内容