android放大镜效果实现

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


基本原理就是使用ShapeDrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。

不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。


再来看看放大镜的另外一种实现吧

[html] view plaincopy
  1. public class PathView extends View {  
  2.     private final Path mPath = new Path();  
  3.     private final Matrix matrix = new Matrix();  
  4.     private final Bitmap bitmap;  
  5.     // 放大镜的半径  
  6.   
  7.     private static final int RADIUS = 80;  
  8.     // 放大倍数  
  9.   
  10.     private static final int FACTOR = 2;  
  11.     private int mCurrentX, mCurrentY;  
  12.   
  13.     public PathView(Context context) {  
  14.         super(context);  
  15.         mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW);  
  16.         matrix.setScale(FACTOR, FACTOR);  
  17.   
  18.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.demo);  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean onTouchEvent(MotionEvent event) {  
  23.         mCurrentX = (int) event.getX();  
  24.         mCurrentY = (int) event.getY();  
  25.   
  26.         invalidate();  
  27.         return true;  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onDraw(Canvas canvas) {  
  32.         super.onDraw(canvas);  
  33.         // 底图  
  34.   
  35.         canvas.drawBitmap(bitmap, 0, 0, null);  
  36.         // 剪切  
  37.   
  38.         canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS);  
  39.         canvas.clipPath(mPath);  
  40.         // 画放大后的图  
  41.   
  42.         canvas.translate(RADIUS - mCurrentX * FACTOR, RADIUS - mCurrentY  
  43.                 * FACTOR);  
  44.         canvas.drawBitmap(bitmap, matrix, null);  
  45.     }  
  46. }  


这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。

下面我们用这个工具来查看一套PC配置,让你看得更清楚,工程下载地址http://download.csdn.net/detail/hustpzb/4523274

android放大镜效果实现