Android实现刮刮乐效果

来源:互联网 发布:linux误删除文件夹恢复 编辑:程序博客网 时间:2024/05/20 17:38

直接贴上代码:

  1. /** 
  2.  * FileName: SplashActivity.java 
  3.  *  
  4.  * @desc 橡皮擦功能,类似刮刮乐效果 
  5.  * @author HTP 
  6.  * @Date 20140311 
  7.  * @version 1.00 
  8.  */  
  9. public class Text_Rubbler extends TextView {  
  10.   
  11.     private float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。  
  12.   
  13.     // private final int bgColor;  
  14.     // 位图  
  15.     private Bitmap mBitmap;  
  16.     // 画布  
  17.     private Canvas mCanvas;  
  18.     // 画笔  
  19.     private Paint mPaint;  
  20.     private Path mPath;  
  21.     private float mX, mY;  
  22.   
  23.     private boolean isDraw = false;  
  24.   
  25.     public Text_Rubbler(Context context) {  
  26.         /** 
  27.          * @param context 上下文 
  28.          */  
  29.         super(context);  
  30.   
  31.     }  
  32.   
  33.     public Text_Rubbler(Context context, AttributeSet attrs, int defStyle) {  
  34.         super(context, attrs, defStyle);  
  35.         // bgColor =  
  36.         // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android",  
  37.         // "textColor", 0xFFFFFF);  
  38.         // System.out.println("Color:"+bgColor);  
  39.     }  
  40.   
  41.     public Text_Rubbler(Context context, AttributeSet attrs) {  
  42.         super(context, attrs);  
  43.         // bgColor =  
  44.         // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android",  
  45.         // "textColor", 0xFFFFFF);  
  46.         // System.out.println(bgColor);  
  47.         // System.out.println(attrs.getAttributeValue("http://schemas.android.com/apk/res/android",  
  48.         // "layout_width"));  
  49.     }  
  50.   
  51.     @Override  
  52.     protected void onDraw(Canvas canvas) {  
  53.         super.onDraw(canvas);  
  54.         if (isDraw) {  
  55.   
  56.             mCanvas.drawPath(mPath, mPaint);  
  57.             // mCanvas.drawPoint(mX, mY, mPaint);  
  58.             canvas.drawBitmap(mBitmap, 00null);  
  59.         }  
  60.     }  
  61.   
  62.     /** 
  63.      * 开启檫除功能 
  64.      *  
  65.      * @param bgColor 
  66.      *            覆盖的背景颜色 
  67.      * @param paintStrokeWidth 
  68.      *            触点(橡皮)宽度 
  69.      * @param touchTolerance 
  70.      *            填充距离,值越小,越柔和。 
  71.      */  
  72.     public void beginRubbler(final int bgColor, final int paintStrokeWidth,  
  73.             float touchTolerance) {  
  74.         TOUCH_TOLERANCE = touchTolerance;  
  75.         // 设置画笔  
  76.         mPaint = new Paint();  
  77.         // mPaint.setAlpha(0);  
  78.         // 画笔划过的痕迹就变成透明色了  
  79.         mPaint.setColor(Color.BLACK); // 此处不能为透明色  
  80.         mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
  81.         // 或者  
  82.         // mPaint.setAlpha(0);  
  83.         // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));  
  84.   
  85.         mPaint.setAntiAlias(true);  
  86.         mPaint.setDither(true);  
  87.         mPaint.setStyle(Paint.Style.STROKE);  
  88.         mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角  
  89.         mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角  
  90.         mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽  
  91.   
  92.         // 痕迹  
  93.         mPath = new Path();  
  94.         ;  
  95.         // 覆盖  
  96.         // if (getLayoutParams().width == LayoutParams.FILL_PARENT) {  
  97.         //  
  98.         // }  
  99.         mBitmap = Bitmap.createBitmap(getLayoutParams().width,  
  100.                 getLayoutParams().height, Config.ARGB_8888);  
  101.         mCanvas = new Canvas(mBitmap);  
  102.   
  103.         mCanvas.drawColor(bgColor);  
  104.         isDraw = true;  
  105.     }  
  106.   
  107.     @Override  
  108.     public boolean onTouchEvent(MotionEvent event) {  
  109.         if (!isDraw) {  
  110.             return true;  
  111.         }  
  112.         switch (event.getAction()) {  
  113.         case MotionEvent.ACTION_DOWN: // 触点按下  
  114.             // touchDown(event.getRawX(),event.getRawY());  
  115.             touchDown(event.getX(), event.getY());  
  116.             invalidate();  
  117.             break;  
  118.         case MotionEvent.ACTION_MOVE: // 触点移动  
  119.             touchMove(event.getX(), event.getY());  
  120.             invalidate();  
  121.             break;  
  122.         case MotionEvent.ACTION_UP: // 触点弹起  
  123.             touchUp(event.getX(), event.getY());  
  124.             invalidate();  
  125.             break;  
  126.         default:  
  127.             break;  
  128.         }  
  129.         return true;  
  130.     }  
  131.   
  132.     private void touchDown(float x, float y) {  
  133.         mPath.reset();  
  134.         mPath.moveTo(x, y);  
  135.         mX = x;  
  136.         mY = y;  
  137.     }  
  138.   
  139.     private void touchMove(float x, float y) {  
  140.         float dx = Math.abs(x - mX);  
  141.         float dy = Math.abs(y - mY);  
  142.         if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
  143.             mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
  144.             mX = x;  
  145.             mY = y;  
  146.         }  
  147.   
  148.     }  
  149.   
  150.     private void touchUp(float x, float y) {  
  151.         mPath.lineTo(x, y);  
  152.         mCanvas.drawPath(mPath, mPaint);  
  153.         mPath.reset();  
  154.     }  
  155.   
  156. }  

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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * FileName: RubblerAct.java 
  3.  * @Desc    该类通过调用Text_Rubbler这个类将在Activity上显示一片刮一刮的区域,可以出发触摸事件 
  4.  * @author  HTP 
  5.  * @Date    20140312 
  6.  * @version 1.00  
  7.  */  
  8.   
  9.   
  10. public class RubblerAct extends Activity {  
  11.     // 刮开后文字显示  
  12.     private TextView tv_rubbler;  
  13.     // 得到刮一刮的内容  
  14.     private Sentence mSentence;  
  15.     // 下一张  
  16.     private TextView tv_next;  
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.   
  22.         // setContentView(new Rubble(this,"谢谢惠顾",new Rect(100, 200,  
  23.         // 300,250),2,1f,14));  
  24.   
  25.         // /////////////////////////////////////////  
  26.         setContentView(R.layout.rubbler);  
  27.         // 设置的颜色必须要有透明度。  
  28.         ((Text_Rubbler) findViewById(R.id.rubbler)).beginRubbler(0xFFFFFFFF20,  
  29.                 1f);// 设置橡皮擦的宽度等  
  30.         mSentence = new Sentence();  
  31.         // 随机初始化文字  
  32.         tv_rubbler = (TextView) findViewById(R.id.rubbler);  
  33.         String str = mSentence.getSentence();  
  34.         tv_rubbler.setText(str);  
  35.   
  36.         tv_next = (TextView) findViewById(R.id.tv_next);  
  37.   
  38.         // 点击下一步  
  39.         tv_next.setOnClickListener(new OnClickListener() {  
  40.   
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 // TODO Auto-generated method stub  
  44.                 String str = mSentence.getSentence();  
  45.                 tv_rubbler.setText(str);  
  46.                 ((Text_Rubbler) findViewById(R.id.rubbler))// 初始化状态  
  47.                         .beginRubbler(0xFFFFFFFF20, 1f);  
  48.   
  49.             }  
  50.         });  
  51.   
  52.     }  
  53.   
  54.     class Rubble extends View {  
  55.   
  56.         private final int PAINT_STROKE_WIDTH;  
  57.         private final float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。  
  58.         private final int TEXT_SIZE;  
  59.   
  60.         private Bitmap mBitmap;  
  61.         // 画布  
  62.         private Canvas mCanvas;  
  63.         // 画笔  
  64.         private Paint mPaint;  
  65.         private Path mPath;  
  66.         private float mX, mY;  
  67.         private final int X, Y, W, H;  
  68.   
  69.         private final Rect touchRect;  
  70.   
  71.         public Rubble(Context context, String bgText, Rect rect,  
  72.                 int paintStrokeWidth, float touchTolerance, int textSize) {  
  73.             super(context);  
  74.             setFocusable(true);  
  75.             touchRect = rect;  
  76.             W = rect.right - rect.left;  
  77.             H = rect.bottom - rect.top;  
  78.             X = rect.left;  
  79.             Y = rect.top;  
  80.             TEXT_SIZE = textSize;  
  81.             PAINT_STROKE_WIDTH = paintStrokeWidth;  
  82.             TOUCH_TOLERANCE = touchTolerance;  
  83.             setBackground(touchRect, bgText);  
  84.             initDrowTools();  
  85.   
  86.         }  
  87.   
  88.         private void setBackground(Rect rect, String bgText) {  
  89.             DisplayMetrics dm = new DisplayMetrics();  
  90.             dm = this.getResources().getDisplayMetrics();  
  91.   
  92.             Bitmap bitmap = Bitmap.createBitmap(dm.widthPixels,  
  93.                     dm.heightPixels, Config.ARGB_8888);  
  94.             Canvas canvas = new Canvas(bitmap);  
  95.   
  96.             Paint paint = new Paint();  
  97.             paint.setColor(0x88000000);  
  98.             // paint.setStyle(Style.STROKE);  
  99.             // paint.setTextAlign(Align.CENTER);  
  100.             paint.setTextSize(TEXT_SIZE);  
  101.   
  102.             // paint.setTextScaleX(1.5f);  
  103.             canvas.drawColor(Color.WHITE);  
  104.             // 画字的坐标不好控制  
  105.             int x = rect.left  
  106.                     + (rect.right - rect.left - bgText.length() * TEXT_SIZE)  
  107.                     / 2;  
  108.             int y = rect.top + (rect.bottom - rect.top - TEXT_SIZE) / 2;  
  109.             // int y = 218+25;  
  110.             canvas.drawText(bgText, x, y, paint);  
  111.             Drawable drawable = new BitmapDrawable(bitmap);  
  112.             setBackgroundDrawable(drawable);  
  113.         }  
  114.   
  115.         private void initDrowTools() {  
  116.             // 设置画笔  
  117.             mPaint = new Paint();  
  118.             // mPaint.setAlpha(0);  
  119.             // 画笔划过的痕迹就变成透明色了  
  120.             mPaint.setColor(Color.BLACK); // 此处不能为透明色  
  121.             mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
  122.             // 或者  
  123.             // mPaint.setAlpha(0);  
  124.             // mPaint.setXfermode(new  
  125.             // PorterDuffXfermode(PorterDuff.Mode.DST_IN));  
  126.   
  127.             mPaint.setAntiAlias(true);  
  128.             mPaint.setDither(true);  
  129.             mPaint.setStyle(Paint.Style.STROKE);  
  130.             mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角  
  131.             mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角  
  132.             mPaint.setStrokeWidth(PAINT_STROKE_WIDTH); // 笔宽  
  133.   
  134.             // 痕迹  
  135.             mPath = new Path();  
  136.             ;  
  137.   
  138.             // 覆盖  
  139.             mBitmap = Bitmap.createBitmap(W, H, Config.ARGB_8888);  
  140.             mCanvas = new Canvas(mBitmap);  
  141.             mCanvas.drawColor(0x88000000);  
  142.   
  143.         }  
  144.   
  145.         @Override  
  146.         protected void onDraw(Canvas canvas) {  
  147.             super.onDraw(canvas);  
  148.             mCanvas.drawPath(mPath, mPaint);  
  149.             // mCanvas.drawPoint(mX, mY, mPaint);  
  150.             canvas.drawBitmap(mBitmap, X, Y, null);  
  151.         }  
  152.   
  153.         @Override  
  154.         public boolean onTouchEvent(MotionEvent event) {  
  155.             System.out.print("X--" + event.getX());  
  156.             System.out.println("Y--" + event.getY());  
  157.             if (!touchRect.contains((int) event.getX(), (int) event.getY())) {  
  158.                 return false;  
  159.             }  
  160.   
  161.             switch (event.getAction()) {  
  162.             // 触点按下  
  163.             case MotionEvent.ACTION_DOWN: {  
  164.                 touchDown(event.getRawX(), event.getRawY());  
  165.                 touchDown(event.getX() - touchRect.left, event.getY()  
  166.                         - touchRect.top);  
  167.                 invalidate();  
  168.                 break;  
  169.             }  
  170.                   
  171.             case MotionEvent.ACTION_MOVE: // 触点移动  
  172.                 touchMove(event.getX() - touchRect.left, event.getY()  
  173.                         - touchRect.top);  
  174.   
  175.                 invalidate();  
  176.                 break;  
  177.             case MotionEvent.ACTION_UP: // 触点弹起  
  178.                 touchUp(event.getX() - touchRect.left, event.getY()  
  179.                         - touchRect.top);  
  180.                 invalidate();  
  181.                 break;  
  182.             default:  
  183.                 break;  
  184.             }  
  185.             return true;  
  186.         }  
  187.   
  188.         private void touchDown(float x, float y) {  
  189.             mPath.reset();  
  190.             mPath.moveTo(x, y);  
  191.             mX = x;  
  192.             mY = y;  
  193.         }  
  194.   
  195.         private void touchMove(float x, float y) {  
  196.             float dx = Math.abs(x - mX);  
  197.             float dy = Math.abs(y - mY);  
  198.             if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
  199.                 mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
  200.                 mX = x;  
  201.                 mY = y;  
  202.             }  
  203.   
  204.         }  
  205.   
  206.         private void touchUp(float x, float y) {  
  207.             mPath.lineTo(x, y);  
  208.             mCanvas.drawPath(mPath, mPaint);  
  209.             mPath.reset();  
  210.         }  
  211.   
  212.     }  
  213.   
  214.     /** 
  215.      * 键盘事件,当按下back键的时候询问是否再按一次退出程序 
  216.      */  
  217.     // 退出时间  
  218.     private long exitTime = 0;  
  219.     @Override  
  220.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  221.         if (keyCode == KeyEvent.KEYCODE_BACK  
  222.                 && event.getAction() == KeyEvent.ACTION_DOWN) {  
  223.             if ((System.currentTimeMillis() - exitTime) > 2000) {  
  224.                 Toast.makeText(getApplicationContext(), "再按一次退出程序",  
  225.                         Toast.LENGTH_SHORT).show();  
  226.                 exitTime = System.currentTimeMillis();  
  227.             } else {  
  228.                 finish();  
  229.                 System.exit(0);  
  230.   
  231.             }  
  232.             return true;  
  233.         }  
  234.         return super.onKeyDown(keyCode, event);  
  235.     }  
  236.   
  237. }  

0 0
原创粉丝点击