package com.cui.trypro.adapter; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextSwitcher; import com.cui.trypro.R; import com.cui.trypro.View.circlerefreshlayout.Insta_Utils; import com.cui.trypro.widget.SendingProgressView; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Random; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by froger_mcs on 05.11.14. */ public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> implements View.OnClickListener { private Context mContext; private int itemsCount = 0;//item总数 //随机给加like的 private SparseIntArray likeCount = new SparseIntArray(); //回调 OnFeedItemClickListener onFeedItemClickListener; /** * 补间器 */ private static final DecelerateInterpolator DECCELERATE_INTERPOLATOR = new DecelerateInterpolator(); private static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final OvershootInterpolator OVERSHOOT_INTERPOLATOR = new OvershootInterpolator(4); /** * 保存animatorSet来判断防止收藏被点两次 */ private final Map<RecyclerView.ViewHolder, AnimatorSet> likeAnimations = new HashMap<>(); /** * 记录点击过收藏的position 防止再次收藏 同时onbind..方法会不停执行bindDefaultFeedItem里的updateHeartButton方法 * 会一直判断是否是点击过的position如果点击过的就显示收藏否则反之。以此避免复用问题 */ private final ArrayList<Integer> likedPositions = new ArrayList<>(); boolean isOne = true;//第一次进入才进行动画的判断 public FeedAdapter(Context mContext) { this.mContext = mContext; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feed, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { final ViewHolder holder1 = holder; runEnterAnimation(holder1.itemView, position); bindDefaultFeedItem(holder, position); holder.ivFeedCenter.setOnClickListener(this); holder.btnLike.setOnClickListener(this); holder.btnComments.setOnClickListener(this); holder.btnMore.setOnClickListener(this); } @Override public int getItemCount() { return itemsCount; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ivFeedCenter: ViewHolder holder1 = (ViewHolder) v.getTag(); if (!likedPositions.contains(holder1.getPosition())) {//如果没被点击过 likedPositions.add(holder1.getPosition());//加入被点击的position updateHeartButton((ViewHolder) v.getTag(), false); animatePhotoLike((ViewHolder) v.getTag()); updateLikesCounter(holder1, true); } break; case R.id.btnLike: ViewHolder holder2 = (ViewHolder) v.getTag(); if (!likedPositions.contains(holder2.getPosition())) { likedPositions.add(holder2.getPosition()); updateHeartButton(holder2, true); updateLikesCounter(holder2, true); } break; case R.id.btnComments: if (onFeedItemClickListener != null) { onFeedItemClickListener.onCommentsClick(v, (Integer) v.getTag()); } break; case R.id.btnMore: if (onFeedItemClickListener != null) { onFeedItemClickListener.onMoreClick(v, (Integer) v.getTag()); } break; case R.id.ivUserProfile: if (onFeedItemClickListener != null) { onFeedItemClickListener.onProfileClick(v); } break; } } /** * 点击中间的图片 */ private void animatePhotoLike(final ViewHolder holder) { if (!likeAnimations.containsKey(holder)) {//有put进去就是收藏过的不播放动画 holder.vBgLike.setVisibility(View.VISIBLE); holder.ivLike.setVisibility(View.VISIBLE); holder.vBgLike.setScaleY(0.1f); holder.vBgLike.setScaleX(0.1f); holder.vBgLike.setAlpha(1f); holder.ivLike.setScaleY(0.1f); holder.ivLike.setScaleX(0.1f); AnimatorSet animatorSet = new AnimatorSet(); likeAnimations.put(holder, animatorSet);//把animatorSet 放进去用来做对比 ObjectAnimator bgScaleYAnim = ObjectAnimator.ofFloat(holder.vBgLike, "scaleY", 0.1f, 1f); bgScaleYAnim.setDuration(200); bgScaleYAnim.setInterpolator(DECCELERATE_INTERPOLATOR); ObjectAnimator bgScaleXAnim = ObjectAnimator.ofFloat(holder.vBgLike, "scaleX", 0.1f, 1f); bgScaleXAnim.setDuration(200); bgScaleXAnim.setInterpolator(DECCELERATE_INTERPOLATOR); ObjectAnimator bgAlphaAnim = ObjectAnimator.ofFloat(holder.vBgLike, "alpha", 1f, 0f); bgAlphaAnim.setDuration(200); bgAlphaAnim.setStartDelay(150); bgAlphaAnim.setInterpolator(DECCELERATE_INTERPOLATOR); ObjectAnimator imgScaleUpYAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleY", 0.1f, 1f); imgScaleUpYAnim.setDuration(300); imgScaleUpYAnim.setInterpolator(DECCELERATE_INTERPOLATOR); ObjectAnimator imgScaleUpXAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleX", 0.1f, 1f); imgScaleUpXAnim.setDuration(300); imgScaleUpXAnim.setInterpolator(DECCELERATE_INTERPOLATOR); ObjectAnimator imgScaleDownYAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleY", 1f, 0f); imgScaleDownYAnim.setDuration(300); imgScaleDownYAnim.setInterpolator(ACCELERATE_INTERPOLATOR); ObjectAnimator imgScaleDownXAnim = ObjectAnimator.ofFloat(holder.ivLike, "scaleX", 1f, 0f); imgScaleDownXAnim.setDuration(300); imgScaleDownXAnim.setInterpolator(ACCELERATE_INTERPOLATOR); animatorSet.playTogether(bgScaleYAnim, bgScaleXAnim, bgAlphaAnim, imgScaleUpYAnim, imgScaleUpXAnim); animatorSet.play(imgScaleDownYAnim).with(imgScaleDownXAnim).after(imgScaleUpYAnim); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { // resetLikeAnimationState(holder); } }); animatorSet.start(); } } private void resetLikeAnimationState(ViewHolder holder) { likeAnimations.remove(holder);//删除animatort再点就能再出来 holder.vBgLike.setVisibility(View.GONE); holder.ivLike.setVisibility(View.GONE); } /** * 初始化数据 */ public void updateItem() { itemsCount = 20; //随机给不同的like数量 for (int i = 0; i < itemsCount; i++) { likeCount.put(i, new Random().nextInt(100)); } notifyDataSetChanged(); } /** * 改变like总数 textSwitcher */ private void updateLikesCounter(ViewHolder holder, boolean animated) { int likesCounts = likeCount.get(holder.getPosition()) + 1;//根据position拿初始化放进去的数字再加1 String likeCountText = likesCounts + " likes"; if (animated) { holder.tsLikesCounter.setText(likeCountText); } else { holder.tsLikesCounter.setCurrentText(likeCountText); } likeCount.put(holder.getPosition(), likesCounts);//保存下来用以统计, } /** * 初始让第一个(可见)item有动画 */ private void runEnterAnimation(View view, int position) { if (isOne && position == 0) { view.setTranslationY(Insta_Utils.getScreenHeight(mContext)); view.animate() .translationY(0) .setInterpolator(new DecelerateInterpolator(3.f)) .setDuration(700) .start(); isOne = false; } } /** * 初始化内容 */ private void bindDefaultFeedItem(FeedAdapter.ViewHolder holder, int position) { if (position % 2 == 0) { holder.ivFeedCenter.setImageResource(R.drawable.item_feed_center_1); holder.ivFeedBottom.setImageResource(R.drawable.img_feed_bottom_1); } else { holder.ivFeedCenter.setImageResource(R.drawable.item_feed_center_2); holder.ivFeedBottom.setImageResource(R.drawable.img_feed_bottom_2); } updateLikesCounter(holder, false); updateHeartButton(holder, false); //把Viewholder放入方便后面使用 holder.btnComments.setTag(position); holder.btnMore.setTag(position); holder.ivFeedCenter.setTag(holder); holder.btnLike.setTag(holder); if (likeAnimations.containsKey(holder)) { likeAnimations.get(holder).cancel(); } resetLikeAnimationState(holder); } /** * 更新收藏爱心 * * @param animatored 是否做动画 */ private void updateHeartButton(final ViewHolder holder, boolean animatored) { if (animatored) { if (!likeAnimations.containsKey(holder)) { AnimatorSet animatorSet = new AnimatorSet(); likeAnimations.put(holder, animatorSet); ObjectAnimator rotationAnim = ObjectAnimator.ofFloat(holder.btnLike, "rotation", 0f, 360f); rotationAnim.setDuration(300); rotationAnim.setInterpolator(ACCELERATE_INTERPOLATOR); ObjectAnimator bounceAnimX = ObjectAnimator.ofFloat(holder.btnLike, "scaleX", 0.2f, 1f); bounceAnimX.setDuration(300); bounceAnimX.setInterpolator(OVERSHOOT_INTERPOLATOR); ObjectAnimator bounceAnimY = ObjectAnimator.ofFloat(holder.btnLike, "scaleY", 0.2f, 1f); bounceAnimY.setDuration(300); bounceAnimY.setInterpolator(OVERSHOOT_INTERPOLATOR); bounceAnimY.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { holder.btnLike.setImageResource(R.drawable.ic_heart_red); } }); animatorSet.play(bounceAnimX).with(bounceAnimY).after(rotationAnim); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { resetLikeAnimationState(holder); } }); animatorSet.start(); } } else { if (likedPositions.contains(holder.getPosition())) {//未点击过收藏点击过取消 holder.btnLike.setImageResource(R.drawable.ic_heart_red); } else { holder.btnLike.setImageResource(R.drawable.ic_heart_outline_grey); } } } public static class ViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.ivFeedCenter) ImageView ivFeedCenter; @InjectView(R.id.ivFeedBottom) ImageView ivFeedBottom; @InjectView(R.id.btnComments) ImageButton btnComments; @InjectView(R.id.btnLike) ImageButton btnLike; @InjectView(R.id.btnMore) ImageButton btnMore; @InjectView(R.id.vBgLike) View vBgLike; @InjectView(R.id.ivLike) ImageView ivLike; @InjectView(R.id.tsLikesCounter) TextSwitcher tsLikesCounter; @InjectView(R.id.ivUserProfile) ImageView ivUserProfile; @InjectView(R.id.vImageRoot) FrameLayout vImageRoot; SendingProgressView vSendingProgress; View vProgressBg; public ViewHolder(View view) { super(view); ButterKnife.inject(this, view); } } /** * 对外提供的方法 */ public void setOnFeedItemClickListener(OnFeedItemClickListener onFeedItemClickListener) { this.onFeedItemClickListener = onFeedItemClickListener; } /** * 让外部需要实现的方法把值传回去 */ public interface OnFeedItemClickListener { public void onCommentsClick(View v, int position); public void onMoreClick(View v, int position); public void onProfileClick(View v); } }