package com.duguang.baseanimation.ui.imitate.gallery;
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 CustomGallery extends Gallery {
private int galleryCenterPoint; // gallery�����ĵ�
private final int maxRotateAngle = 70; // �����ת�Ƕ�
private Camera camera;
public CustomGallery(Context context, AttributeSet attrs) {
super(context, attrs);
setStaticTransformationsEnabled(true);
camera = new Camera();
}
/**
* ��ijһ��ͼƬ��Ҫ�任ʱ�ص�
*/
@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
int viewCenterPoint = getViewCenterPoint(child);
int rotateAngle = 0;
if(galleryCenterPoint != viewCenterPoint) { // ��?ǰ�����ߵ�ͼƬ
float scale = (float) (galleryCenterPoint - viewCenterPoint) / (float) child.getWidth();
// Log.i("CustomGallery", "����: " + scale);
rotateAngle = (int) (scale * maxRotateAngle);
if(Math.abs(rotateAngle) > maxRotateAngle) { // -51 -60 55 66
rotateAngle = rotateAngle > 0 ? maxRotateAngle : -maxRotateAngle;
}
}
// ���֮ǰ�任������
t.clear();
// ���ñ任������Ϊ��������
t.setTransformationType(Transformation.TYPE_MATRIX);
transformationItem((ImageView) child, rotateAngle, t);
return true;
}
/**
* ����ÿһ��item�ı任
* @param iv
* @param rotateAngle
* @param t
*/
private void transformationItem(ImageView iv, int rotateAngle, Transformation t) {
camera.save(); // ���������֮ǰ��״̬
camera.translate(0, 0, 100f);
int absRotateAngle = Math.abs(rotateAngle); // ȡ����ת�Ƕȵľ��ֵ
/**
* �Ŵ�ͼƬ
* �м��ͼƬ��zoomֵΪ: -250
* 45 * 1.5 = 70 - 250 = -180
* 50 * 1.5 = 75 - 250 = -175
*/
int zoom = (int) (absRotateAngle * 1.5 - 250);
camera.translate(0, 0, zoom);
/**
* ����ͼƬ������
* setAlpha ��ȡֵ��Χ: 1 ~ 255
* 1 ��ȫ��
* 255 ��ȫ��ʾ
*
* �м��ͼƬ: 255 - 0 * 2.5 = 255
* ���ߵ�ͼƬ: 255 - 50 * 2.5 = 130
*/
int alpha = (int) (255 - absRotateAngle * 2.5);
iv.setAlpha(alpha);
// ������ת
camera.rotateY(rotateAngle);
Matrix matrix = t.getMatrix();
camera.getMatrix(matrix); // ������һЩ�еIJ�����װ��������
// ִ�����б任֮ǰ��ԭͼ�ƶ���: ���, һ���ȵľ���, �ϱ�, һ��߶ȵľ���
matrix.preTranslate(-iv.getWidth() / 2, -iv.getHeight() / 2);
// ִ�����б任֮���ԭͼ�ƶ�����ʼλ��: �ұ�, һ���ȵľ���, �±߶�, һ��߶ȵľ���
matrix.postTranslate(iv.getWidth() / 2, iv.getHeight() / 2);
camera.restore(); // �ָ�������֮ǰ��״̬
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
galleryCenterPoint = getGalleryCenterPoint();
}
/**
* ���Gallery�����ĵ�
* @return
*/
private int getGalleryCenterPoint() {
return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 + getPaddingLeft();
}
/**
* ���ͼƬ�����ĵ�
* @param v
* @return
*/
private int getViewCenterPoint(View v) {
return v.getWidth() / 2 + v.getLeft();
}
}