/* * This is the source code of DMPLayer for Android v. 1.0.0. * You should have received a copy of the license in this archive (see LICENSE). * Copyright @Dibakar_Mistry, 2015. */ package com.dmplayer.uicomponent; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Outline; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.util.Property; import android.util.TypedValue; import android.view.View; import android.view.ViewOutlineProvider; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import com.dmplayer.R; public class PlayPauseView extends FrameLayout { private static final Property<PlayPauseView, Integer> COLOR = new Property<PlayPauseView, Integer>(Integer.class, "color") { @Override public Integer get(PlayPauseView v) { return v.getColor(); } @Override public void set(PlayPauseView v, Integer value) { v.setColor(value); } }; private static final long PLAY_PAUSE_ANIMATION_DURATION = 200; private final PlayPauseDrawable mDrawable; private final Paint mPaint = new Paint(); private final int mPauseBackgroundColor; private final int mPlayBackgroundColor; public boolean isDrawCircle = true; private AnimatorSet mAnimatorSet; private int mBackgroundColor; private int mWidth; private int mHeight; public PlayPauseView(Context context, AttributeSet attrs) { super(context, attrs); setWillNotDraw(false); TypedValue colorTheme = new TypedValue(); context.getTheme().resolveAttribute(R.attr.colorAccent, colorTheme, true); mBackgroundColor = colorTheme.data; mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); mDrawable = new PlayPauseDrawable(context); mDrawable.setCallback(this); mPauseBackgroundColor = colorTheme.data; mPlayBackgroundColor = colorTheme.data; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PlayPause); isDrawCircle = a.getBoolean(R.styleable.PlayPause_isCircleDraw, isDrawCircle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // final int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); // setMeasuredDimension(size, size); } @Override protected void onSizeChanged(final int w, final int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mDrawable.setBounds(0, 0, w, h); mWidth = w; mHeight = h; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setOutlineProvider(new ViewOutlineProvider() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void getOutline(View view, Outline outline) { outline.setOval(0, 0, view.getWidth(), view.getHeight()); } }); setClipToOutline(true); } } private void setColor(int color) { mBackgroundColor = color; invalidate(); } private int getColor() { return mBackgroundColor; } @Override protected boolean verifyDrawable(Drawable who) { return who == mDrawable || super.verifyDrawable(who); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(mBackgroundColor); final float radius = Math.min(mWidth, mHeight) / 2f; if (isDrawCircle) { canvas.drawCircle(mWidth / 2f, mHeight / 2f, radius, mPaint); } mDrawable.draw(canvas); } private boolean mIsPlay; public boolean isPlay() { return mIsPlay; } // public void toggle() { // if (mAnimatorSet != null) { // mAnimatorSet.cancel(); // } // // mAnimatorSet = new AnimatorSet(); // final boolean isPlay = mDrawable.isPlay(); // final ObjectAnimator colorAnim = ObjectAnimator.ofInt(this, COLOR, isPlay // ? mPauseBackgroundColor : mPlayBackgroundColor); // colorAnim.setEvaluator(new ArgbEvaluator()); // final Animator pausePlayAnim = mDrawable.getPausePlayAnimator(); // mAnimatorSet.setInterpolator(new DecelerateInterpolator()); // mAnimatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION); // mAnimatorSet.playTogether(colorAnim, pausePlayAnim); // mAnimatorSet.start(); // } public void Play() { if (mAnimatorSet != null) { mAnimatorSet.cancel(); } mAnimatorSet = new AnimatorSet(); final ObjectAnimator colorAnim = ObjectAnimator.ofInt(this, COLOR, mPlayBackgroundColor); mIsPlay = true; colorAnim.setEvaluator(new ArgbEvaluator()); mDrawable.setmIsPlay(mIsPlay); final Animator pausePlayAnim = mDrawable.getPausePlayAnimator(); mAnimatorSet.setInterpolator(new DecelerateInterpolator()); mAnimatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION); mAnimatorSet.playTogether(colorAnim, pausePlayAnim); mAnimatorSet.start(); } public void Pause() { if (mAnimatorSet != null) { mAnimatorSet.cancel(); } mAnimatorSet = new AnimatorSet(); final ObjectAnimator colorAnim = ObjectAnimator.ofInt(this, COLOR, mPauseBackgroundColor); mIsPlay = false; colorAnim.setEvaluator(new ArgbEvaluator()); mDrawable.setmIsPlay(mIsPlay); final Animator pausePlayAnim = mDrawable.getPausePlayAnimator(); mAnimatorSet.setInterpolator(new DecelerateInterpolator()); mAnimatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION); mAnimatorSet.playTogether(colorAnim, pausePlayAnim); mAnimatorSet.start(); } }