SurfaceView实现红包雨平移动画

所属分类: 软件编程 / Android 阅读数: 95
收藏 0 赞 0 分享

使用SurfaceView实现简单的红包雨动画,供大家参考,具体内容如下

具体代码:SurfaceViewDemo

public class TranslateSurfaceView extends SurfaceView implements DrawInterface {
  private DrawHandler drawHandler;
  private int width;
  private int height;
  private Bitmap bitmap;
  private int bitmapWidth;
  private int bitmapHeight;
  private Toast toast;
  private int count = 0;
 
  private ArrayList<MoveModel> moveList = new ArrayList<>();
 
  public TranslateSurfaceView(Context context) {
    this(context, null);
  }
 
  public TranslateSurfaceView(Context context, AttributeSet attrs) {
    this(context, attrs, -1);
  }
 
  public TranslateSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }
 
  private void init() {
    SurfaceHolder holder = getHolder();
    setZOrderOnTop(true);
    holder.setFormat(PixelFormat.TRANSLUCENT);
  }
 
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = getMeasuredWidth();
    height = getMeasuredHeight();
  }
 
  public void prepare() {
    DrawThread drawThread = new DrawThread();
    drawThread.start();
    drawHandler = new DrawHandler(drawThread.getLooper(), this);
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_redenvelope2);
    bitmapWidth = bitmap.getWidth();
    bitmapHeight = bitmap.getHeight();
 
  }
 
  public void addMoveModel(MoveModel moveModel) {
    moveList.add(moveModel);
  }
 
  public void start() {
    count = 0;
    moveList.clear();
    for (int i = 0; i < 10; i++) {
      generateModel();
    }
    drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
  }
 
  public void resume() {
    drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
  }
 
  public void pause() {
    drawHandler.sendEmptyMessage(DrawHandler.STOP_DRAW_KEY);
  }
 
  public void quit() {
    if (null != bitmap) {
      bitmap.recycle();
    }
    if (null != drawHandler) {
      drawHandler.removeCallbacksAndMessages(null);
      drawHandler.getLooper().quit();
    }
  }
 
  @Override
  public void startDraw() {
    SurfaceHolder holder = getHolder();
    Canvas canvas = holder.lockCanvas();
    if (null == canvas) {
      return;
    }
 
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
 
    for (MoveModel moveModel : moveList) {
      canvas.drawBitmap(bitmap, moveModel.x, moveModel.y, paint);
      if (moveModel.x > width || moveModel.y > height) {
        resetMoveModel(moveModel);
      } else {
        moveModel.y += moveModel.randomY;
      }
    }
    holder.unlockCanvasAndPost(canvas);
    drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
  }
 
  @Override
  public void stopDraw() {
    drawHandler.removeMessages(DrawHandler.START_DRAW_KEY);
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    int action = event.getActionMasked();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        checkInRect((int) event.getX(), (int) event.getY());
        break;
    }
    return true;
  }
 
  /**
   * 是否点击在红包区域
   * @param x
   * @param y
   */
  private void checkInRect(int x, int y) {
    int length = moveList.size();
    for (int i = 0; i < length; i++) {
      MoveModel moveModel = moveList.get(i);
      Rect rect = new Rect((int) moveModel.x, (int) moveModel.y, (int) moveModel.x + bitmapWidth, (int) moveModel.y + bitmapHeight);
      if (rect.contains(x, y)) {
        count++;
        resetMoveModel(moveModel);
        if (toast == null) {
          toast = Toast.makeText(getContext(), "", Toast.LENGTH_SHORT);
        }
        toast.setText("抢到红包" + count);
        toast.show();
        break;
      }
    }
  }
 
  private void resetMoveModel(MoveModel moveModel) {
    Random random = new Random();
    moveModel.x = random.nextInt(11) * (width / 10);
    moveModel.y = 0;
    moveModel.randomY = (random.nextInt(5) + 2) * getResources().getDisplayMetrics().density * 1.4f;
  }
 
  private void generateModel() {
    Random random = new Random();
    MoveModel moveModel = new MoveModel();
    moveModel.moveId = moveList.size() + 1;
    moveModel.x = random.nextInt(11) * (width / 10);
    moveModel.y = 0;
    moveModel.randomY = (random.nextInt(5) + 2) * getResources().getDisplayMetrics().density * 1.4f;
    moveList.add(moveModel);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android样式和主题之选择器的实例讲解

今天小编就为大家分享一篇关于Android样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多