当前位置: 首页 > 工具软件 > 刮刮奖 > 使用案例 >

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

万俟鸿波
2023-12-01
  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     <RelativeLayout
10         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         <TextView
18             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         <TextView
26             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     <ImageView
35         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_width
46      android:layout_height 
47      的值为常量
48     -->
49 
50     <org.delmore.rubble.Text_Rubbler
51         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 }

 

转载于:https://www.cnblogs.com/androidsj/p/3983639.html

 类似资料: