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

public class CustomGiftView extends LinearLayout {    private Timer timer;    private List 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) {        super(context, attrs, defStyleAttr);    }    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)    public CustomGiftView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    /**     *
Description: todo(这里用一句话描述这个方法的作用) *
Author: yangyinglong *
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_layout_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.remove(0); } return view; } /** *
Description: todo(这里用一句话描述这个方法的作用) *
Author: yangyinglong *
Date: 2017/7/11 16:54 * @param tag */
public void showGift(GiftInfo giftInfo) { View giftView = this.findViewWithTag(giftInfo.getGiftID() + giftInfo.getSenderFace()); if (giftView == null) {/*该用户不在礼物显示列表*/ giftView = addGiftView();/*获取礼物的View的布局*/ giftView.setTag(giftInfo.getGiftID() + giftInfo.getSenderFace());/*设置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(giftInfo.getSenderNickName()); 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()); NumAnim numAnim = new NumAnim(); giftNum.setTag(R.id.tag_imageview,numAnim); numAnim.start(giftNum); } } /** * 数字放大动画 */ public static class NumAnim { private Animator lastAnimator = null; private NumAnim lastNumAnim; public void start(View view) { lastNumAnim = (NumAnim) view.getTag(NumAnim.class.hashCode()); if (lastNumAnim != null) { if (lastNumAnim.lastAnimator != null) { lastNumAnim.lastAnimator.removeAllListeners(); lastNumAnim.lastAnimator.end(); lastNumAnim.lastAnimator.cancel(); } } ObjectAnimator anim1_1 = ObjectAnimator.ofFloat(view, "scaleX",3.0f,0.5f); ObjectAnimator anim1_2 = ObjectAnimator.ofFloat(view, "scaleY",3.0f,0.5f); ObjectAnimator anim1_3 = ObjectAnimator.ofFloat(view,"alpha",0.8f); AnimatorSet animatorSet1 = new AnimatorSet(); animatorSet1.setDuration((long) (700 * 0.1)); animatorSet1.setInterpolator(new LinearInterpolator()); animatorSet1.playTogether(anim1_1,anim1_2,anim1_3); ObjectAnimator anim2_1 = ObjectAnimator.ofFloat(view, "scaleX",1.2f); ObjectAnimator anim2_2 = ObjectAnimator.ofFloat(view, "scaleY",1.2f); ObjectAnimator anim2_3 = ObjectAnimator.ofFloat(view, "alpha",1.0f); AnimatorSet animatorSet2 = new AnimatorSet(); animatorSet2.setDuration((long) (700 * 0.2)); animatorSet2.setInterpolator(new LinearInterpolator()); animatorSet2.playTogether(anim2_1,anim2_2,anim2_3); ObjectAnimator anim3_1 = ObjectAnimator.ofFloat(view, "scaleX",1.0f); ObjectAnimator anim3_2 = ObjectAnimator.ofFloat(view, "scaleY",1.0f); AnimatorSet animatorSet3 = new AnimatorSet(); animatorSet3.setDuration((long) (700 * 0.2)); animatorSet3.setInterpolator(new LinearInterpolator()); animatorSet3.playTogether(anim3_1,anim3_2); AnimatorSet animSet = new AnimatorSet();// lastAnimator = animSet;// animSet.setDuration(500);// animSet.setInterpolator(new OvershootInterpolator()); animSet.playSequentially(animatorSet1, animatorSet2,animatorSet3); animSet.playSequentially(); 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; } }}

更多相关文章

  1. Android(安卓)Switch控件介绍
  2. android中使用开源项目做出上拉、下拉刷新功能
  3. Android(安卓)网络通信框架Volley简介(Google IO 2013)
  4. 安卓EditText控件底部红线如何解决?
  5. Android(安卓)ImageView控件的MaxWidth、MaxHeight不起作用
  6. ImageButton与Button
  7. Android(安卓)EditText文本输入框禁止输入空格
  8. Android:UI控件风格与主题、selector、Theme
  9. android 获取坐标[整理]

随机推荐

  1. Android属性动画(详解)
  2. Android远程图片获取和本地缓存
  3. 详解C#开发Android应用程序的流程
  4. Android面试题(华为):Android 的优势与不足
  5. Android的消息处理机制——Looper,Handle
  6. Android studio 使用心得(八)----测试程
  7. View篇之View的滑动
  8. 多态在android中(利用接口调用服务中方法)
  9. Android为什么使用Binder-android学习之
  10. android provider 基础介绍