Android直播app送礼物连击动画效果(实例代码)

 更新时间:2017年07月12日 09:51:45   作者:yylyingy  
最近在做公司的直播项目,需要实现一个观看端连击送礼物的控件,下面给大家分享实例代码,需要的的朋友参考下吧

最近在做公司的直播项目,需要实现一个观看端连击送礼物的控件:

直接上代码:

/**
 * @author yangyinglong on 2017/7/11 16:52.
 * @Description: todo(这里用一句话描述这个类的作用)
 * @Copyright Copyright (c) 2017 Tuandai Inc. All Rights Reserved.
 */
public class CustomGiftView extends LinearLayout {
  private Timer timer;
  private List<View> giftViewCollection = new ArrayList<>();
  public CustomGiftView(Context context) {
    this(context,null);
  }
  public CustomGiftView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
  }
  public CustomGiftView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    this(context, attrs, defStyleAttr,0);
  }
  public CustomGiftView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
  }
  /**
   *<br> Description: todo(这里用一句话描述这个方法的作用)
   *<br> Author:   yangyinglong
   *<br> Date:    2017/7/11 17:40
   */
  public void pause() {
    if (null != timer) {
      timer.cancel();
    }
  }
  public void cancel() {
    if (null != timer) {
      timer.cancel();
    }
  }
  public void resume() {
    clearTiming();
  }
  /**
   * 定时清除礼物
   */
  private void clearTiming() {
    TimerTask task = new TimerTask() {
      @Override
      public void run() {
        int count = CustomGiftView.this.getChildCount();
        for (int i = 0; i < count; i++) {
          View view = CustomGiftView.this.getChildAt(i);
          CustomRoundView crvheadimage = (CustomRoundView) view.findViewById(R.id.crvheadimage);
          long nowtime = System.currentTimeMillis();
          long upTime = (Long) crvheadimage.getTag();
          if ((nowtime - upTime) >= 3000) {
            final int j = i;
            post(new Runnable() {
              @Override
              public void run() {
                CustomGiftView.this.removeViewAt(j);
              }
            });
//            removeGiftView(i);
            return;
          }
        }
      }
    };
    if (null != timer) {
      timer.cancel();
    }
    timer = new Timer();
    timer.schedule(task, 0, 100);
  }
  /**
   * 添加礼物view,(考虑垃圾回收)
   */
  private View addGiftView() {
    View view = null;
    if (giftViewCollection.size() <= 0) {
      /*如果垃圾回收中没有view,则生成一个*/
      view = LayoutInflater.from(getContext()).inflate(R.layout.item_gift, null);
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
      lp.topMargin = 10;
      view.setLayoutParams(lp);
      this.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View view) { }
        //复用Item,当一个View移除时将它放到池内
        @Override
        public void onViewDetachedFromWindow(View view) {
          if (giftViewCollection.size() < 5) {
            giftViewCollection.add(view);
          }
        }
      });
    } else {
      //如果Item池内有缓存的view,将它取出来,并从池中删除
      view = giftViewCollection.get(0);
      giftViewCollection.remove(view);
    }
    return view;
  }
  /**
   *<br> Description: todo(这里用一句话描述这个方法的作用)
   *<br> Author:   yangyinglong
   *<br> Date:    2017/7/11 16:54
   * @param tag
   */
  public void showGift(String tag) {
    View giftView = this.findViewWithTag(tag);
    if (giftView == null) {/*该用户不在礼物显示列表*/
      giftView = addGiftView();/*获取礼物的View的布局*/
      giftView.setTag(tag);/*设置view标识*/
      CustomRoundView crvheadimage = (CustomRoundView) giftView.findViewById(R.id.crvheadimage);
      final MagicTextView giftNum = (MagicTextView) giftView.findViewById(R.id.giftNum);/*找到数量控件*/
      TextView sender = (TextView) giftView.findViewById(R.id.sender);
      sender.setText(tag);
      giftNum.setText("x1");/*设置礼物数量*/
      crvheadimage.setTag(System.currentTimeMillis());/*设置时间标记*/
      giftNum.setTag(1);/*给数量控件设置标记*/
      this.addView(giftView,0);/*将礼物的View添加到礼物的ViewGroup中*/
//      llgiftcontent.invalidate();/*刷新该view*/
      TranslateAnimation inAnim = (TranslateAnimation) AnimationUtils.loadAnimation(getContext(), R.anim.gift_in);
      giftView.startAnimation(inAnim);/*开始执行显示礼物的动画*/
      inAnim.setAnimationListener(new Animation.AnimationListener() {/*显示动画的监听*/
        @Override
        public void onAnimationStart(Animation animation) { }
        @Override
        public void onAnimationEnd(Animation animation) {
          //注释调,第一次添加没动画
//          giftNumAnim.start(giftNum);
          Log.d("gao","" + CustomGiftView.this.getHeight());
        }
        @Override
        public void onAnimationRepeat(Animation animation) { }
      });
    } else {/*该用户在礼物显示列表*/
      for (int i = 0;i < CustomGiftView.this.getChildCount();i ++) {
        if (giftView.equals(CustomGiftView.this.getChildAt(i))) {
          if (i >= 3) {
            CustomGiftView.this.removeView(giftView);
          }
        }
      }
//            llgiftcontent.addView(giftView,0);
      CustomRoundView crvheadimage = (CustomRoundView) giftView.findViewById(R.id.crvheadimage);/*找到头像控件*/
      MagicTextView giftNum = (MagicTextView) giftView.findViewById(R.id.giftNum);/*找到数量控件*/
      int showNum = (Integer) giftNum.getTag() + 1;
      giftNum.setText("x"+showNum);
      giftNum.setTag(showNum);
      crvheadimage.setTag(System.currentTimeMillis());
      new NumAnim().start(giftNum);
    }
  }
  /**
   * 数字放大动画
   */
  public static class NumAnim {
    private Animator lastAnimator = null;
    public void start(View view) {
      if (lastAnimator != null) {
        lastAnimator.removeAllListeners();
        lastAnimator.end();
        lastAnimator.cancel();
      }
      ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX",0.7f, 1.5f,1f);
      ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY",0.7f, 1.5f,1f);
      AnimatorSet animSet = new AnimatorSet();
      lastAnimator = animSet;
      animSet.setDuration(500);
      animSet.setInterpolator(new OvershootInterpolator());
      animSet.playTogether(anim1, anim2);
      animSet.start();
    }
  }
  public static class GiftInfo {
    private String senderFace;
    private String senderNickName;
    private String giftUrl;
    private int giftID;
    public String getSenderFace() {
      return senderFace;
    }
    public void setSenderFace(String senderFace) {
      this.senderFace = senderFace;
    }
    public String getSenderNickName() {
      return senderNickName;
    }
    public void setSenderNickName(String senderNickName) {
      this.senderNickName = senderNickName;
    }
    public String getGiftUrl() {
      return giftUrl;
    }
    public void setGiftUrl(String giftUrl) {
      this.giftUrl = giftUrl;
    }
    public int getGiftID() {
      return giftID;
    }
    public void setGiftID(int giftID) {
      this.giftID = giftID;
    }
  }
}

以上所述是小编给大家介绍的Android直播app礼物连击动画效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • android中使用Activity实现监听手指上下左右滑动

    android中使用Activity实现监听手指上下左右滑动

    这篇文章主要介绍了android中使用Activity实现监听手指上下左右滑动,本文使用了Activity的ontouchEvent方法监听手指点击事件,并给出代码实例,需要的朋友可以参考下
    2015-05-05
  • Flutter定义tabbar底部导航路由跳转的方法

    Flutter定义tabbar底部导航路由跳转的方法

    这篇文章主要为大家详细介绍了Flutter定义tabbar底部导航路由跳转的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Android SharePreferences与数据库SQLite存储实现方法介绍

    Android SharePreferences与数据库SQLite存储实现方法介绍

    这篇文章主要介绍了Android SharePreferences与数据库SQLite用于存储的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • Android实现屏幕旋转四个方向准确监听

    Android实现屏幕旋转四个方向准确监听

    这篇文章主要为大家详细介绍了Android实现屏幕旋转四个方向准确监听,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Android中HorizontalScrollView使用方法详解

    Android中HorizontalScrollView使用方法详解

    这篇文章主要为大家详细介绍了Android中HorizontalScrollView使用方法,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 解析Android框架之Volley源码

    解析Android框架之Volley源码

    我们知道Volley是在2013年Google I/O大会上推出了一个新的网络通信框架,他的设计目的就是为了那些请求数据量不是特别大,但是又是特别频繁的网络操作非常适合。但是对于数据量较大的请求,比如说下载一个较大的文件,Volley可能相比于其他的框架,就有点不足了。
    2021-06-06
  • 官网项目Jetpack Startup库学习

    官网项目Jetpack Startup库学习

    这篇文章主要为大家介绍了官网项目Jetpack Startup库学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例

    这篇文章主要介绍了Android日历控件PickTime代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • android控制密码显示与隐藏的方法

    android控制密码显示与隐藏的方法

    这篇文章主要为大家详细介绍了android控制密码显示与隐藏的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • android仿直播圆点加载效果

    android仿直播圆点加载效果

    这篇文章主要为大家详细介绍了android仿直播圆点加载效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论