package com.qmusic.controls;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.Transformation;
import android.widget.LinearLayout;
import android.widget.Scroller;
public class BScrollView extends LinearLayout implements OnClickListener {
static final String TAG = BScrollView.class.getSimpleName();
Scroller mScroller;
boolean state;
public BScrollView(Context context) {
super(context);
init();
}
public BScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mScroller = new Scroller(getContext(), new CycleInterpolator(3));
setOnClickListener(this);
setGravity(Gravity.CENTER);
}
@Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {
Log.e(TAG, "computeScroll1+" + mScroller.getCurrX());
scrollTo(mScroller.getCurrX(), 0);
postInvalidate();
} else {
Log.e(TAG, "computeScroll2");
// scrollTo(0, 0);
// state = true;
}
}
@Override
public void onClick(View v) {
Log.e(TAG, "onClick");
// mScroller.startScroll(0, 0, 150, 100, 1250);
// scrollTo(150, 0);
startAnimation(new MyAnicamtion());
}
public void startScroll() {
Log.e(TAG, "startScroll");
mScroller.startScroll(0, 0, 550, 100, 1250);
state = true;
invalidate();
}
public void reset() {
Log.e(TAG, "reset");
scrollTo(0, 0);
state = false;
}
public boolean isOpen() {
return state;
}
static class MyInterpolator implements Interpolator {
private float mTension;
public MyInterpolator(float tension) {
mTension = tension;
}
public MyInterpolator(Context context, AttributeSet attrs) {
}
@Override
public float getInterpolation(float input) {
return input * mTension;
}
}
static class MyAnicamtion extends Animation {
Camera camera;
int mCenterX, mCenterY;
public MyAnicamtion() {
setInterpolator(new MyInterpolator(1));
setDuration(1000);
camera = new Camera();
}
@Override
public boolean getTransformation(long currentTime, Transformation outTransformation) {
return super.getTransformation(currentTime, outTransformation);
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCenterX = width / 2;
mCenterY = height / 2;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Log.d(TAG, "interpolatedTime:" + interpolatedTime);
final Matrix matrix = t.getMatrix();
camera.save();
camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime));
camera.rotateY(360 * interpolatedTime);
camera.getMatrix(matrix);
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX, mCenterY);
camera.restore();
}
}
}