android中的放大镜的实现

来源:互联网 发布:javascript讲师 编辑:程序博客网 时间:2024/06/05 19:11

转自:点击打开链接

看到一篇文章实现的放大镜的效果,看着很不错的,转载贴出一下

Java代码  收藏代码
  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. }  


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

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

Java代码  收藏代码
  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.Canvas;  
  7. import android.graphics.Matrix;  
  8. import android.graphics.Path;  
  9. import android.graphics.Path.Direction;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12.   
  13. /** 
  14.  * 放大镜实现方式2 
  15.  * @author chroya 
  16.  * 
  17.  */  
  18. public class PathView extends View{  
  19.     private Path mPath = new Path();  
  20.     private Matrix matrix = new Matrix();  
  21.     private Bitmap bitmap;  
  22.     //放大镜的半径  
  23.     private static final int RADIUS = 80;  
  24.     //放大倍数  
  25.     private static final int FACTOR = 2;  
  26.     private int mCurrentX, mCurrentY;  
  27.   
  28.     public PathView(Context context) {  
  29.         super(context);  
  30.         mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW);  
  31.         matrix.setScale(FACTOR, FACTOR);  
  32.           
  33.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.show);  
  34.     }     
  35.       
  36.     @Override  
  37.     public boolean onTouchEvent(MotionEvent event) {  
  38.         mCurrentX = (int) event.getX();  
  39.         mCurrentY = (int) event.getY();  
  40.           
  41.         invalidate();  
  42.         return true;  
  43.     }  
  44.       
  45.     @Override  
  46.     public void onDraw(Canvas canvas) {  
  47.         super.onDraw(canvas);  
  48.         //底图  
  49.         canvas.drawBitmap(bitmap, 00null);  
  50.         //剪切  
  51.         canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS);  
  52.         canvas.clipPath(mPath);   
  53.         //画放大后的图  
  54.         canvas.translate(RADIUS-mCurrentX*FACTOR, RADIUS-mCurrentY*FACTOR);  
  55.         canvas.drawBitmap(bitmap, matrix, null);          
  56.     }  
  57. }  
 

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

0 0
原创粉丝点击