当前位置: 首页 > 科技观察

android放大镜效果实现

时间:2023-03-14 22:00:33 科技观察

概述相信很多用过英文应用的同学都见过放大镜的效果,就是选中一段文字后,会有一个放大镜。这是如何实现的?今天就来分析一下。源码分析publicclassShaderViewextendsView{privatefinalBitmapbitmap;privatefinalShapeDrawabledrawable;//放大镜半径privatestaticfinalintRADIUS=80;//放大倍数privatestaticfinalintFACTOR=3;privatefinalMatrixmatrix=newMatrix();publicShaderView(Contextcontext){super(context)Bitmapacbmptory=ResourceFactor),codeBitR.drawable.demo);bitmap=bmp;BitmapShadershader=newBitmapShader(Bitmap.createScaledBitmap(bmp,bmp.getWidth()*FACTOR,bmp.getHeight()*FACTOR,true),TileMode.CLAMP,TileMode.CLAMP);//圆形可绘制对象drawable=newShapeDrawable(newOvalShape());drawable.getPaint().setShader(shader);drawable.setBounds(0,0,RADIUS*2,RADIUS*2);}@OverridepublicbooleanonTouchEvent(MotionEventevent){finalintx=(int)event.getX();finalinty=(int)event.getY();//这个位置表示绘制着色器的起始位置matrix.setTranslate(RADIUS-x*FACTOR,RADIUS-y*FACTOR);drawable.getPaint().getShader().setLocalMatrix(matrix);//bounds,也就是圆的外接矩形drawable.setBounds(x-RADIUS,y-RADIUS,x+RADIUS,y+RADIUS);invalidate();返回真;}@OverridepublicvoidonDraw(Canvascanvas){super.onDraw(canvas);canvas.drawBitmap(bitmap,0,0,null);drawable.draw(canvas);}}基本原理是利用ShapeDrawable构造一个圆形的drawable,然后它把paint的shader设置到要放大的图片上,然后就是一个简单的位置移动问题。放大镜的半径和放大倍数可以在代码中修改。代码有注释,应该很好理解。但是,如果一个问题只有一种解法,就有点挫败感了,玩点不同的也不好。要玩一个程序,你必须发挥你的个性和热情。哈哈,废话太多,言归正传。再来看放大镜的另一种实现publicclassPathViewextendsView{privatefinalPathmPath=newPath();privatefinalMatrixmatrix=newMatrix();privatefinalBitmapbitmap;//放大镜的半径privatestaticfinalintRADIUS=80;//放大倍数privatestaticfinalintFACTOR=2;privateintmCurrentX,mCurrentY;publicintmCurrent,mCurrentY;public){super(context);mPath.addCircle(RADIUS,RADIUS,RADIUS,Direction.CW);matrix.setScale(FACTOR,FACTOR);bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.demo);}@OverridepublicbooleanonTouchEvent(MotionEventevent){mCurrentX=(int)event.getX();mCurrentY=(int)event.getY();invalidate();returntrue;}@OverridepublicvoidonDraw(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);}}路径这里使用class将canvas裁剪出一个圆形区域,将放大的部分绘制在上面。项目下载地址http://download.csdn.net/detail/hustpzb/4523274