package com.duguang.baseanimation.ui.customview.yzhou; import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.view.View; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.Transformation; import android.widget.RelativeLayout; public class TwoSidedView extends RelativeLayout{ private View frontView; private View backView; private int duration; ViewAnimation animFront; ViewAnimation animBack; public TwoSidedView(Context context,View frontView,View backView,int duration) { super(context); this.frontView=frontView; this.backView=backView; animFront=new ViewAnimation(); animFront.flag=ViewAnimation.FRONT_ANIM; animFront.setFillAfter(true); animBack=new ViewAnimation(); animBack.flag=ViewAnimation.BACK_ANIM; animBack.setFillAfter(true); this.duration=duration; this.addView(frontView); this.addView(backView); frontView.setOnClickListener(mOnclickListener); backView.setOnClickListener(mOnclickListener); this.removeAllViews(); this.addView(backView); this.addView(frontView); } View.OnClickListener mOnclickListener=new View.OnClickListener() { @Override public void onClick(View v) { if(v.equals(frontView)) { frontView.startAnimation(animFront); backView.startAnimation(animBack); } // else // { // frontView.startAnimation(animBack); // backView.startAnimation(animFront); // } // } }; class ViewAnimation extends Animation { private static final int FRONT_ANIM=0; private static final int BACK_ANIM=1; int mCenterX;//��¼View���м���� int mCenterY; Camera camera = new Camera(); int flag; public ViewAnimation() { } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //��ʼ���м����ֵ mCenterX = width/2; mCenterY = height/2; setDuration(duration); setFillAfter(true); setInterpolator(new LinearInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final Matrix matrix = t.getMatrix(); camera.save(); if(flag==FRONT_ANIM ) { if(interpolatedTime<=(0.5)) { camera.rotateY( interpolatedTime*2*90); System.out.println("time:"+interpolatedTime*2*90); } else { camera.rotateY(90); } } else if(flag==BACK_ANIM ) { if(interpolatedTime>=0.5) { camera.rotateY((float)(270+ (interpolatedTime-0.5)*90*2)); } else { camera.rotateY(270); } } camera.getMatrix(matrix); camera.restore(); matrix.preTranslate(-mCenterX, -mCenterY); matrix.postTranslate(mCenterX, mCenterY); } } }