zoukankan      html  css  js  c++  java
  • 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     <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.活动时间
       2013年11月21日起~2014年1月1日止
    2.活动内容
       活动期间,登陆游戏即有机会抽取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="怎么可能
    会中奖!"
    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 }
  • 相关阅读:
    各种计算
    C# 杂货
    Unity String格式化字符串
    unity 窗口化运行时取消边框
    WPF开机自启
    wpf 如何让当前窗口隐藏
    Unity 安卓杂货
    unity的一些杂货
    C# 项目中遇到过的坑(持续更新)
    C# 并入UI线程
  • 原文地址:https://www.cnblogs.com/androidsj/p/3983639.html
Copyright © 2011-2022 走看看