0
点赞
收藏
分享

微信扫一扫

Android放大镜实现的两种方式

1. public class ShaderView extends View {  
2.     private final Bitmap bitmap;  
3.     private final ShapeDrawable drawable;  
4.     // 放大镜的半径  
5.   
6. RADIUS = 80;  
7.     // 放大倍数  
8.   
9. FACTOR = 3;  
10. matrix = new Matrix();  
11.   
12.     public ShaderView(Context context) {  
13.         super(context);  
14. bmp = BitmapFactory.decodeResource(getResources(),R.drawable.demo);  
15. bitmap = bmp;  
16. 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. x = (int) event.getX();  
29. 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 plain 
    copy 
    
 
    
 
    
 
    
 
  
1. public class PathView extends View {  
2. mPath = new Path();  
3. matrix = new Matrix();  
4.     private final Bitmap bitmap;  
5.     // 放大镜的半径  
6.   
7. RADIUS = 80;  
8.     // 放大倍数  
9.   
10. 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配置,让你看得更清楚,




Android放大镜实现的两种方式_放大镜



举报

相关推荐

0 条评论