分享到:
点击次数:333  更新时间:2016-10-11 16:24:04  【打印此页】  【关闭
澳门新濠天地娱乐场澳门新濠天地娱乐定制
当前位置:主页 > 新闻动态 > 技术交流 > Android实现刮刮乐效果

Android实现刮刮乐效果

责任编辑:admin 发布时间:2016-11-11 09:29 浏览次数:

首先要做一个类似橡皮擦的东西吧,然后才能把纸上的笔迹擦除
    /**
     * FileName: SplashActivity.java
     * 
     * @desc 橡皮擦功能,类似刮刮乐效果
     * @author HTP
     * @Date 20140311
     * @version 1.00
     */ 
    public class Text_Rubbler extends TextView { 
     
        private float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。 
     
        // private final int bgColor; 
        // 位图 
        private Bitmap mBitmap; 
        // 画布 
        private Canvas mCanvas; 
        // 画笔 
        private Paint mPaint; 
        private Path mPath; 
        private float mX, mY; 
     
        private boolean isDraw = false; 
     
        public Text_Rubbler(Context context) { 
            /**
             * @param context 上下文
             */ 
            super(context); 
     
        } 
     
        public Text_Rubbler(Context context, AttributeSet attrs, int defStyle) { 
            super(context, attrs, defStyle); 
            // bgColor = 
            // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", 
            // "textColor", 0xFFFFFF); 
            // System.out.println("Color:"+bgColor); 
        } 
     
        public Text_Rubbler(Context context, AttributeSet attrs) { 
            super(context, attrs); 
            // bgColor = 
            // attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", 
            // "textColor", 0xFFFFFF); 
            // System.out.println(bgColor); 
            // System.out.println(attrs.getAttributeValue("http://schemas.android.com/apk/res/android", 
            // "layout_width")); 
        } 
     
        @Override 
        protected void onDraw(Canvas canvas) { 
            super.onDraw(canvas); 
            if (isDraw) { 
     
                mCanvas.drawPath(mPath, mPaint); 
                // mCanvas.drawPoint(mX, mY, mPaint); 
                canvas.drawBitmap(mBitmap, 0, 0, null); 
            } 
        } 
     
        /**
         * 开启檫除功能
         * 
         * @param bgColor
         *            覆盖的背景颜色
         * @param paintStrokeWidth
         *            触点(橡皮)宽度
         * @param touchTolerance
         *            填充距离,值越小,越柔和。
         */ 
        public void beginRubbler(final int bgColor, final int paintStrokeWidth, 
                float touchTolerance) { 
            TOUCH_TOLERANCE = touchTolerance; 
            // 设置画笔 
            mPaint = new Paint(); 
            // mPaint.setAlpha(0); 
            // 画笔划过的痕迹就变成透明色了 
            mPaint.setColor(Color.BLACK); // 此处不能为透明色 
            mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 
            // 或者 
            // mPaint.setAlpha(0); 
            // mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
     
            mPaint.setAntiAlias(true); 
            mPaint.setDither(true); 
            mPaint.setStyle(Paint.Style.STROKE); 
            mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角 
            mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角 
            mPaint.setStrokeWidth(paintStrokeWidth); // 笔宽 
     
            // 痕迹 
            mPath = new Path(); 
            ; 
            // 覆盖 
            // if (getLayoutParams().width == LayoutParams.FILL_PARENT) { 
            // 
            // } 
            mBitmap = Bitmap.createBitmap(getLayoutParams().width, 
                    getLayoutParams().height, Config.ARGB_8888); 
            mCanvas = new Canvas(mBitmap); 
     
            mCanvas.drawColor(bgColor); 
            isDraw = true; 
        } 
     
        @Override 
        public boolean onTouchEvent(MotionEvent event) { 
            if (!isDraw) { 
                return true; 
            } 
            switch (event.getAction()) { 
            case MotionEvent.ACTION_DOWN: // 触点按下 
                // touchDown(event.getRawX(),event.getRawY()); 
                touchDown(event.getX(), event.getY()); 
                invalidate(); 
                break; 
            case MotionEvent.ACTION_MOVE: // 触点移动 
                touchMove(event.getX(), event.getY()); 
                invalidate(); 
                break; 
            case MotionEvent.ACTION_UP: // 触点弹起 
                touchUp(event.getX(), event.getY()); 
                invalidate(); 
                break; 
            default: 
                break; 
            } 
            return true; 
        } 
     
        private void touchDown(float x, float y) { 
            mPath.reset(); 
            mPath.moveTo(x, y); 
            mX = x; 
            mY = y; 
        } 
     
        private void touchMove(float x, float y) { 
            float dx = Math.abs(x - mX); 
            float dy = Math.abs(y - mY); 
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
                mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); 
                mX = x; 
                mY = y; 
            } 
     
        } 
     
        private void touchUp(float x, float y) { 
            mPath.lineTo(x, y); 
            mCanvas.drawPath(mPath, mPaint); 
            mPath.reset(); 
        } 
     
    } 
接下来就是使用橡皮檫擦除了
    /**
     * FileName: RubblerAct.java
     * @Desc    该类通过调用Text_Rubbler这个类将在Activity上显示一片刮一刮的区域,可以出发触摸事件
     * @author  HTP
     * @Date    20140312
     * @version 1.00 
     */ 
     
     
    public class RubblerAct extends Activity { 
        // 刮开后文字显示 
        private TextView tv_rubbler; 
        // 得到刮一刮的内容 
        private Sentence mSentence; 
        // 下一张 
        private TextView tv_next; 
     
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
     
            // setContentView(new Rubble(this,"谢谢惠顾",new Rect(100, 200, 
            // 300,250),2,1f,14)); 
     
            // ///////////////////////////////////////// 
            setContentView(R.layout.rubbler); 
            // 设置的颜色必须要有透明度。 
            ((Text_Rubbler) findViewById(R.id.rubbler)).beginRubbler(0xFFFFFFFF, 20, 
                    1f);// 设置橡皮擦的宽度等 
            mSentence = new Sentence(); 
            // 随机初始化文字 
            tv_rubbler = (TextView) findViewById(R.id.rubbler); 
            String str = mSentence.getSentence(); 
            tv_rubbler.setText(str); 
     
            tv_next = (TextView) findViewById(R.id.tv_next); 
     
            // 点击下一步 
            tv_next.setOnClickListener(new OnClickListener() { 
     
                @Override 
                public void onClick(View v) { 
                    // TODO Auto-generated method stub 
                    String str = mSentence.getSentence(); 
                    tv_rubbler.setText(str); 
                    ((Text_Rubbler) findViewById(R.id.rubbler))// 初始化状态 
                            .beginRubbler(0xFFFFFFFF, 20, 1f); 
     
                } 
            }); 
     
        } 
     
        class Rubble extends View { 
     
            private final int PAINT_STROKE_WIDTH; 
            private final float TOUCH_TOLERANCE; // 填充距离,使线条更自然,柔和,值越小,越柔和。 
            private final int TEXT_SIZE; 
     
            private Bitmap mBitmap; 
            // 画布 
            private Canvas mCanvas; 
            // 画笔 
            private Paint mPaint; 
            private Path mPath; 
            private float mX, mY; 
            private final int X, Y, W, H; 
     
            private final Rect touchRect; 
     
            public Rubble(Context context, String bgText, Rect rect, 
                    int paintStrokeWidth, float touchTolerance, int textSize) { 
                super(context); 
                setFocusable(true); 
                touchRect = rect; 
                W = rect.right - rect.left; 
                H = rect.bottom - rect.top; 
                X = rect.left; 
                Y = rect.top; 
                TEXT_SIZE = textSize; 
                PAINT_STROKE_WIDTH = paintStrokeWidth; 
                TOUCH_TOLERANCE = touchTolerance; 
                setBackground(touchRect, bgText); 
                initDrowTools(); 
     
            } 
     
            private void setBackground(Rect rect, String bgText) { 
                DisplayMetrics dm = new DisplayMetrics(); 
                dm = this.getResources().getDisplayMetrics(); 
     
                Bitmap bitmap = Bitmap.createBitmap(dm.widthPixels, 
                        dm.heightPixels, Config.ARGB_8888); 
                Canvas canvas = new Canvas(bitmap); 
     
                Paint paint = new Paint(); 
                paint.setColor(0x88000000); 
                // paint.setStyle(Style.STROKE); 
                // paint.setTextAlign(Align.CENTER); 
                paint.setTextSize(TEXT_SIZE); 
     
                // paint.setTextScaleX(1.5f); 
                canvas.drawColor(Color.WHITE); 
                // 画字的坐标不好控制 
                int x = rect.left 
                        + (rect.right - rect.left - bgText.length() * TEXT_SIZE) 
                        / 2; 
                int y = rect.top + (rect.bottom - rect.top - TEXT_SIZE) / 2; 
                // int y = 218+25; 
                canvas.drawText(bgText, x, y, paint); 
                Drawable drawable = new BitmapDrawable(bitmap); 
                setBackgroundDrawable(drawable); 
            } 
     
            private void initDrowTools() { 
                // 设置画笔 
                mPaint = new Paint(); 
                // mPaint.setAlpha(0); 
                // 画笔划过的痕迹就变成透明色了 
                mPaint.setColor(Color.BLACK); // 此处不能为透明色 
                mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 
                // 或者 
                // mPaint.setAlpha(0); 
                // mPaint.setXfermode(new 
                // PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
     
                mPaint.setAntiAlias(true); 
                mPaint.setDither(true); 
                mPaint.setStyle(Paint.Style.STROKE); 
                mPaint.setStrokeJoin(Paint.Join.ROUND); // 前圆角 
                mPaint.setStrokeCap(Paint.Cap.ROUND); // 后圆角 
                mPaint.setStrokeWidth(PAINT_STROKE_WIDTH); // 笔宽 
     
                // 痕迹 
                mPath = new Path(); 
                ; 
     
                // 覆盖 
                mBitmap = Bitmap.createBitmap(W, H, Config.ARGB_8888); 
                mCanvas = new Canvas(mBitmap); 
                mCanvas.drawColor(0x88000000); 
     
            } 
     
            @Override 
            protected void onDraw(Canvas canvas) { 
                super.onDraw(canvas); 
                mCanvas.drawPath(mPath, mPaint); 
                // mCanvas.drawPoint(mX, mY, mPaint); 
                canvas.drawBitmap(mBitmap, X, Y, null); 
            } 
     
            @Override 
            public boolean onTouchEvent(MotionEvent event) { 
                System.out.print("X--" + event.getX()); 
                System.out.println("Y--" + event.getY()); 
                if (!touchRect.contains((int) event.getX(), (int) event.getY())) { 
                    return false; 
                } 
     
                switch (event.getAction()) { 
                // 触点按下 
                case MotionEvent.ACTION_DOWN: { 
                    touchDown(event.getRawX(), event.getRawY()); 
                    touchDown(event.getX() - touchRect.left, event.getY() 
                            - touchRect.top); 
                    invalidate(); 
                    break; 
                } 
                     
                case MotionEvent.ACTION_MOVE: // 触点移动 
                    touchMove(event.getX() - touchRect.left, event.getY() 
                            - touchRect.top); 
     
                    invalidate(); 
                    break; 
                case MotionEvent.ACTION_UP: // 触点弹起 
                    touchUp(event.getX() - touchRect.left, event.getY() 
                            - touchRect.top); 
                    invalidate(); 
                    break; 
                default: 
                    break; 
                } 
                return true; 
            } 
     
            private void touchDown(float x, float y) { 
                mPath.reset(); 
                mPath.moveTo(x, y); 
                mX = x; 
                mY = y; 
            } 
     
            private void touchMove(float x, float y) { 
                float dx = Math.abs(x - mX); 
                float dy = Math.abs(y - mY); 
                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
                    mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); 
                    mX = x; 
                    mY = y; 
                } 
     
            } 
     
            private void touchUp(float x, float y) { 
                mPath.lineTo(x, y); 
                mCanvas.drawPath(mPath, mPaint); 
                mPath.reset(); 
            } 
     
        } 
     
        /**
         * 键盘事件,当按下back键的时候询问是否再按一次退出程序
         */ 
        // 退出时间 
        private long exitTime = 0; 
        @Override 
        public boolean onKeyDown(int keyCode, KeyEvent event) { 
            if (keyCode == KeyEvent.KEYCODE_BACK 
                    && event.getAction() == KeyEvent.ACTION_DOWN) { 
                if ((System.currentTimeMillis() - exitTime) > 2000) { 
                    Toast.makeText(getApplicationContext(), "再按一次退出程序", 
                            Toast.LENGTH_SHORT).show(); 
                    exitTime = System.currentTimeMillis(); 
                } else { 
                    finish(); 
                    System.exit(0); 
     
                } 
                return true; 
            } 
            return super.onKeyDown(keyCode, event); 
        } 
     
    }