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

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

直接上代码:

/**

* @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直播app送礼物连击动画效果(实例代码) 的全部内容, 来源链接: utcz.com/z/319653.html

回到顶部