• 复制到剪贴板Java代码
      1. viewplaincopytoclipboardprint?
      2. packagechroya.demo.magnifier;
      3. importandroid.content.Context;
      4. importandroid.graphics.Bitmap;
      5. importandroid.graphics.BitmapFactory;
      6. importandroid.graphics.BitmapShader;
      7. importandroid.graphics.Canvas;
      8. importandroid.graphics.Matrix;
      9. importandroid.graphics.Shader.TileMode;
      10. importandroid.graphics.drawable.ShapeDrawable;
      11. importandroid.graphics.drawable.shapes.OvalShape;
      12. importandroid.view.MotionEvent;
      13. importandroid.view.View;
      14. /**
      15. *放大镜实现方式1
      16. *@authorchroya
      17. *
      18. */
      19. public
      20. classShaderViewextendsView{
      21. privateBitmapbitmap;
      22. privateShapeDrawabledrawable;
      23. //放大镜的半径
      24. private
      25. static
      26. final
      27. intRADIUS=80;
      28. //放大倍数
      29. private
      30. static
      31. final
      32. intFACTOR=3;
      33. privateMatrixmatrix=newMatrix();
      34. publicShaderView(Contextcontext){
      35. super(context);
      36. Bitmapbmp=BitmapFactory.decodeResource(getResources(),R.drawable.show);
      37. bitmap=bmp;
      38. BitmapShadershader=newBitmapShader(
      39. Bitmap.createScaledBitmap(bmp,bmp.getWidth()*FACTOR,
      40. bmp.getHeight()*FACTOR,true),TileMode.CLAMP,TileMode.CLAMP);
      41. //圆形的drawable
      42. drawable=newShapeDrawable(newOvalShape());
      43. drawable.getPaint().setShader(shader);
      44. drawable.setBounds(0,0,RADIUS*2,RADIUS*2);
      45. }
      46. @Override
      47. public
      48. booleanonTouchEvent(MotionEventevent){
      49. final
      50. intx=(int)event.getX();
      51. final
      52. inty=(int)event.getY();
      53. //这个位置表示的是,画shader的起始位置
      54. matrix.setTranslate(RADIUS-x*FACTOR,RADIUS-y*FACTOR);
      55. drawable.getPaint().getShader().setLocalMatrix(matrix);
      56. //bounds,就是那个圆的外切矩形
      57. drawable.setBounds(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);
      58. invalidate();
      59. return
      60. true;
      61. }
      62. @Override
      63. public
      64. voidonDraw(Canvascanvas){
      65. super.onDraw(canvas);
      66. canvas.drawBitmap(bitmap,0,0,null);
      67. drawable.draw(canvas);
      68. }
      69. }


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

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


再来看看放大镜的另外一种实现吧 复制到剪贴板 Java代码
    • viewplaincopytoclipboardprint?
    • packagechroya.demo.magnifier;
    • importandroid.content.Context;
    • importandroid.graphics.Bitmap;
    • importandroid.graphics.BitmapFactory;
    • importandroid.graphics.Canvas;
    • importandroid.graphics.Matrix;
    • importandroid.graphics.Path;
    • importandroid.graphics.Path.Direction;
    • importandroid.view.MotionEvent;
    • importandroid.view.View;
    • /**
    • *放大镜实现方式2
    • *@authorchroya
    • *
    • */
    • public
    • classPathViewextendsView{
    • privatePathmPath=newPath();
    • privateMatrixmatrix=newMatrix();
    • privateBitmapbitmap;
    • //放大镜的半径
    • private
    • static
    • final
    • intRADIUS=80;
    • //放大倍数
    • private
    • static
    • final
    • intFACTOR=2;
    • private
    • intmCurrentX,mCurrentY;
    • publicPathView(Contextcontext){
    • super(context);
    • mPath.addCircle(RADIUS,RADIUS,RADIUS,Direction.CW);
    • matrix.setScale(FACTOR,FACTOR);
    • bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.show);
    • }
    • @Override
    • public
    • booleanonTouchEvent(MotionEventevent){
    • mCurrentX=(int)event.getX();
    • mCurrentY=(int)event.getY();
    • invalidate();
    • return
    • true;
    • }
    • @Override
    • public
    • voidonDraw(Canvascanvas){
    • super.onDraw(canvas);
    • //底图
    • canvas.drawBitmap(bitmap,0,0,null);
    • //剪切
    • canvas.translate(mCurrentX-RADIUS,mCurrentY-RADIUS);
    • canvas.clipPath(mPath);
    • //画放大后的图
    • canvas.translate(RADIUS-mCurrentX*FACTOR,RADIUS-mCurrentY*FACTOR);
    • canvas.drawBitmap(bitmap,matrix,null);
    • }
    • }


这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样

更多相关文章

  1. Android手机开发:图片的放大和缩小显示ImageView
  2. android 图片点击一下就放大到全屏,再点一下就回到原界面
  3. [置顶] 我的Android进阶之旅------>android Matrix图片随意的放
  4. Android(安卓)图片预览模仿朋友圈查看图片效果放大图片,左右滑动
  5. 如何实现Android(安卓)布局背景模糊化处理
  6. 如何实现Android(安卓)布局背景模糊化处理
  7. android 关于图片的放大,缩小,旋转功能的实现(附源码)
  8. android 下的webview 设置多点触控放大
  9. android 关于图片的放大,缩小,旋转功能的实现(附源码)

随机推荐

  1. Android如何调用第三方SO库
  2. Android(安卓)修改TextView字体样式
  3. 自定义adapter 及其性能优化
  4. android待机应用和若干常见问题解决
  5. Ubuntu下搭建Android(安卓)NDK开发环境
  6. android
  7. android animation's overview
  8. android中文api (59) ―― TabHost.TabSp
  9. Android(安卓)init 启动过程分析
  10. Android开发者必备的十个工具