Android Gallery 3D效果(有图有真相)(3)

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;

public class DetialGallery extends
  Gallery {
 private Camera mCamera = new Camera();
 private int mMaxRotationAngle = 45;
 private int mMaxZoom = -120;
 private int mCoveflowCenter;

public DetialGallery(
   Context context,
   AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

public int getMaxRotationAngle() {
  return mMaxRotationAngle;
 }

public void setMaxRotationAngle(
   int maxRotationAngle) {
  mMaxRotationAngle = maxRotationAngle;
 }

public int getMaxZoom() {
  return mMaxZoom;
 }

public void setMaxZoom(int maxZoom) {
  mMaxZoom = maxZoom;
 }

private int getCenterOfCoverflow() {
  return (getWidth()
    - getPaddingLeft() - getPaddingRight())
    / 2 + getPaddingLeft();
 }

private static int getCenterOfView(
   View view) {
  return view.getLeft()
    + view.getWidth() / 2;
 }

protected boolean getChildStaticTransformation(
   View child, Transformation t) {
  final int childCenter = getCenterOfView(child);
  final int childWidth = child
    .getWidth();
  int rotationAngle = 0;
  t.clear();
  t.setTransformationType(Transformation.TYPE_MATRIX);

if (childCenter == mCoveflowCenter) {
   transformImageBitmap(
     (ImageView) child,
     t, 0);
  } else {
   rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
   if (Math.abs(rotationAngle) > mMaxRotationAngle) {
    rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle
      : mMaxRotationAngle;
   }
   transformImageBitmap(
     (ImageView) child,
     t, rotationAngle);
  }
  return true;
 }

protected void onSizeChanged(int w,
   int h, int oldw, int oldh) {
  mCoveflowCenter = getCenterOfCoverflow();
  super.onSizeChanged(w, h, oldw,
    oldh);
 }

private void transformImageBitmap(
   ImageView child,
   Transformation t,
   int rotationAngle) {
  mCamera.save();
  final Matrix imageMatrix = t
    .getMatrix();
  final int imageHeight = child
    .getLayoutParams().height;
  final int imageWidth = child
    .getLayoutParams().width;
  final int rotation = Math
    .abs(rotationAngle);

// 在Z轴上正向移动camera的视角,实际效果为放大图片。
  // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。
  mCamera.translate(0.0f, 0.0f,
    100.0f);

// As the angle of the view gets less, zoom in
  if (rotation < mMaxRotationAngle) {
   float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));
   mCamera.translate(0.0f,
     0.0f, zoomAmount);
  }
  // 在Y轴上旋转,对应图片竖向向里翻转。
  // 如果在X轴上旋转,则对应图片横向向里翻转。
  mCamera.rotateY(rotationAngle);
  mCamera.getMatrix(imageMatrix);
  imageMatrix.preTranslate(
    -(imageWidth / 2),
    -(imageHeight / 2));
  imageMatrix.postTranslate(
    (imageWidth / 2),
    (imageHeight / 2));
  mCamera.restore();
 }

//
 // private boolean isScrollingLeft(
 // MotionEvent e1,
 // MotionEvent e2) {
 // return e2.getX() > e1.getX();
 // }

@Override
 public boolean onFling(
   MotionEvent e1,
   MotionEvent e2,
   float velocityX,
   float velocityY) {
  // int keyCode;
  // if (isScrollingLeft(e1, e2)) {
  // keyCode = KeyEvent.KEYCODE_DPAD_LEFT;
  // } else {
  // keyCode = KeyEvent.KEYCODE_DPAD_RIGHT;
  // }
  // onKeyDown(keyCode, null);
  return false;
 }

}


 

-------------------.xml

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxwpj.html