/*
* Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com]
*
* 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.github.obsessive.simplifyreader.widgets;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.github.obsessive.simplifyreader.R;
import com.github.obsessive.simplifyreader.utils.ImageLoaderHelper;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;
import com.nineoldandroids.view.ViewHelper;
import com.nostra13.universalimageloader.core.ImageLoader;
public class PlayerDiscView extends RelativeLayout {
private static final int NEEDLE_ANIMATOR_TIME = 350;
private static final float NEEDLE_ROTATE_CIRCLE = -30.0f;
private static final int DISC_ANIMATOR_TIME = 20 * 1000;
private static final int DISC_ANIMATOR_REPEAT_COUNT = -1;
private static final int DISC_REVERSE_ANIMATOR_TIME = 500;
private ImageView mNeedle;
private ImageView mAlbumCover;
private RelativeLayout mDiscLayout;
private ObjectAnimator mNeedleAnimator;
private ObjectAnimator mDiscLayoutAnimator;
private float mDiscLayoutAnimatorValue;
private float mNeedlePivotX = 0.0f;
private float mNeedlePivotY = 0.0f;
private static final float X_FRACTION = 184.0f / 212.0f;
private static final float Y_FRACTION = 25.0f / 259.0f;
private boolean isPlaying = false;
private Context mContext;
public boolean isPlaying() {
return isPlaying;
}
public PlayerDiscView(Context context, AttributeSet attrs) {
super(context);
init(context);
}
public PlayerDiscView(Context context) {
super(context);
init(context);
}
public PlayerDiscView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
mContext = context;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.stick);
mNeedlePivotX = bitmap.getWidth() * X_FRACTION;
mNeedlePivotY = bitmap.getHeight() * Y_FRACTION;
bitmap.recycle();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mNeedle = (ImageView) findViewById(R.id.player_needle);
mAlbumCover = (ImageView) findViewById(R.id.player_disc_image);
mDiscLayout = (RelativeLayout) findViewById(R.id.player_disc_container);
ViewHelper.setPivotX(mNeedle, mNeedlePivotX);
ViewHelper.setPivotY(mNeedle, mNeedlePivotY);
}
public void startPlay() {
if (isPlaying) {
return;
}
startNeedleAnimator();
startDiscAnimator(0.0f);
isPlaying = true;
}
public void rePlay() {
if (isPlaying) {
return;
}
startNeedleAnimator();
startDiscAnimator(mDiscLayoutAnimatorValue);
isPlaying = true;
}
public void pause() {
if (!isPlaying) {
return;
}
startNeedleAnimator();
if (mDiscLayoutAnimator.isRunning() || mDiscLayoutAnimator.isStarted()) {
mDiscLayoutAnimator.cancel();
}
isPlaying = false;
}
public void next() {
if (isPlaying) {
startNeedleAnimator();
}
mDiscLayoutAnimator.cancel();
isPlaying = false;
reverseDiscAnimator();
}
private void startNeedleAnimator() {
if (isPlaying) {
mNeedleAnimator = ObjectAnimator.ofFloat(mNeedle, "rotation", 0, NEEDLE_ROTATE_CIRCLE);
} else {
mNeedleAnimator = ObjectAnimator.ofFloat(mNeedle, "rotation", NEEDLE_ROTATE_CIRCLE, 0);
}
mNeedleAnimator.setDuration(NEEDLE_ANIMATOR_TIME);
mNeedleAnimator.setInterpolator(new DecelerateInterpolator());
if (mNeedleAnimator.isRunning() || mNeedleAnimator.isStarted()) {
mNeedleAnimator.cancel();
}
mNeedleAnimator.start();
}
private void startDiscAnimator(float animatedValue) {
mDiscLayoutAnimator = ObjectAnimator.ofFloat(mDiscLayout, "rotation", animatedValue, 360 + animatedValue);
mDiscLayoutAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
mDiscLayoutAnimatorValue = (Float) arg0.getAnimatedValue();
}
});
mDiscLayoutAnimator.setDuration(DISC_ANIMATOR_TIME);
mDiscLayoutAnimator.setRepeatCount(DISC_ANIMATOR_REPEAT_COUNT);
mDiscLayoutAnimator.setInterpolator(new LinearInterpolator());
if (mDiscLayoutAnimator.isRunning() || mDiscLayoutAnimator.isStarted()) {
mDiscLayoutAnimator.cancel();
}
mDiscLayoutAnimator.start();
}
private void reverseDiscAnimator() {
mDiscLayoutAnimator = ObjectAnimator.ofFloat(mDiscLayout, "rotation", mDiscLayoutAnimatorValue, 360);
mDiscLayoutAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
mDiscLayoutAnimatorValue = (Float) arg0.getAnimatedValue();
}
});
mDiscLayoutAnimator.setDuration(DISC_REVERSE_ANIMATOR_TIME);
mDiscLayoutAnimator.setInterpolator(new AccelerateInterpolator());
if (mDiscLayoutAnimator.isRunning() || mDiscLayoutAnimator.isStarted()) {
mDiscLayoutAnimator.cancel();
}
mDiscLayoutAnimator.start();
}
public void loadAlbumCover(String imageUrl) {
ImageLoader.getInstance().displayImage(imageUrl, mAlbumCover,
ImageLoaderHelper.getInstance
(mContext).getDisplayOptions(100));
}
}