首页 > 代码库 > 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、自定义控件-----刮刮奖
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。