package com.example.tabanim;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
private ImageView image;
private TextView btn1, btn2, btn3, btn4;
private Button cancel;
private TabIndicatorAnim mTabIndicatorAnim;
private int mWidth = (int) (1080/3.0);
private int mLastPos = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView)findViewById(R.id.imageView);
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) image
.getLayoutParams();
lp.width = mWidth;
image.setLayoutParams(lp);
image.setScaleType(ScaleType.FIT_XY);
btn1 = (TextView)findViewById(R.id.textView1);
btn2 = (TextView)findViewById(R.id.textView2);
btn3 = (TextView)findViewById(R.id.textView3);
// btn4 = (Button)findViewById(R.id.button4);
cancel = (Button)findViewById(R.id.Cancel);
mTabIndicatorAnim = new TabIndicatorAnim(image, mWidth);
image.setTranslationX(mLastPos*mWidth);
btn1.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
mTabIndicatorAnim.startAnim(mLastPos, 0);
mLastPos = 0;
}
});
btn2.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
mTabIndicatorAnim.startAnim(mLastPos, 1);
mLastPos = 1;
}
});
btn3.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
mTabIndicatorAnim.startAnim(mLastPos, 2);
mLastPos = 2;
}
});
cancel.setOnClickListener(new Button.OnClickListener(){//创建监听
public void onClick(View v) {
mTabIndicatorAnim.cancelAnim();
float f1 = 360.0f;
int f2 = mWidth;
int retval = Float.compare(f1, f2);
if(retval > 0) {
Log.e("suosuo", "f1 is greater than f2");
}
else if(retval < 0) {
Log.e("suosuo", "f1 is less than f2");
}
else {
Log.e("suosuo", "f1 is equal to f2");
}
}
});
// btn4.setOnClickListener(new Button.OnClickListener(){//创建监听
// public void onClick(View v) {
// mTabIndicatorAnim.startAnim(mLastPos, 3);
// mLastPos = 3;
// }
// });
}
class TabIndicatorAnim {
private int mWidth;
private View mView;
private int mCancelLastStartPos = -1;
private ValueAnimator mAnimator;
private float mScaleUpProp = 130;
private float mTotalProp = 480;
private int mDuration = 5000;//480;
private float mScaleDownValue = 1.0f;
private float mScaleUpValue = 2.0f;
TabIndicatorAnim(View view, int width) {
mView = view;
mWidth = width;
}
public void startAnim(int from, int to){
//cancelAnim();
if (from == to) {
return;
} else if (from < to) { // from left to right
cancelAnim();
anim(from, to, 1, to-from);
} else { // from right to left
cancelAnim();
anim(from, to, 0, from-to);
}
}
private void cancelAnim(){
if (mAnimator != null) mAnimator.cancel();
}
private void anim(final int from, final int to, final int l2r, final int count) {
mAnimator = ValueAnimator.ofFloat(0, mScaleUpProp, mTotalProp);
mAnimator.setTarget(mView);
mAnimator.setDuration(mDuration).start();
// mAnimator.setInterpolator(new LinearInterpolator());
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
boolean isAfterScaleUp = false;
boolean isAfterLeaveGap = false;
int afterScaleUpX = 0;
float orginalScaleX = mView.getScaleX();
float orginalTranslationX = mView.getTranslationX();
int transXCmpRet = Float.compare(orginalTranslationX, from*mWidth);
int scaleXCmpRet = Float.compare(2.0f, orginalScaleX);
int test = 1;
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
Log.e("suosuoa", "from " + from + " to " + to + " value " + value + " orginalScaleX " + orginalScaleX + " orginalTranslationX " + orginalTranslationX);
if (test == 1) {
} else if (test == 2) {
if (l2r == 1) {
if (transXCmpRet > 0) { // 1->0 cancel, 0->1 anim start
if (orginalScaleX > mScaleDownValue) {
Log.e("suosuoa", "ccccccc orginalScaleX" + orginalScaleX);
mView.setPivotX((l2r == 1)?(mWidth):(0));
mView.setScaleX((float) (orginalScaleX-(orginalScaleX-mScaleDownValue)*(value)/mTotalProp)); //scale 2 to 1
}
} else if (transXCmpRet < 0) { //0->1 cancel, 1->2 startAnim
Log.e("suosuoa", "0->1 cancel, 1->2 startAnim");
if (scaleXCmpRet == 0) { // scale up done and scale down
if (!isAfterScaleUp) {
mView.setPivotX((l2r == 1)?(mWidth):(0));
if (mCancelLastStartPos != -1) {
Log.e("mCancelLastStartPos", "mCancelLastStartPos " + mCancelLastStartPos);
afterScaleUpX = (l2r == 1)?((mCancelLastStartPos+1)*mWidth):((mCancelLastStartPos-1)*mWidth);
mView.setTranslationX(afterScaleUpX);
}
isAfterScaleUp = true;
} else {
mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value);
if (to-mCancelLastStartPos > 1) {
mView.setTranslationX((l2r == 1)?
(afterScaleUpX+(to-mCancelLastStartPos-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
(afterScaleUpX-(to-mCancelLastStartPos-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
//Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
}
}
} else if (scaleXCmpRet > 0) { // start scale up and scale up doing
mView.setPivotX((l2r == 1)?(0):(mWidth));
Log.e("suosuo", "aaaa value " + value);
float updateScaleX = orginalScaleX + (value/mScaleUpProp)*(mScaleUpValue-orginalScaleX);
if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue;
mView.setScaleX(updateScaleX);
scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX);
}
} else {// from begin point
if (scaleXCmpRet == 0) { // scale up done and scale down
if (!isAfterScaleUp) {
mView.setPivotX((l2r == 1)?(mWidth):(0));
if (count == 1) {
mView.setTranslationX(to*mWidth);
Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());
} else {
afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);
mView.setTranslationX(afterScaleUpX);
}
isAfterScaleUp = true;
} else {
mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value);
if (count > 1) {
mView.setTranslationX((l2r == 1)?
(afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
(afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
//Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
}
}
} else if (scaleXCmpRet > 0) { // start scale up and scale up doing
mView.setPivotX((l2r == 1)?(0):(mWidth));
Log.e("suosuo", "aaaa value " + value);
float updateScaleX = orginalScaleX + (mScaleUpValue-orginalScaleX)*(value)/mTotalProp;
if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue;
mView.setScaleX(updateScaleX);
scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX);
}
}
} else { // right to left
if (transXCmpRet > 0) { //2->1 cancel, 1->0 startAnim
Log.e("suosuoa", "2->1 cancel, 1->0 startAnim");
if (scaleXCmpRet == 0) { // scale up done and scale down
if (!isAfterScaleUp) {
mView.setPivotX((l2r == 1)?(mWidth):(0));
if (mCancelLastStartPos != -1) {
Log.e("mCancelLastStartPos", "mCancelLastStartPos " + mCancelLastStartPos);
afterScaleUpX = (l2r == 1)?((mCancelLastStartPos+1)*mWidth):((mCancelLastStartPos-1)*mWidth);
mView.setTranslationX(afterScaleUpX);
}
isAfterScaleUp = true;
} else {
mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value);
int count = (l2r == 1)?(to-mCancelLastStartPos):(mCancelLastStartPos - to);
if (count > 1) {
mView.setTranslationX((l2r == 1)?
(afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
(afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
//Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
}
}
} else if (scaleXCmpRet > 0) { // start scale up and scale up doing
mView.setPivotX((l2r == 1)?(0):(mWidth));
Log.e("suosuo", "aaaa value " + value);
float updateScaleX = orginalScaleX + (value/mScaleUpProp)*(mScaleUpValue-orginalScaleX);
if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue;
mView.setScaleX(updateScaleX);
scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX);
}
} else if (transXCmpRet < 0) {
if (to == mCancelLastStartPos) { // 0->1 cancel, 1->0 anim start
if (orginalScaleX > mScaleDownValue) {
Log.e("suosuoa", "ccccccc orginalScaleX" + orginalScaleX);
mView.setPivotX((l2r == 1)?(mWidth):(0));
mView.setScaleX((float) (orginalScaleX-(orginalScaleX-mScaleDownValue)*(value)/mTotalProp)); //scale 2 to 1
}
} else if (to > mCancelLastStartPos) { // 0->2 cancel, 2->1 anim start
}
} else {// from begin point
if (scaleXCmpRet == 0) { // scale up done and scale down
if (!isAfterScaleUp) {
mView.setPivotX((l2r == 1)?(mWidth):(0));
if (count == 1) {
mView.setTranslationX(to*mWidth);
Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());
} else {
afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);
mView.setTranslationX(afterScaleUpX);
}
isAfterScaleUp = true;
} else {
mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value);
if (count > 1) {
mView.setTranslationX((l2r == 1)?
(afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
(afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
//Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
}
}
} else if (scaleXCmpRet > 0) { // start scale up and scale up doing
mView.setPivotX((l2r == 1)?(0):(mWidth));
Log.e("suosuo", "aaaa value " + value);
float updateScaleX = orginalScaleX + (mScaleUpValue-orginalScaleX)*(value)/mTotalProp;
if (updateScaleX > 2.0f) updateScaleX = 2.0f;
mView.setScaleX(updateScaleX);
scaleXCmpRet = Float.compare(2.0f, updateScaleX);
}
}
}
} else {
if (value < mScaleUpProp){
mView.setPivotX((l2r == 1)?(0):(mWidth));
mView.setScaleX((float) (1+value/mScaleUpProp)); // scale 1 to 2
//Log.e("suosuo", "getTranslationX1 " + mView.getTranslationX());
} else if (value < mTotalProp) {//-50){
if (!isAfterScaleUp) {
mView.setPivotX((l2r == 1)?(mWidth):(0));
if (count == 1) {
mView.setTranslationX(to*mWidth);
//Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());
} else {
afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);
mView.setTranslationX(afterScaleUpX);
}
isAfterScaleUp = true;
} else {
mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
if (count > 1) {
mView.setTranslationX((l2r == 1)?
(afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
(afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
//Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
}
}
}
// else if (value < mTotalProp-20){
// if (!isAfterLeaveGap) {
// mView.setPivotX((l2r == 1)?(mWidth):(0));
// if (count == 1) {
// mView.setTranslationX(to*mWidth+40);
// Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());
// } else {
// afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);
// mView.setTranslationX(afterScaleUpX);
// }
// isAfterLeaveGap = true;
// } else {
// mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
// if (count > 1) {
// mView.setTranslationX((l2r == 1)?
// (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
// (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
// Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
// }
// }
// } else {
// if (!isAfterScaleUp) {
// mView.setPivotX((l2r == 1)?(mWidth):(0));
// if (count == 1) {
// mView.setTranslationX(to*mWidth);
// Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());
// } else {
// afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);
// mView.setTranslationX(afterScaleUpX);
// }
// isAfterScaleUp = true;
// } else {
// mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1
// if (count > 1) {
// mView.setTranslationX((l2r == 1)?
// (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):
// (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));
// Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());
// }
// }
// }
}
}
});
mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationCancel(Animator arg0) {
// TODO Auto-generated method stub
Log.e("suosuo", "onAnimationCancel");
mCancelLastStartPos = from;
}
@Override
public void onAnimationEnd(Animator arg0) {
// TODO Auto-generated method stub
// mView.setScaleX(1);
// mView.setTranslationX(to*mWidth);
}
@Override
public void onAnimationRepeat(Animator arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animator arg0) {
// TODO Auto-generated method stub
}
});
}
}
}