什么都不说,先看效果
这是原始图片的样子
这是翻转后的效果图
如果是你想要的效果,那么继续往下看,如果不是,那可以跳过了。这是一个动画,而不是用matrix实现的直接翻转图片。
我这个是根据APIDemo简单修改写的
需要一个Rotate3d 类,继承Animation
- 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);
- }
- }
这个类可以直接拷过去,不用做任何的修改。其中的方法自己找相关资料研究。
在main.xml里加个ImageView,如
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/container"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Rotate"
- android:textSize="50px"
- android:layout_x="150px"
- android:layout_y="30px"
- android:src="@drawable/ro">
- ></ImageView>
- </FrameLayout>
这个不需要解释吧,都可以看懂的
最后,还需要一个activity类
如:
- public class TestRotate extends Activity implements OnClickListener{
- private mageView imageview;
- private ViewGroup mContainer;
- /**
- *这个变量设置的是图片,如果是多张图片,那么可以用数组,如
- *private static final int IMAGE = new int[]{
- * R.drawable.ro,
- * R.drawable.icon
- *};
- *有多少图片就放多少,我这里做的只是一张图片的翻转
- *
- */
- private static final int IMAGE = R.drawable.ro;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- imageview = (ImageView) findViewById(R.id.image);
- mContainer = (ViewGroup) findViewById(R.id.container);
- /**
- * 设置最新显示的图片
- * 如果是数组,那么可以写成IMAGE[int]
- *
- */
- imageview.setImageResource(IMAGE);
- /**
- *
- * 设置ImageView的OnClickListener
- *
- */
- imageview.setClickable(true);
- imageview.setFocusable(true);
- imageview.setOnClickListener(this);
- }
- private void applyRotation(int position, float start, float end) {
- // Find the center of the container
- final float centerX = mContainer.getWidth() / 2.0f;
- final float centerY = mContainer.getHeight() / 2.0f;
- final Rotate3d rotation =
- new Rotate3d(start, end, centerX, centerY, 310.0f, true);
- rotation.setDuration(500);
- rotation.setFillAfter(true);
- rotation.setInterpolator(new AccelerateInterpolator());
- rotation.setAnimationListener(new DisplayNextView(position));
- mContainer.startAnimation(rotation);
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /**
- *
- * 调用这个方法,就是翻转图片
- * 参数很简单,大家都应该看得懂
- * 简单说下,第一个是位置,第二是开始的角度,第三个是结束的角度
- * 这里需要说明的是,如果是要回到上一张
- * 把第一个参数设置成-1就行了
- *
- */
- applyRotation(0,0,90);
- }
- private final class DisplayNextView implements Animation.AnimationListener {
- private final int mPosition;
- private DisplayNextView(int position) {
- mPosition = position;
- }
- public void onAnimationStart(Animation animation) {
- }
- public void onAnimationEnd(Animation animation) {
- mContainer.post(new SwapViews(mPosition));
- }
- public void onAnimationRepeat(Animation animation) {
- }
- }
- /**
- * This class is responsible for swapping the views and start the second
- * half of the animation.
- */
- private final class SwapViews implements Runnable {
- private final int mPosition;
- public SwapViews(int position) {
- mPosition = position;
- }
- public void run() {
- final float centerX = mContainer.getWidth() / 2.0f;
- final float centerY = mContainer.getHeight() / 2.0f;
- Rotate3d rotation;
- if (mPosition > -1) {
- imageview.setVisibility(View.VISIBLE);
- imageview.requestFocus();
- rotation = new Rotate3d(90, 180, centerX, centerY, 310.0f, false);
- } else {
- imageview.setVisibility(View.GONE);
- rotation = new Rotate3d(90, 0, centerX, centerY, 310.0f, false);
- }
- rotation.setDuration(500);
- rotation.setFillAfter(true);
- rotation.setInterpolator(new DecelerateInterpolator());
- mContainer.startAnimation(rotation);
- }
- }
- }