package com.znv.linkup.view; import java.util.Random; import android.animation.Animator; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import com.znv.linkup.R; import com.znv.linkup.core.card.Piece; import com.znv.linkup.util.AnimatorUtil; import com.znv.linkup.view.animation.CardPromptAnim; /** * 游戏卡片类,单独控制便于动画和刷新 * * @author yzb * */ public class GameCard extends FrameLayout { public GameCard(Context context) { super(context); // 卡片界面图片 imageView = new ImageView(getContext()); addView(imageView, -1, -1); // 设置选择边框 checkedRect = genBorder(getResources().getColor(R.color.check_color)); addView(checkedRect, -1, -1); setChecked(false); // 设置提示边框 promptRect = genBorder(getResources().getColor(R.color.prompt_color)); addView(promptRect, -1, -1); promptRect.setVisibility(View.INVISIBLE); } /** * 获取与界面卡片关联的piece * * @return 与界面卡片关联的piece */ public Piece getPiece() { return piece; } /** * 设置与界面卡片关联的piece * * @param piece * piece信息 * @param isAnim * 是否应用动画 */ public void setPiece(Piece piece, Bitmap bm, boolean isAnim) { this.piece = piece; imageView.setImageBitmap(bm); if (piece.isStar()) { // 卡片星星 imageStar = new ImageView(getContext()); imageStar.setImageResource(R.drawable.star_48); addView(imageStar, 48, 48); } if (isAnim) { setXY(piece.getBeginX(), -piece.getHeight()); // 从上面落下 Animator anim = ObjectAnimator.ofFloat(this, "translationY", 0, piece.getBeginY() + piece.getHeight()); anim.setDuration(500); anim.setStartDelay((Piece.YSize - piece.getIndexY()) * 50 - ran.nextInt(50)); anim.start(); } else { // 设置卡片的left和top setXY(piece.getBeginX(), piece.getBeginY()); } lineWidth = piece.getWidth() / 16 + 1; rect = new RectF(piece.getWidth() / 32, piece.getWidth() / 32, piece.getWidth() - lineWidth + 1, piece.getHeight() - lineWidth + 1); } /** * 设置卡片是否选中 * * @param checked * 选中为true */ public void setChecked(boolean checked) { if (checked) { checkedRect.setVisibility(View.VISIBLE); unPrompt(); // 解决放大遮挡问题 this.bringToFront(); this.requestLayout(); AnimatorUtil.animScale(this, 1f, 1.2f, 1f, 1.2f); } else { checkedRect.setVisibility(View.INVISIBLE); AnimatorUtil.animScale(this, this.getScaleX(), 1f, this.getScaleY(), 1f); } } /** * 提示,执行卡片提示动画 */ public void prompt() { promptRect.setVisibility(View.VISIBLE); promptRect.startAnimation(cardNoteAnim); } /** * 取消提示 */ public void unPrompt() { if (promptRect.getVisibility() != View.VISIBLE) { promptRect.setAnimation(null); promptRect.setVisibility(View.INVISIBLE); } } private View genBorder(int color) { final Paint borderPaint = new Paint(); borderPaint.setColor(color); borderPaint.setStyle(Style.STROKE); return new View(getContext()) { protected void onDraw(Canvas canvas) { borderPaint.setStrokeWidth(lineWidth); canvas.drawRoundRect(rect, lineWidth, lineWidth, borderPaint); super.onDraw(canvas); } }; } private void setXY(float x, float y) { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) super.getLayoutParams(); lp.topMargin = (int) y; lp.leftMargin = (int) x; setLayoutParams(lp); } /** * 卡片消除 */ public void disappear() { // imageView.setImageDrawable(ad); // ad.start(); AnimatorUtil.animAlpha(imageView, 1, 0, 600); } private Piece piece = null; private int lineWidth = 1; private ImageView imageView = null; private ImageView imageStar = null; private View checkedRect = null; private View promptRect = null; private RectF rect = null; private Random ran = new Random(System.currentTimeMillis()); private CardPromptAnim cardNoteAnim = new CardPromptAnim(); // private AnimationDrawable ad = (AnimationDrawable) getResources().getDrawable(R.anim.explosion); }