android 控件翻转切换布局(转)
?
过程是:?
1:准备好布局如下:?
2:翻转view动画,翻转动画的监听。?
3:翻转后布局的替换,这里用了隐藏?
我用了setVisibility(View.INVISIBLE)?
layout/mygaller_item_bg_01是正面?
layout/mygaller_item_bg_02是反面?
布局1:mygaller_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="wrap_content" android:padding="25dip" android:id="@+id/container"> <FrameLayout android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="wrap_content" android:id="@+id/container_bg"> <include layout="@layout/mygaller_item_bg_01" /> <include layout="@layout/mygaller_item_bg_02" /> </FrameLayout> </LinearLayout>
?
?
View翻转效果:来源:http://mobile.51cto.com/android-265495.htm ?
import android.graphics.Camera; import android.graphics.Matrix; import android.view.animation.Animation; import android.view.animation.Transformation; public class Rotate3d extends Animation { private final float mFromDegrees; private final float mToDegrees; private final float mCenterX; private final float mCenterY; private final float mDepthZ; private final boolean mReverse; private Camera mCamera; public Rotate3d(float fromDegrees, float toDegrees, float centerX, float centerY, float depthZ, boolean reverse) { mFromDegrees = fromDegrees; mToDegrees = toDegrees; mCenterX = centerX; mCenterY = centerY; mDepthZ = depthZ; mReverse = reverse; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final float fromDegrees = mFromDegrees; float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime); final float centerX = mCenterX; final float centerY = mCenterY; final Camera camera = mCamera; final Matrix matrix = t.getMatrix(); camera.save(); if (mReverse) { camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); } else { camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); } camera.rotateY(degrees); camera.getMatrix(matrix); camera.restore(); matrix.preTranslate(-centerX, -centerY); matrix.postTranslate(centerX, centerY); } }
?
?
过程和动画翻转的控制?
public class ViewRotate implements OnClickListener { private ImageView imageview; private View bg; private DisplayNextView displayNextView; private Context context; private View convertView; private LayoutInflater mInflater; private boolean now_zhengfan; private View container_bg; public ViewRotate(Context context, View convertView, LayoutInflater mInflater) { this.context = context; this.convertView = convertView; this.mInflater = mInflater; now_zhengfan = true; AnimationUtils.loadAnimation(context, R.anim.my_alpha_action); init(); } public void init() { bg = (ViewGroup) convertView.findViewById(R.id.container); bg.findViewById(R.id.btn_more).setOnClickListener(this); container_bg = convertView.findViewById(R.id.container_bg); container_bg .setBackgroundDrawable(GraphicsBitmapUtils. BitmapToDrawable(GraphicsBitmapUtils.getRoundedCornerBitmap(GraphicsBitmapUtils .drawableToBitmap(context.getResources() .getDrawable(R.drawable.zh))))); } private void applyRotation(int position, float start, float end) { // Find the center of the container final float centerX = bg.getWidth() / 2.0f; final float centerY = bg.getHeight() / 2.0f; final Rotate3d rotation = new Rotate3d(start, end, centerX, centerY, 310.0f, false); rotation.setDuration(500); rotation.setFillAfter(false); rotation.setInterpolator(new AccelerateInterpolator()); rotation.setAnimationListener(new DisplayNextView(position, true)); bg.startAnimation(rotation); AlphaAnimation alphaAnim = new AlphaAnimation(0, 1); } @Override public void onClick(View v) { // TODO Auto-generated method stub bg.setEnabled(false); applyRotation(0, 0, 90); } private final class DisplayNextView implements Animation.AnimationListener { private final int mPosition; private final boolean b; private DisplayNextView(int position, boolean t) { mPosition = position; b = t; } public void onAnimationStart(Animation animation) { } public void onAnimationEnd(Animation animation) { if (b) { bg.post(new SwapViews(mPosition)); if (now_zhengfan) { bg.findViewById(R.id.backe_bg1).setVisibility( View.INVISIBLE); } else { bg.findViewById(R.id.backe_bg2).setVisibility( View.INVISIBLE); } } else { bg.setEnabled(true); if (now_zhengfan) { bg.findViewById(R.id.backe_bg2).setVisibility(View.VISIBLE); bg.setOnClickListener(ViewRotate.this); bg.setClickable(true); AlphaAnimation alphaAnim = new AlphaAnimation(0, 1); alphaAnim.setDuration(2000); alphaAnim.setStartOffset(500); alphaAnim .setAnimationListener(new CanClickAnimationListener( bg)); bg.findViewById(R.id.backe_bg2).startAnimation(alphaAnim); now_zhengfan = false; } else { bg.findViewById(R.id.backe_bg1).setVisibility(View.VISIBLE); bg.setOnClickListener(ViewRotate.this); now_zhengfan = true; bg.setClickable(false); View btn = bg.findViewById(R.id.btn_more); btn.setOnClickListener(ViewRotate.this); // container_bg // .setBackgroundDrawable(GraphicsBitmapUtils.BitmapToDrawable(GraphicsBitmapUtils.getRoundedCornerBitmap(GraphicsBitmapUtils // .drawableToBitmap(context.getResources() // .getDrawable(R.drawable.zh))))); AlphaAnimation alphaAnim = new AlphaAnimation(0, 1); alphaAnim.setDuration(2000); alphaAnim.setStartOffset(500); alphaAnim .setAnimationListener(new CanClickAnimationListener( bg, btn)); bg.findViewById(R.id.backe_bg1).startAnimation(alphaAnim); // bg.findViewById(R.id.backe_bg1).startAnimation( // CopyOfTestRotate.this.animation); } } } public void onAnimationRepeat(Animation animation) { } } private final class SwapViews implements Runnable { private final int mPosition; public SwapViews(int position) { mPosition = position; } public void run() { final float centerX = bg.getWidth() / 2.0f; final float centerY = bg.getHeight() / 2.0f; Rotate3d rotation; if (mPosition > -1) { rotation = new Rotate3d(90, 180, centerX, centerY, 310.0f, false); rotation.setAnimationListener(new DisplayNextView(mPosition, false)); } else { rotation = new Rotate3d(90, 0, centerX, centerY, 310.0f, false); } rotation.setDuration(500); rotation.setFillAfter(false); rotation.setInterpolator(new DecelerateInterpolator()); bg.startAnimation(rotation); bg.setEnabled(false); } } }
?
?
?
?