首页 > 系统 > Android > 正文

Android实现刮刮乐示例分析

2019-12-12 04:58:21
字体:
来源:转载
供稿:网友

微信公众号有很多都做刮刮乐的活动,本文就实现了刮刮乐的效果,具体代码如下:

首先要做一个类似橡皮擦的东西吧,然后才能把纸上的笔迹擦除
 

/**    * FileName: SplashActivity.java    *    * @desc 橡皮擦功能,类似刮刮乐效果    * @author HTP    * @Date 20140311    * @version 1.00    */   public class Text_Rubbler extends TextView {        private float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。        // private final int bgColor;     // 位图     private Bitmap mBitmap;     // 画布     private Canvas mCanvas;     // 画笔     private Paint mPaint;     private Path mPath;     private float mX, mY;        private boolean isDraw = false;        public Text_Rubbler(Context context) {       /**        * @param context 上下文        */       super(context);        }        public Text_Rubbler(Context context, AttributeSet attrs, int defStyle) {       super(context, attrs, defStyle);       // bgColor =       // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android",       // "textColor", 0xFFFFFF);       // System.out.println("Color:"+bgColor);     }        public Text_Rubbler(Context context, AttributeSet attrs) {       super(context, attrs);       // bgColor =       // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android",       // "textColor", 0xFFFFFF);       // System.out.println(bgColor);       // System.out.println(attrs.getAttributeValue("http://schemas.android.com/apk/res/android",       // "layout_width"));     }        @Override     protected void onDraw(Canvas canvas) {       super.onDraw(canvas);       if (isDraw) {            mCanvas.drawPath(mPath, mPaint);         // mCanvas.drawPoint(mX, mY, mPaint);         canvas.drawBitmap(mBitmap, 0, 0, null);       }     }        /**      * 开启檫除功能      *      * @param bgColor      *      覆盖的背景颜色      * @param paintStrokeWidth      *      触点(橡皮)宽度      * @param touchTolerance      *      填充距离,值越小,越柔和。      */     public void beginRubbler(final int bgColor, final int paintStrokeWidth,         float touchTolerance) {       TOUCH_TOLERANCE = touchTolerance;       // 设置画笔       mPaint = new Paint();       // mPaint.setAlpha(0);       // 画笔划过的痕迹就变成透明色了       mPaint.setColor(Color.BLACK); // 此处不能为透明色       mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));       // 或者       // mPaint.setAlpha(0);       // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));          mPaint.setAntiAlias(true);       mPaint.setDither(true);       mPaint.setStyle(Paint.Style.STROKE);       mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角       mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角       mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽          // 痕迹       mPath = new Path();       ;       // 覆盖       // if (getLayoutParams().width == LayoutParams.FILL_PARENT) {       //       // }       mBitmap = Bitmap.createBitmap(getLayoutParams().width,           getLayoutParams().height, Config.ARGB_8888);       mCanvas = new Canvas(mBitmap);          mCanvas.drawColor(bgColor);       isDraw = true;     }        @Override     public boolean onTouchEvent(MotionEvent event) {       if (!isDraw) {         return true;       }       switch (event.getAction()) {       case MotionEvent.ACTION_DOWN: // 触点按下         // touchDown(event.getRawX(),event.getRawY());         touchDown(event.getX(), event.getY());         invalidate();         break;       case MotionEvent.ACTION_MOVE: // 触点移动         touchMove(event.getX(), event.getY());         invalidate();         break;       case MotionEvent.ACTION_UP: // 触点弹起         touchUp(event.getX(), event.getY());         invalidate();         break;       default:         break;       }       return true;     }        private void touchDown(float x, float y) {       mPath.reset();       mPath.moveTo(x, y);       mX = x;       mY = y;     }        private void touchMove(float x, float y) {       float dx = Math.abs(x - mX);       float dy = Math.abs(y - mY);       if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {         mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);         mX = x;         mY = y;       }        }        private void touchUp(float x, float y) {       mPath.lineTo(x, y);       mCanvas.drawPath(mPath, mPaint);       mPath.reset();     }      } 

接下来就是使用橡皮檫擦除了
 

  /**    * FileName: RubblerAct.java    * @Desc  该类通过调用Text_Rubbler这个类将在Activity上显示一片刮一刮的区域,可以出发触摸事件    * @author HTP    * @Date  20140312    * @version 1.00    */         public class RubblerAct extends Activity {     // 刮开后文字显示     private TextView tv_rubbler;     // 得到刮一刮的内容     private Sentence mSentence;     // 下一张     private TextView tv_next;        @Override     public void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);          // setContentView(new Rubble(this,"谢谢惠顾",new Rect(100, 200,       // 300,250),2,1f,14));          // /////////////////////////////////////////       setContentView(R.layout.rubbler);       // 设置的颜色必须要有透明度。       ((Text_Rubbler) findViewById(R.id.rubbler)).beginRubbler(0xFFFFFFFF, 20,           1f);// 设置橡皮擦的宽度等       mSentence = new Sentence();       // 随机初始化文字       tv_rubbler = (TextView) findViewById(R.id.rubbler);       String str = mSentence.getSentence();       tv_rubbler.setText(str);          tv_next = (TextView) findViewById(R.id.tv_next);          // 点击下一步       tv_next.setOnClickListener(new OnClickListener() {            @Override         public void onClick(View v) {           // TODO Auto-generated method stub           String str = mSentence.getSentence();           tv_rubbler.setText(str);           ((Text_Rubbler) findViewById(R.id.rubbler))// 初始化状态               .beginRubbler(0xFFFFFFFF, 20, 1f);            }       });        }        class Rubble extends View {          private final int PAINT_STROKE_WIDTH;       private final float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。       private final int TEXT_SIZE;          private Bitmap mBitmap;       // 画布       private Canvas mCanvas;       // 画笔       private Paint mPaint;       private Path mPath;       private float mX, mY;       private final int X, Y, W, H;          private final Rect touchRect;          public Rubble(Context context, String bgText, Rect rect,           int paintStrokeWidth, float touchTolerance, int textSize) {         super(context);         setFocusable(true);         touchRect = rect;         W = rect.right - rect.left;         H = rect.bottom - rect.top;         X = rect.left;         Y = rect.top;         TEXT_SIZE = textSize;         PAINT_STROKE_WIDTH = paintStrokeWidth;         TOUCH_TOLERANCE = touchTolerance;         setBackground(touchRect, bgText);         initDrowTools();          }          private void setBackground(Rect rect, String bgText) {         DisplayMetrics dm = new DisplayMetrics();         dm = this.getResources().getDisplayMetrics();            Bitmap bitmap = Bitmap.createBitmap(dm.widthPixels,             dm.heightPixels, Config.ARGB_8888);         Canvas canvas = new Canvas(bitmap);            Paint paint = new Paint();         paint.setColor(0x88000000);         // paint.setStyle(Style.STROKE);         // paint.setTextAlign(Align.CENTER);         paint.setTextSize(TEXT_SIZE);            // paint.setTextScaleX(1.5f);         canvas.drawColor(Color.WHITE);         // 画字的坐标不好控制         int x = rect.left             + (rect.right - rect.left - bgText.length() * TEXT_SIZE)             / 2;         int y = rect.top + (rect.bottom - rect.top - TEXT_SIZE) / 2;         // int y = 218+25;         canvas.drawText(bgText, x, y, paint);         Drawable drawable = new BitmapDrawable(bitmap);         setBackgroundDrawable(drawable);       }          private void initDrowTools() {         // 设置画笔         mPaint = new Paint();         // mPaint.setAlpha(0);         // 画笔划过的痕迹就变成透明色了         mPaint.setColor(Color.BLACK); // 此处不能为透明色         mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));         // 或者         // mPaint.setAlpha(0);         // mPaint.setXfermode(new         // PorterDuffXfermode(PorterDuff.Mode.DST_IN));            mPaint.setAntiAlias(true);         mPaint.setDither(true);         mPaint.setStyle(Paint.Style.STROKE);         mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角         mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角         mPaint.setStrokeWidth(PAINT_STROKE_WIDTH); // 笔宽            // 痕迹         mPath = new Path();         ;            // 覆盖         mBitmap = Bitmap.createBitmap(W, H, Config.ARGB_8888);         mCanvas = new Canvas(mBitmap);         mCanvas.drawColor(0x88000000);          }          @Override       protected void onDraw(Canvas canvas) {         super.onDraw(canvas);         mCanvas.drawPath(mPath, mPaint);         // mCanvas.drawPoint(mX, mY, mPaint);         canvas.drawBitmap(mBitmap, X, Y, null);       }          @Override       public boolean onTouchEvent(MotionEvent event) {         System.out.print("X--" + event.getX());         System.out.println("Y--" + event.getY());         if (!touchRect.contains((int) event.getX(), (int) event.getY())) {           return false;         }            switch (event.getAction()) {         // 触点按下         case MotionEvent.ACTION_DOWN: {           touchDown(event.getRawX(), event.getRawY());           touchDown(event.getX() - touchRect.left, event.getY()               - touchRect.top);           invalidate();           break;         }                    case MotionEvent.ACTION_MOVE: // 触点移动           touchMove(event.getX() - touchRect.left, event.getY()               - touchRect.top);              invalidate();           break;         case MotionEvent.ACTION_UP: // 触点弹起           touchUp(event.getX() - touchRect.left, event.getY()               - touchRect.top);           invalidate();           break;         default:           break;         }         return true;       }          private void touchDown(float x, float y) {         mPath.reset();         mPath.moveTo(x, y);         mX = x;         mY = y;       }          private void touchMove(float x, float y) {         float dx = Math.abs(x - mX);         float dy = Math.abs(y - mY);         if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {           mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);           mX = x;           mY = y;         }          }          private void touchUp(float x, float y) {         mPath.lineTo(x, y);         mCanvas.drawPath(mPath, mPaint);         mPath.reset();       }        }        /**      * 键盘事件,当按下back键的时候询问是否再按一次退出程序      */     // 退出时间     private long exitTime = 0;     @Override     public boolean onKeyDown(int keyCode, KeyEvent event) {       if (keyCode == KeyEvent.KEYCODE_BACK           && event.getAction() == KeyEvent.ACTION_DOWN) {         if ((System.currentTimeMillis() - exitTime) > 2000) {           Toast.makeText(getApplicationContext(), "再按一次退出程序",               Toast.LENGTH_SHORT).show();           exitTime = System.currentTimeMillis();         } else {           finish();           System.exit(0);            }         return true;       }       return super.onKeyDown(keyCode, event);     }      } 

实现效果如下:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表