scartch2应该如何制作一个刮刮乐?

ftujgju |浏览760次
收藏|2020/02/27 21:01

满意回答

2020/02/27 21:33

Created by Administrator on 2017/2/25.* 刮刮乐 效果*/public class ScratchTextView extends TextView{ private static final String TAG = "ScratchTextView"; private Bitmap mbitmap;// 盖在字上面的图片 private Canvas mCanvas; //画线的画布 private Paint mPaint;//划线的画笔 private Path mPath;//线 private float mX, mY; private float TOUCH_TOLERANCE; private boolean isInited = false;//用于判断时候覆盖了textview的文字 public ScratchTextView(Context context) { super(context); } public ScratchTextView(Context context, AttributeSet attrs) { super(context, attrs); } public ScratchTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //onDraw初始化的时候调用一次,然invalidate()的时候调用, @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isInited) { mCanvas.drawPath(mPath, mPaint);//把线画到mCanvas上,mCanva会把线画到mBitmap canvas.drawBitmap(mbitmap, 0, 0, null);// 把mBitmap画到textview上 canvas是父textvie传过来的。 } } /** * 初始化刮刮卡 * * @param bgColor 刮刮卡背景色,用于盖住下面的字 * @param paintStrokeWidth 擦除线宽 * @param touchTolerance 画线容差 */ public void initScratchCard(final int bgColor, final int paintStrokeWidth, float touchTolerance) { TOUCH_TOLERANCE = touchTolerance; mPaint = new Paint();//创建画笔 mPaint.setAlpha(240); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));// mPaint.setAntiAlias(true);// 抗锯齿 mPaint.setDither(true);// 防抖动 mPaint.setStyle(Paint.Style.STROKE);// 画笔类型: STROKE空心 FILL实心 FILL_AND_STROKE用契形填充 mPaint.setStrokeJoin(Paint.Join.ROUND);// 画笔接洽点类型 mPaint.setStrokeCap(Paint.Cap.ROUND);// 画笔笔刷类型 mPaint.setStrokeWidth(paintStrokeWidth);// 画笔笔刷宽度 mPath = new Path(); //建立一个空的Bit mbitmap = Bitmap.createBitmap(getLayoutParams().width, getLayoutParams().height, Bitmap.Config.ARGB_8888);// mCanvas = new Canvas(mbitmap);//通过bitmap生成一个画布 Paint paint = new Paint();//用于绘制生成的背景图片的字体 paint.setTextSize(50);///字体大小 paint.setColor(Color.parseColor("#ff0717")); mCanvas.drawColor(bgColor);//背景色 //.从资源文件中获取图片 Bitmap photo = BitmapFactory.decodeResource(this.getResources(), R.drawable.maojin_ic); mCanvas.drawBitmap(photo, 0 , 1 , paint);//设置遮盖层的图片。比如说,衣服 //设置外层的文字。 mCanvas.drawText("不要嘛!!", getLayoutParams().width / 4, getLayoutParams().height / 2 + 15, paint); isInited = true; } //该触膜事件可以定义在调用的activity中实现 @Override public boolean onTouchEvent(MotionEvent event) { if (!isInited) { return true; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPath.reset(); // 重置绘制路线,即隐藏之前绘制的轨迹 mPath.moveTo(event.getX(), event.getY()); // mPath绘制的绘制起点 mX = event.getX(); mY = event.getY(); invalidate();//更新界面 Log.d(TAG, mX + "|" + mY); break; case MotionEvent.ACTION_MOVE: //x和y移动的距离 float dx = Math.abs(event.getX() - mX); float dy = Math.abs(event.getY() - mY); //x,y移动的距离大于画线容差 if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { // 二次贝塞尔,实现平滑曲线;mX, mY为操作点,(x + mX) / 2, (y + mY) / 2为终点 mPath.quadTo(mX, mY, (event.getX() + mX) / 2, (event.getY() + mY) / 2); // 第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值 mX = event.getX(); mY = event.getY(); Log.d(TAG, mX + "|" + mY); invalidate(); break; } } return true; }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141152,如何使用protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shave); ButterKnife.bind(this); String[] str_reward = {"讨厌!", "舒服1000!", "真爽10000!","真爽10000!"}; scratchTv.setText(str_reward[getRandom()]); scratchTv.initScratchCard(0xFFFFFFFF, 20, 1f);//调用方法,初始化scartchTextView 最外层的颜色// getResources().getColor(R.color.btn_fuse_color_c) } private int getRandom() { Random random = new Random(); int number = random.nextInt(5); return number; }}123456789101112131415点赞————————————————版权声明:本文为CSDN博主「随缘的人_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_26841579/article/details/70186348

360U3190187097

其他回答(2)
  • 实际就是制作一个故事,首先你有故事的剧本,具体方法可以参考Scratch2自带的帮助中的案例《创作故事》来制作。
    回答于 2020/02/27 22:18
  • 1,先继承TextView/** * Created by Administrator on 2017/2/25.* 刮刮乐 效果 */public class ScratchTextView extends TextView{private static final String TAG = "ScratchTextView";private Bitmap mbitmap;// 盖在字上面的图片private Canvas mCanvas; //画线的画布private Paint mPaint;//划线的画笔private Path mPath;//线private float mX, mY;private float TOUCH_TOLERANCE;private boolean isInited = false;//用于判断时候覆盖了textview的文字public ScratchTextView(Context context) {super(context);}public ScratchTextView(Context context, AttributeSet attrs) {super(context, attrs);}public ScratchTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); }//onDraw初始化的时候调用一次,然invalidate()的时候调用,@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (isInited) {mCanvas.drawPath(mPath, mPaint);//把线画到mCanvas上,mCanva会把线画到mBitmapcanvas.drawBitmap(mbitmap, 0, 0, null);// 把mBitmap画到textview上 canvas是父textvie传过来的。}}/*** 初始化刮刮卡** @param bgColor刮刮卡背景色,用于盖住下面的字* @param paintStrokeWidth 擦除线宽* @param touchTolerance 画线容差*/public void initScratchCard(final int bgColor, final int paintStrokeWidth, float touchTolerance) {TOUCH_TOLERANCE = touchTolerance;mPaint = new Paint();//创建画笔mPaint.setAlpha(240);mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//mPaint.setAntiAlias(true);// 抗锯齿mPaint.setDither(true);// 防抖动mPaint.setStyle(Paint.Style.STROKE);// 画笔类型: STROKE空心 FILL实心 FILL_AND_STROKE用契形填充 mPaint.setStrokeJoin(Paint.Join.ROUND);// 画笔接洽点类型mPaint.setStrokeCap(Paint.Cap.ROUND);// 画笔笔刷类型mPaint.setStrokeWidth(paintStrokeWidth);// 画笔笔刷宽度mPath = new Path(); //建立一个空的Bitmbitmap = Bitmap.createBitmap(getLayoutParams().width, getLayoutParams().height, Bitmap.Config.ARGB_8888);//mCanvas = new Canvas(mbitmap);//通过bitmap生成一个画布Paint paint = new Paint();//用于绘制生成的背景图片的字体paint.setTextSize(50);///字体大小paint.setColor(Color.parseColor("#ff0717"));mCanvas.drawColor(bgColor);//背景色//.从资源文件中获取图片Bitmap photo = BitmapFactory.decodeResource(this.getResources(), R.drawable.maojin_ic);mCanvas.drawBitmap(photo, 0 , 1 , paint);//设置遮盖层的图片。比如说,衣服//设置外层的文字。mCanvas.drawText("不要嘛!!", getLayoutParams().width / 4, getLayoutParams().height / 2 + 15, paint);isInited = true;}//该触膜事件可以定义在调用的activity中实现@Overridepublic boolean onTouchEvent(MotionEvent event) {if (!isInited) {return true;}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPath.reset();// 重置绘制路线,即隐藏之前绘制的轨迹mPath.moveTo(event.getX(), event.getY());// mPath绘制的绘制起点mX = event.getX();mY = event.getY();invalidate();//更新界面Log.d(TAG, mX + "|" + mY);break;case MotionEvent.ACTION_MOVE://x和y移动的距离float dx = Math.abs(event.getX() - mX);float dy = Math.abs(event.getY() - mY);//x,y移动的距离大于画线容差if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {// 二次贝塞尔,实现平滑曲线;mX, mY为操作点,(x + mX) / 2, (y + mY) / 2为终点mPath.quadTo(mX, mY, (event.getX() + mX) / 2, (event.getY() + mY) / 2);// 第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值mX = event.getX();mY = event.getY();Log.d(TAG, mX + "|" + mY);invalidate();break;}}return true;}}2,如何使用protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_shave);ButterKnife.bind(this);String[] str_reward = {"讨厌!", "舒服1000!", "真爽10000!","真爽10000!"};scratchTv.setText(str_reward[getRandom()]);scratchTv.initScratchCard(0xFFFFFFFF, 20, 1f);//调用方法,初始化scartchTextView 最外层的颜色//getResources().getColor(R.color.btn_fuse_color_c)}private int getRandom() {Random random = new Random();int number = random.nextInt(5);return number;}}点赞收藏分享One_Piece_Hope发布了15 篇原创文章 · 获赞 2 · 访问量 1万+私信关注展开阅读全文天一方蓝2年前学习了,赞一个自定义view实现刮刮乐的效果阅读数 270package com.example.fw.view;import android.content.Context;import android.graphics.Bitmap;import and...博文来自:MessageFang的博客刮刮乐自定义view阅读数 7说明:该代码是参考鸿洋大神的刮刮乐自定义view来写的。实现:刮刮乐-刮奖的效果,如下效果下面直接放代码了:只有一个自定义view,要实现真正的功能还需要进一步封装 1 /** 2 * 自...博文来自:adam0328的博客超简单的刮刮乐前端实现 09-04 超简单的刮刮乐,刮票时不会产生断点情况。直接上代码 下载Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么阅读数 50转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163,————————————————版权声明:本文为CSDN博主「One_Piece_Hope」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_39969337/article/details/78538775
    回答于 2020/02/27 21:50
0人关注该问题
+1

 加载中...