package hong.specialEffects.wight; import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.View; import android.view.animation.Transformation; import android.widget.Gallery; import android.widget.ImageView; public class CoverFlow extends Gallery { //mCamera����������3DЧ������,����z�᷽���ϵ�ƽ��,��y�����ת�� private Camera mCamera = new Camera(); //��ͼƬ��y�������ת�Ƕ�,Ҳ������Ļ�����������ͼƬ����ת�Ƕ� private int mMaxRotationAngle = 50;//60; //mMaxZoom��ͼƬ��z��ƽ�Ƶľ���,�Ӿ��Ͽ��������ǷŴ���С��Ч��. private int mMaxZoom = -480;//-120; private int mCoveflowCenter; private boolean mAlphaMode = true; private boolean mCircleMode = false; public CoverFlow(Context context) { super(context); this.setStaticTransformationsEnabled(true); } public CoverFlow(Context context, AttributeSet attrs) { super(context, attrs); this.setStaticTransformationsEnabled(true); } public CoverFlow(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setStaticTransformationsEnabled(true); } public int getMaxRotationAngle() { return mMaxRotationAngle; } public void setMaxRotationAngle(int maxRotationAngle) { mMaxRotationAngle = maxRotationAngle; } public boolean getCircleMode() { return mCircleMode; } public void setCircleMode(boolean isCircle) { mCircleMode = isCircle; } public boolean getAlphaMode() { return mAlphaMode; } public void setAlphaMode(boolean isAlpha) { mAlphaMode = isAlpha; } 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; } /** * ��Gallery��ͼ���л�ʱ������ô˺��� * ����ͼ���λ�ý�ͼ������Ӧλ�õ�����y����ת�󣬼ȵõ�coverflowЧ�� */ @Override 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; } /** * �������ν���ڴ�С�IJ���ʱ,��һ�۵��Ѿ������˸ı䡣��� ��ֻ����ӵ���ͼ���,���˽���ɵĹ��� ��ֵ��Ϊ0�� * * @param w * Current width of this view. * @param h * Current height of this view. * @param oldw * Old width of this view. * @param oldh * Old height of this view. */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mCoveflowCenter = getCenterOfCoverflow(); super.onSizeChanged(w, h, oldw, oldh); } /** * ��ͼ��λͼ����y����ת * * @param imageView * ImageView the ImageView whose bitmap we want to rotate * @param t * transformation * @param rotationAngle * the Angle by which to rotate the Bitmap */ 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); mCamera.translate(0.0f, 0.0f, 100.0f); // ����ͼ�ĽǶȸ���,�Ŵ� if (rotation <= mMaxRotationAngle) { float zoomAmount = (float) (mMaxZoom + (rotation * 1.5)); mCamera.translate(0.0f, 0.0f, zoomAmount); if (mCircleMode) { if (rotation < 40) mCamera.translate(0.0f, 155, 0.0f); else mCamera.translate(0.0f, (255 - rotation * 2.5f), 0.0f); } if (mAlphaMode) { (child).setAlpha((int) (255 - rotation * 2.5)); } } mCamera.rotateY(rotationAngle); mCamera.getMatrix(imageMatrix); imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2)); imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2)); mCamera.restore(); } }