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;

}

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐