MovieView.java 6.33 KB
package com.xgimi.gimicinema.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.animation.ObjectAnimator;
import com.xgimi.gimicinema.R;


/**
 * Created by Administrator on 2016/5/6.
 */
public class MovieView extends LinearLayout implements View.OnFocusChangeListener {

    private ImageView imageView;
    private TextView title;
    private TextView type;
    private TextView score;
    private LinearLayout otherLyt;

    private AnimatorSet setBig;
    private AnimatorSet setSmall;
    private Drawable selected, normal;
    private boolean isBig = false;
    private boolean hasAnimation = false;
    private boolean hasFocus = false;

    public MovieView(Context context) {
        this(context, null);
    }

    public MovieView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MovieView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        LayoutInflater.from(context).inflate(R.layout.movieresult, this, true);
        setFocusable(false);
        setFocusableInTouchMode(false);
        setClipToPadding(false);
        setClipChildren(false);
        setWillNotDraw(false);
        setHasAnimation(true);
        title = (TextView) findViewById(R.id.movie_result_name);
        type = (TextView) findViewById(R.id.movie_result_type);
        score = (TextView) findViewById(R.id.movie_result_score);
        imageView = (ImageView) findViewById(R.id.movie_result_poster);
        otherLyt = (LinearLayout) findViewById(R.id.other_lyt);
        selected = getResources().getDrawable(R.drawable.shadow_movie_s);
        normal = getResources().getDrawable(R.drawable.shadow_movie_normal);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//        onDrawShadow(canvas, hasFocus());
        onDrawShadow(canvas, hasFocus);
    }

    public void setHasFocus(boolean hasFocus) {
        this.hasFocus = hasFocus;
        invalidate();
    }

    @Override
    public void setOnClickListener(OnClickListener l) {
        super.setOnClickListener(l);
    }

    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            Log.e("JSocrll", "ACTION_UP");
            startAnimation(this, true);
        }
        return super.dispatchKeyEvent(event);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (getParent() instanceof ViewGroup) {
            ((ViewGroup) getParent()).setClipChildren(false);
            ((ViewGroup) getParent()).setClipToPadding(false);
        }
    }

    public ImageView getImageView() {
        return imageView;
    }

    public TextView getTitle() {
        return title;
    }

    public TextView getType() {
        return type;
    }

    public TextView getScore() {
        return score;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
//        if (!hasFocus) {
        startAnimation(MovieView.this, hasFocus);
//        ((ViewGroup)v.getParent()).invalidate();
//        }
    }

    @Override
    public void startAnimation(Animation animation) {
        if (animation != null)
            super.startAnimation(animation);
        else
            startAnimation(this, true);
    }

    public void setHasAnimation(boolean hasAnimation) {
        this.hasAnimation = hasAnimation;
        if (hasAnimation) {
            setBig = new AnimatorSet();
            float scale = 1.16f;
//            scale = 1.5f;
            setBig.playTogether(
                    ObjectAnimator.ofFloat(this, "scaleX", 1f, scale),
                    ObjectAnimator.ofFloat(this, "scaleY", 1f, scale));
//            setBig.setInterpolator(new AccelerateInterpolator(3f));
            setBig.setDuration(1 * 100);
            setSmall = new AnimatorSet();
            setSmall.playTogether(
                    ObjectAnimator.ofFloat(this, "scaleX", scale, 1f),
                    ObjectAnimator.ofFloat(this, "scaleY", scale, 1f));
//            setSmall.setInterpolator(new DecelerateInterpolator(1f));
            setSmall.setDuration(1 * 400);
            setOnFocusChangeListener(this);
        } else {
            setOnFocusChangeListener(null);
        }
    }

    public void startAnimation(final View view, boolean big) {
        if (hasAnimation) {
            if (big) {
                if (!isBig) {
                    type.setVisibility(VISIBLE);
                    score.setVisibility(VISIBLE);
//                    otherLyt.setBackgroundColor(Color.RED);
                    isBig = true;
                    setSmall.cancel();
                    setBig.start();
                }
            } else {
                if (isBig) {
                    type.setVisibility(GONE);
                    score.setVisibility(GONE);
                    otherLyt.setBackgroundColor(Color.TRANSPARENT);
                    setBig.cancel();
                    isBig = false;
                    setSmall.start();
                }
            }
        }
    }

    private void onDrawShadow(Canvas canvas, boolean hasFocus) {
        Drawable drawableShadow = null;
        if (hasFocus) {
            drawableShadow = selected;
        } else {
            drawableShadow = normal;
        }
//        drawableShadow = selected;
        if (drawableShadow != null) {
            Rect shadowPaddingRect = new Rect(-4, 0, -4, -2);
            int width = imageView.getWidth();
            int height = imageView.getHeight();
            Rect padding = new Rect();
            drawableShadow.getPadding(padding);
            drawableShadow.setBounds(-padding.left - (shadowPaddingRect.left), imageView.getTop(),
                    width + padding.right + (shadowPaddingRect.right),
                    height + padding.bottom + (shadowPaddingRect.bottom));
            drawableShadow.draw(canvas);
        }
    }
}