I use this class to create CoverFlow in my application:
public class CoverFlow extends Gallery {
private Camera mCamera = new Camera();
private int mMaxRotationAngle = 60;
private int mMaxZoom = -175;
private int mCoveflowCenter;
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 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) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){
} else {
transformImageBitmap((ImageView) child, t, 0);
}
} else {
rotationAngle = (int) (((float) (mCoveflowCenter - childCenter)/ childWidth) * mMaxRotationAngle);
if (Math.abs(rotationAngle) > mMaxRotationAngle) {
rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1){
} else {
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);
mCamera.translate(0.0f, 0.0f, 100.0f);
if ( rotation < mMaxRotationAngle ) {
float zoomAmount = (float) (mMaxZoom + (rotation * 2.9));
mCamera.translate(0.0f, 0.0f, zoomAmount);
}
mCamera.rotateY(rotationAngle);
mCamera.getMatrix(imageMatrix);
imageMatrix.preTranslate(-(imageWidth/2), -(imageHeight/2));
imageMatrix.postTranslate((imageWidth/2), (imageHeight/2));
mCamera.restore();
}
}
But this code after the 4.0 device, such as 4.1 or 4.2, no longer works.
I did some debugging, so I changed this part:
if ( rotation < mMaxRotationAngle ) {
Log.d("sergi",""+rotation);
float zoomAmount = (float) (mMaxZoom + (rotation * 2.9));
mCamera.translate(0.0f, 0.0f, zoomAmount);
}
And that brought it back on device 4.0.4, placing one image from right to left:
03-20 11:11:43.145: D/debugging(15987): 1
03-20 11:11:43.160: D/debugging(15987): 54
03-20 11:11:43.160: D/debugging(15987): 59
03-20 11:11:43.160: D/debugging(15987): 2
03-20 11:11:43.176: D/debugging(15987): 53
03-20 11:11:43.176: D/debugging(15987): 3
03-20 11:11:43.192: D/debugging(15987): 52
03-20 11:11:43.192: D/debugging(15987): 4
03-20 11:11:43.207: D/debugging(15987): 51
03-20 11:11:43.207: D/debugging(15987): 5
03-20 11:11:43.223: D/debugging(15987): 50
03-20 11:11:43.223: D/debugging(15987): 6
03-20 11:11:43.239: D/debugging(15987): 48
03-20 11:11:43.239: D/debugging(15987): 8
03-20 11:11:43.254: D/debugging(15987): 47
03-20 11:11:43.254: D/debugging(15987): 9
And on device 4.1 it returned:
03-20 11:11:49.239: D/debugging(15987): 35
03-20 11:11:49.254: D/debugging(15987): 35
As you can see, basically what happens is that the same method is not used equally between two different apis.
As you can see, CoverFlow expands the gallery, which is outdated but not deleted, so I don’t understand what the difference is. I would appreciate it if we can solve the problem.
Thank.