Android自定义橡皮擦效果
本文实例为大家分享了Android自定义橡皮擦效果,使用贝塞尔曲线处理曲线转折处
publicclasspicFingerToTestextendsView{ privatePaintpaint; privateBitmapdecodeResourceSRC; privateBitmapcreateBitmapDST; //手指路径,使用贝塞尔路线 privatePathpath; privatefloatperX; privatefloatperY; publicpicFingerToTest(Contextcontext,AttributeSetattrs){ super(context,attrs); //1、设置禁用硬件设置 setLayerType(View.LAYER_TYPE_SOFTWARE,null); //2、设置手指画笔 paint=newPaint(); paint.setAntiAlias(true); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(45); //3、生成图像手指源目标 //源 decodeResourceSRC=BitmapFactory.decodeResource(getResources(),R.drawable.welcome,null); //目标 createBitmapDST=Bitmap.createBitmap(decodeResourceSRC.getWidth(),decodeResourceSRC.getHeight(), Config.ARGB_8888); path=newPath(); } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); //分层绘制 intsaveLayer=canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG); //把手指轨迹划到目标路径上 Canvascanvas2=newCanvas(createBitmapDST); canvas2.drawPath(path,paint); //把目标图像画到画布上 canvas.drawBitmap(createBitmapDST,0,0,paint); //计算源图像区域 paint.setXfermode(newPorterDuffXfermode(Mode.SRC_OUT)); canvas.drawBitmap(decodeResourceSRC,0,0,paint); paint.setXfermode(null); canvas.restoreToCount(saveLayer); } //使用贝塞尔曲线,使折线过度圆滑 @Override publicbooleanonTouchEvent(MotionEventevent){ switch(event.getAction()){ //记录手指触摸的初始化位置 caseMotionEvent.ACTION_DOWN: path.moveTo(event.getX(),event.getY()); perX=event.getX(); perY=event.getY(); returntrue; caseMotionEvent.ACTION_MOVE: floatendX=(perX+event.getX())/2; floatendY=(perY+event.getY())/2; path.quadTo(perX,perY,endX,endY); perX=event.getX(); perY=event.getY(); postInvalidate(); break; caseMotionEvent.ACTION_UP: break; default: break; } returnsuper.onTouchEvent(event); } }
小编再为大家补充一段代码:android橡皮擦擦图片功能
publicvoidonCreate(){ //底边图片 ImageViewivTop=(ImageView)findViewByid(R.id.iv_top); Optionsopts=newOptions();//图片加载器,用于配置一些缩放比例,和像素单位 opts.inSampleSize=2;//制定加载器把原图片的宽高缩放到2/1的效果加载 //获得外层图片,decodeResource方法默认获得的像素单位是RGB(red,green,blue),ARGB(alpha,red,green,blue) BitmaptopImage=BitmapFactory.decodeResources(getResource(),R.drawable.top,opts); //创建一张空白图片,并且把图片想读单位指定为:ARGB Bitmapblank=Bitmap.createBitmap(topImage.getWidth(),topImage.getHeight,Config.ARGB_4444); //把上边的topImage画到空白图片上 Canvascanvas=newCanvas(blank); //把topImage画到空白图片上但是像素单位变成ARGB() canvas.drawBitmap(topImage,0,0,null); ivTop.setImageBitmap(blank); } classMyOnTouchListonerimplementsOnTouchListener{ @OverridepulicbooleanOnTouch(Viewv,MotionEventevent){ //是否是移动的事件 if(event.getAction()==MotionEvent.ACTION_MOVE){ //获得按下坐标 intx=(int)event.getX(); inty=(int)event.getY(); for(inti=x-10;i=0&&blank.getHeight()&&i>=0&&i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。