android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解

主要思想:

将一个view设计成多层:背景层,含中奖信息等;

遮盖层,用于刮奖,使用关联一个Bitmap的Canvas

在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作)

使用paint.setXfermode 来进行消除手势滑动区域

15059139271.jpg?2016231173633

public class GuaView extends View {

private Bitmap mBitmap; //遮盖的图层

private Canvas mCanvas; //绘制遮盖图层

private Paint mOuterPaint;

private Path mPath;

private float mLastX;

private float mLastY;

private Bitmap mCoverBitmap; //遮盖图

private int mWidth,mHeight;

private Paint mInnerPaint;

private String mInfo;

public GuaView(Context context) {

this(context,null);

}

public GuaView(Context context,AttributeSet attrs) {

super(context,attrs);

init();

}

private void init() {

mPath = new Path();

mOuterPaint = new Paint();

mInnerPaint = new Paint();

mCoverBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fg_guaguaka);

mInfo = "¥ 5 0 0";

}

@Override

protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec,heightMeasureSpec);

mWidth = mCoverBitmap.getWidth();

mHeight = mCoverBitmap.getHeight();

setMeasuredDimension(mWidth,mHeight);

mBitmap = Bitmap.createBitmap(mWidth,mHeight,Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

mCanvas.drawBitmap(mCoverBitmap,null);

setOuterPaint();

setInnerPaint();

}

private void setInnerPaint() {

mInnerPaint.setColor(Color.RED);

mInnerPaint.setStyle(Paint.Style.STROKE);

mInnerPaint.setStrokeCap(Paint.Cap.ROUND);

mInnerPaint.setStrokeJoin(Paint.Join.ROUND);

mInnerPaint.setAntiAlias(true);

mInnerPaint.setDither(true); //防抖

mInnerPaint.setStrokeWidth(5);

mInnerPaint.setTextSize(100);

mInnerPaint.setTextAlign(Paint.Align.CENTER);

}

private void setOuterPaint() {

mOuterPaint.setColor(Color.GREEN);

mOuterPaint.setStyle(Paint.Style.STROKE);

mOuterPaint.setStrokeCap(Paint.Cap.ROUND);

mOuterPaint.setStrokeJoin(Paint.Join.ROUND);

mOuterPaint.setAntiAlias(true);

mOuterPaint.setDither(true); //防抖

mOuterPaint.setStrokeWidth(20);

}

@Override //Path

public boolean onTouchEvent(MotionEvent event) {

float x = event.getX();

float y = event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

mLastX = x;

mLastY = y;

mPath.moveTo(x,y);

break;

case MotionEvent.ACTION_MOVE:

float deltaX = Math.abs(x - mLastX);

float deltaY = Math.abs(y - mLastY);

if (deltaX > 5 || deltaY > 5) {

mPath.lineTo(x,y);

}

mLastX = x;

mLastY = y;

break;

case MotionEvent.ACTION_UP:

break;

}

invalidate();//调用onDraw

return true;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawColor(Color.parseColor("#bbbbbb")); //背景底色 灰色

canvas.drawText(mInfo,mWidth / 2,mHeight / 4 * 3,mInnerPaint); //绘制文本

canvas.drawBitmap(mBitmap,null); //绘制mBitmap 这是一个可变的bitmap,通过mCanvas绘制,首先绘制了mCoverBitmap

drawPath();

}

private void drawPath() {

//使用该mode:dst和src相交后, 只保留dst,且除去相交的部份

mOuterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

mCanvas.drawPath(mPath,mOuterPaint);

}

}

Paint.Join 连续画笔衔接时:

MITER 在外边缘以一个锐角连接

ROUND 以圆弧

BEVEL 以直线

Paint.Cap 指定对于 线和路径(lines and paths) 的开始和结束点的处理方式:

BUTT  ends with the path  不超越它

ROUND  with the center at the end of the path 半圆

SQUARE  with the center at the end of the path 方形

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现每日抽奖功能到达抽奖页面抽奖的步骤如下: 1. 在 Android 应用程序的布局文件添加一个按钮,用于触发抽奖事件。 ```xml <Button android:id="@+id/btn_lucky_draw" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击抽奖" /> ``` 2. 创建一个新的 Activity,用于实现抽奖功能,在该 Activity 添加一个布局文件,用于显示抽奖结果。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_lucky_draw_result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="恭喜您奖了!" android:layout_centerInParent="true"/> </RelativeLayout> ``` 3. 在按钮的点击事件启动抽奖 Activity,并传递相关参数。 ```java Button btnLuckyDraw = findViewById(R.id.btn_lucky_draw); btnLuckyDraw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 启动抽奖 Activity Intent intent = new Intent(MainActivity.this, LuckyDrawActivity.class); // 传递相关参数 intent.putExtra("userId", "123456"); startActivity(intent); } }); ``` 4. 在抽奖 Activity 获取传递的参数,并执行抽奖逻辑。 ```java public class LuckyDrawActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lucky_draw); // 获取传递的参数 String userId = getIntent().getStringExtra("userId"); // 执行抽奖逻辑 String result = doLuckyDraw(userId); // 显示抽奖结果 TextView tvLuckyDrawResult = findViewById(R.id.tv_lucky_draw_result); tvLuckyDrawResult.setText(result); } private String doLuckyDraw(String userId) { // TODO: 实现抽奖逻辑 return "恭喜您奖了!"; } } ``` 以上就是实现每日抽奖功能到达抽奖页面抽奖的基本步骤,具体实现根据业务需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值