ClazzItem.java 5.68 KB
/*
 * Copyright (c) 2016 wugian
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.xgimi.gimicinema.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
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 wugian on 2016/9/23
 */
public class ClazzItem extends LinearLayout implements View.OnFocusChangeListener {

    private TextView nameTv;
    private LinearLayout clazzLlyt;
    private Drawable selected, normal;

    private AnimatorSet setBig;
    private AnimatorSet setSmall;
    private boolean isBig = false;
    private boolean hasAnimation = false;

    public TextView getNameTv() {
        return nameTv;
    }

    public ClazzItem(Context context) {
        this(context, null);//i_classification
    }


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

    public ClazzItem(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        LayoutInflater.from(context).inflate(R.layout.i_classification, this, true);
        setFocusable(true);
        setFocusableInTouchMode(true);
        setClickable(true);
        setClipToPadding(false);
        setClipChildren(false);
        setWillNotDraw(false);
        nameTv = (TextView) findViewById(R.id.name_tv);
        clazzLlyt = (LinearLayout) findViewById(R.id.clazz_llyt);
        selected = getResources().getDrawable(R.drawable.shadow);
        normal = getResources().getDrawable(R.drawable.trans);
    }

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

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

    public void setHasAnimation(boolean hasAnimation) {
        this.hasAnimation = hasAnimation;
        if (hasAnimation) {
            setBig = new AnimatorSet();
            setBig.playTogether(
                    ObjectAnimator.ofFloat(this, "scaleX", 1f, 1.16f),
                    ObjectAnimator.ofFloat(this, "scaleY", 1f, 1.16f));
            setBig.setDuration(2 * 100);
            setSmall = new AnimatorSet();
            setSmall.playTogether(
                    ObjectAnimator.ofFloat(this, "scaleX", 1.16f, 1f),
                    ObjectAnimator.ofFloat(this, "scaleY", 1.16f, 1f));
            setSmall.setDuration(100);
            setOnFocusChangeListener(this);
        } else {
            setOnFocusChangeListener(null);
        }
    }

    public void startAnimation(boolean big) {
        if (hasAnimation) {
            if (big) {
                if (!isBig) {
                    isBig = true;
                    setSmall.cancel();
                    setBig.start();
                }
            } else {
                if (isBig) {
                    setBig.cancel();
                    setSmall.start();
                    isBig = false;
                }
            }
        }
    }

    private void onDrawShadow(Canvas canvas, boolean hasFocus) {
        Drawable drawableShadow;
        if (hasFocus) {
            drawableShadow = selected;
        } else {
            drawableShadow = normal;
        }
//        ShadowProperty shadowProperty = new ShadowProperty()
//                .setShadowColor(0x77000000)
//                .setShadowDy(3)
//                .setShadowRadius(3);
//
//        if (!hasFocus) {
//            shadowProperty = new ShadowProperty()
//                    .setShadowColor(0x00000000)
//                    .setShadowDy(3)
//                    .setShadowRadius(3);
//        }
//        ShadowViewHelper.bindShadowHelper(shadowProperty, clazzLlyt);

        if (drawableShadow != null) {
            int width = clazzLlyt.getWidth();
            int height = clazzLlyt.getHeight();
            Rect padding = new Rect();
            drawableShadow.getPadding(padding);
            drawableShadow.setBounds(-padding.left, clazzLlyt.getTop() - 5,
                    width + padding.right, height + padding.bottom);
            drawableShadow.draw(canvas);
        }
    }


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

    public boolean dispatchKeyEvent(KeyEvent event) {
       if (event.getAction() == KeyEvent.ACTION_UP) {
            startAnimation(true);
        }
        return super.dispatchKeyEvent(event);
    }

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

}