当前位置:   article > 正文

Android Xfermode类似于刮刮卡效果_android xfermodeview 刮刮乐

android xfermodeview 刮刮乐

今天这个项目的名称叫做擦掉乌云你会发现生活的美好!额,不闷骚了!其实就是底层发一张美女的图片,再覆盖一层灰色(模拟乌云),同时触摸监听,使手指触摸的地方的那一层灰色消失(类似于乌云被擦掉了);ok,我们看一下效果图。不满意请上别处!


就是类似的效果!代码熟悉后图片你可以随便换哈!

要实现这种效果,我们用到了Xfermode这个类!对于这个的应用,官方的案例给了很好的说明!


我们今天要用的就是,DstOUt这种模式,我们先绘制“乌云”层,再利用Paint对象的setXfermode(new PorterDuffXfermode(Mode.DST_OUT));绘制

手划过的线,这样线与乌云重合的部分就消失了,达到了擦去的效果!

我们要自定义一个View,老生常谈一下基本步骤!

1,自定义属性;2,在构造方法中拿到自定义属性的值;3,重写onMeasure方法;4,重写onDraw()方法

今天的代码没有1,和2,;

废话不多说,附上今天的代码!

第一步,初始化,画笔和线条(即实例化)

  1. public CustomViewDustOff(Context context) {
  2. this(context, null, 0);
  3. }
  4. public CustomViewDustOff(Context context, AttributeSet attrs) {
  5. this(context, attrs, 0);
  6. }
  7. public CustomViewDustOff(Context context, AttributeSet attrs,
  8. int defStyleAttr) {
  9. super(context, attrs, defStyleAttr);
  10. init();
  11. }
  12. //初始化画笔,线条
  13. private void init(){
  14. outPaint=new Paint();
  15. outPaint.setAntiAlias(true);
  16. outPaint.setStyle(Paint.Style.STROKE);
  17. outPaint.setStrokeWidth(30);
  18. outPaint.setXfermode(new PorterDuffXfermode(Mode.DST_OUT));
  19. mPath=new Path();
  20. }

第二步重写onMeasure方法中

  1. @Override
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  3. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  4. int width=getMeasuredWidth();
  5. int height=getMeasuredHeight();
  6. //获得底层的图片的位图对象
  7. backBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.beauty);
  8. //根据位图和空间的比值,设置矩阵的属性
  9. float scale=Math.min(width*1.0f/backBitmap.getWidth()*1.0f, height*1.0f/backBitmap.getHeight()*1.0f);
  10. mMatrix=new Matrix();
  11. mMatrix.setScale(scale, scale);
  12. //初始化,位图和画笔用于实现擦乌云的效果!
  13. mBitmap=Bitmap.createBitmap(width, height, Config.ARGB_8888);
  14. mCanvas=new Canvas(mBitmap);
  15. //绘制“乌云”
  16. mCanvas.drawColor(Color.parseColor("#c0c0c0"));//绘制灰尘
  17. }

第三部重写onDraw方法

  1. @Override
  2. protected void onDraw(Canvas canvas) {
  3. //绘制底图,根据矩阵进行适当的缩放
  4. canvas.drawBitmap(backBitmap,mMatrix,null);
  5. //画线,即实现擦乌云的效果
  6. drawPath();
  7. //将现实了擦乌云效果的为图对象,绘制在底图上面
  8. canvas.drawBitmap(mBitmap, 0, 0, null);
  9. super.onDraw(canvas);
  10. }
  11. private void drawPath(){
  12. mCanvas.drawPath(mPath, outPaint);
  13. }

重写onTouchEvent()方法,设置触摸监听!

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. float postX=event.getX();
  4. float postY=event.getY();
  5. switch (event.getAction()) {
  6. case MotionEvent.ACTION_DOWN:
  7. lastX=postX;
  8. lastY=postY;
  9. mPath.moveTo(postX, postY);
  10. break;
  11. case MotionEvent.ACTION_MOVE:
  12. float dx=Math.abs(postX-lastX);
  13. float dy=Math.abs(postY-lastY);
  14. if(dx>3||dy>3){
  15. mPath.lineTo(postX, postY);
  16. lastX=postX;
  17. lastY=postY;
  18. invalidate();
  19. }
  20. break;
  21. }
  22. return true;
  23. }

  1. private void drawPath(){
  2. mCanvas.drawPath(mPath, outPaint);
  3. }


源码下载









声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/855020
推荐阅读
相关标签
  

闽ICP备14008679号