国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android直播app送禮物連擊動畫效果(實例代碼)

2019-10-22 18:32:30
字體:
供稿:網(wǎng)友

最近在做公司的直播項目,需要實現(xiàn)一個觀看端連擊送禮物的控件:

直接上代碼:

/** * @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移除時將它放到池內(nèi)        @Override        public void onViewDetachedFromWindow(View view) {          if (giftViewCollection.size() < 5) {            giftViewCollection.add(view);          }        }      });    } else {      //如果Item池內(nèi)有緩存的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);/*設(shè)置view標識*/      CustomRoundView crvheadimage = (CustomRoundView) giftView.findViewById(R.id.crvheadimage);      final MagicTextView giftNum = (MagicTextView) giftView.findViewById(R.id.giftNum);/*找到數(shù)量控件*/      TextView sender = (TextView) giftView.findViewById(R.id.sender);      sender.setText(tag);      giftNum.setText("x1");/*設(shè)置禮物數(shù)量*/      crvheadimage.setTag(System.currentTimeMillis());/*設(shè)置時間標記*/      giftNum.setTag(1);/*給數(shù)量控件設(shè)置標記*/      this.addView(giftView,0);/*將禮物的View添加到禮物的ViewGroup中*///      llgiftcontent.invalidate();/*刷新該view*/      TranslateAnimation inAnim = (TranslateAnimation) AnimationUtils.loadAnimation(getContext(), R.anim.gift_in);      giftView.startAnimation(inAnim);/*開始執(zhí)行顯示禮物的動畫*/      inAnim.setAnimationListener(new Animation.AnimationListener() {/*顯示動畫的監(jiān)聽*/        @Override        public void onAnimationStart(Animation animation) { }        @Override        public void onAnimationEnd(Animation animation) {          //注釋調(diào),第一次添加沒動畫//          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);/*找到數(shù)量控件*/      int showNum = (Integer) giftNum.getTag() + 1;      giftNum.setText("x"+showNum);      giftNum.setTag(showNum);      crvheadimage.setTag(System.currentTimeMillis());      new NumAnim().start(giftNum);    }  }  /**   * 數(shù)字放大動畫   */  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禮物連擊動畫效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 杭锦后旗| 桐庐县| 洪湖市| 石台县| 德惠市| 清水河县| 南郑县| 清水河县| 丹东市| 阳曲县| 汉寿县| 元江| 卓尼县| 隆德县| 晋宁县| 龙里县| 江陵县| 南投县| 锦屏县| 东乌| 巴林左旗| 西平县| 永宁县| 方正县| 昭平县| 丹江口市| 巩留县| 深州市| 淮安市| 根河市| 阿拉善右旗| 雷山县| 望城县| 明溪县| 大石桥市| 馆陶县| 隆尧县| 阿荣旗| 稷山县| 泰州市| 浦东新区|