首页 > 代码库 > 3、自定义控件-----刮刮奖

3、自定义控件-----刮刮奖

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

 

 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout  3     xmlns:android="http://schemas.android.com/apk/res/android" 4     android:layout_width="fill_parent" 5     android:layout_height="fill_parent" 6     android:background="@drawable/make_bg" 7     android:orientation="vertical" > 8  9     <RelativeLayout10         android:id="@+id/prize_title"11         android:layout_width="wrap_content"12         android:layout_height="wrap_content"13         android:layout_centerHorizontal="true"14         android:layout_centerVertical="true"15         android:layout_margin="10dp" >16 17         <TextView18             android:id="@+id/prize_to1"19             android:layout_width="wrap_content"20             android:layout_height="wrap_content"21             android:text="活动规则"22             android:textColor="#ffd249"23             android:textSize="20sp" />24 25         <TextView26             android:id="@+id/prize_to2"27             android:layout_width="wrap_content"28             android:layout_height="wrap_content"29             android:layout_below="@+id/prize_to1"30             android:text="1.活动时间\n   2013年11月21日起~2014年1月1日止\n2.活动内容\n   活动期间,登陆游戏即有机会抽取4999红包大奖"31             android:textColor="#fff" />32     </RelativeLayout>33 34     <ImageView35         android:id="@+id/ima"36         android:layout_width="wrap_content"37         android:layout_height="wrap_content"38         android:layout_above="@+id/prize_title"39         android:layout_centerHorizontal="true"40         android:background="@drawable/mm_gold"41         android:padding="10dp" />42 43     <!--44      必须设置45      android:layout_width46      android:layout_height 47      的值为常量48     -->49 50     <org.delmore.rubble.Text_Rubbler51         android:id="@+id/rubbler"52         android:layout_width="235dip"53         android:layout_height="60dip"54         android:layout_below="@+id/prize_title"55         android:layout_centerHorizontal="true"56         android:gravity="center"57         android:padding="10dp"58         android:text="怎么可能\n会中奖!"59         android:textColor="#FFF" />61 </RelativeLayout>
  1 import android.content.Context;  2 import android.graphics.Bitmap;  3 import android.graphics.Bitmap.Config;  4 import android.graphics.Canvas;  5 import android.graphics.Color;  6 import android.graphics.Paint;  7 import android.graphics.Path;  8 import android.graphics.PorterDuff;  9 import android.graphics.PorterDuffXfermode; 10 import android.util.AttributeSet; 11 import android.view.MotionEvent; 12 import android.widget.TextView; 13  14 /** 15  * 橡皮檫功能,类似刮刮乐效果 16  */ 17 public class Text_Rubbler extends TextView { 19     // 填充距离,使线条更自然,柔和,值越小,越柔和。 20     private float TOUCH_TOLERANCE; 22     private Bitmap mBitmap; 23     private Canvas mCanvas; 24     private Paint mPaint; 25     private Path mPath; 26     private float mX, mY; 28     private boolean isDraw = false; 29  30     public Text_Rubbler(Context context) { 31         super(context); 32     } 33  34 public Text_Rubbler(Context context, AttributeSet attrs, int defStyle) { 35         super(context, attrs, defStyle); 36     } 37  38     public Text_Rubbler(Context context, AttributeSet attrs) { 39         super(context, attrs); 40     } 41  42     @Override 43     protected void onDraw(Canvas canvas) { 44         super.onDraw(canvas); 45         if (isDraw) { 46             mCanvas.drawPath(mPath, mPaint); 47             // mCanvas.drawPoint(mX, mY, mPaint); 48             canvas.drawBitmap(mBitmap, 0, 0, null); 49         } 50     } 51  52     /** 53      * 开启檫除功能 54      *  55      * @param bgColor 56      *            覆盖的背景颜色 57      * @param paintStrokeWidth 58      *            触点(橡皮)宽度 59      * @param touchTolerance 60      *            填充距离,值越小,越柔和。 61      */ 62     public void beginRubbler(final int bgColor, 
final int paintStrokeWidth,float touchTolerance) { 64 TOUCH_TOLERANCE = touchTolerance; 65 // 设置画笔 66 mPaint = new Paint(); 67 mPaint.setAlpha(0); 68 // 画笔划过的痕迹就变成透明色了 69 mPaint.setColor(Color.BLACK); // 此处不能为透明色 70 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 71 // 或者 72 // mPaint.setAlpha(0); 73 // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 74 75 mPaint.setAntiAlias(true); 76 mPaint.setDither(true); 77 mPaint.setStyle(Paint.Style.STROKE); 78 mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角 79 mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角 80 mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽 81 82 // 痕迹 83 mPath = new Path(); 84 ; 85 // 覆盖 86 // if (getLayoutParams().width == LayoutParams.FILL_PARENT) { 87 // 88 // } 89 mBitmap = Bitmap.createBitmap(getLayoutParams().width, 90 getLayoutParams().height, Config.ARGB_8888); 91 mCanvas = new Canvas(mBitmap); 92 93 mCanvas.drawColor(bgColor); 94 isDraw = true; 95 } 96 97 @Override 98 public boolean onTouchEvent(MotionEvent event) { 99 if (!isDraw) {100 return true;101 }102 switch (event.getAction()) {103 case MotionEvent.ACTION_DOWN: // 触点按下104 // touchDown(event.getRawX(),event.getRawY());105 touchDown(event.getX(), event.getY());106 invalidate();107 break;108 case MotionEvent.ACTION_MOVE: // 触点移动109 touchMove(event.getX(), event.getY());110 invalidate();111 break;112 case MotionEvent.ACTION_UP: // 触点弹起113 touchUp(event.getX(), event.getY());114 invalidate();115 break;116 default:117 break;118 }119 return true;120 }121 122 private void touchDown(float x, float y) {123 mPath.reset();124 mPath.moveTo(x, y);125 mX = x;126 mY = y;127 }128 129 private void touchMove(float x, float y) {130 float dx = Math.abs(x - mX);131 float dy = Math.abs(y - mY);132 if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {133 mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);134 mX = x;135 mY = y;136 }137 }138 139 private void touchUp(float x, float y) {140 mPath.lineTo(x, y);141 mCanvas.drawPath(mPath, mPaint);142 mPath.reset();143 }144 145 }

 

3、自定义控件-----刮刮奖