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 }