Android UI控件之Gallery --拖动、覆盖、循环、3D图片浏览 效果之二

                 上一篇博客中实现了一种3d效果的图片浏览功能,但是感觉上还是太过"硬性",因此对上

        一次做一些改进。好了话不多说直接给出效果图吧。小编是“刀剑”的粉丝,因此就以“刀剑”为

        背景吧!

                     第一张:

                拖动到第二张

              拖动时的过渡效果

                实现方式就是重新继承Gallery

               具体如下:

package com.android.CustomGallery;  import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.Transformation; import android.widget.Gallery; import android.widget.ImageView;  public class GalleryFlow extends Gallery {  	/** 	 * Graphics Camera used for transforming the matrix of ImageViews 	 */ 	private Camera mCamera = new Camera();  	/** 	 * The maximum angle the Child ImageView will be rotated by 	 */ 	private int mMaxRotationAngle = 50;  	/** 	 * The maximum zoom on the centre Child 	 */ 	private int mMaxZoom = -250;  	/** 	 * The Centre of the Coverflow 	 */ 	private int mCoveflowCenter;  	public GalleryFlow(Context context) { 		super(context); 		this.setStaticTransformationsEnabled(true); 	}  	public GalleryFlow(Context context, AttributeSet attrs) { 		super(context, attrs); 		this.setStaticTransformationsEnabled(true); 	}  	public GalleryFlow(Context context, AttributeSet attrs, int defStyle) { 		super(context, attrs, defStyle); 		this.setStaticTransformationsEnabled(true); 	}  	/** 	 * Get the max rotational angle of the image 	 *  	 * @return the mMaxRotationAngle 	 */ 	public int getMaxRotationAngle() { 		return mMaxRotationAngle; 	}  	/** 	 * Set the max rotational angle of each image 	 *  	 * @param maxRotationAngle 	 *            the mMaxRotationAngle to set 	 */ 	public void setMaxRotationAngle(int maxRotationAngle) { 		mMaxRotationAngle = maxRotationAngle; 	}  	/** 	 * Get the Max zoom of the centre image 	 *  	 * @return the mMaxZoom 	 */ 	public int getMaxZoom() { 		return mMaxZoom; 	}  	/** 	 * Set the max zoom of the centre image 	 *  	 * @param maxZoom 	 *            the mMaxZoom to set 	 */ 	public void setMaxZoom(int maxZoom) { 		mMaxZoom = maxZoom; 	}  	/** 	 * Get the Centre of the Coverflow 	 *  	 * @return The centre of this Coverflow. 	 */ 	private int getCenterOfCoverflow() { 		//Log.e("CoverFlow Width+Height", getWidth() + "*" + getHeight()); 		return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 				+ getPaddingLeft(); 	}  	/** 	 * Get the Centre of the View 	 *  	 * @return The centre of the given view. 	 */ 	private static int getCenterOfView(View view) { 		/*Log.e("ChildView Width+Height", view.getWidth() + "*" 				+ view.getHeight());*/ 		return view.getLeft() + view.getWidth() / 2; 	}  	/** 	 * {@inheritDoc} 	 *  	 * @see #setStaticTransformationsEnabled(boolean) 	 */ 	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; 	}  	/** 	 * This is called during layout when the size of this view has changed. If 	 * you were just added to the view hierarchy, you're called with the old 	 * values of 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. 	 */ 	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);  		// 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); 			((ImageView) (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(); 	} } 
                至于布局文件,与上篇并无多大差别!这里就不给出了

                    完整源码部分:


你可能感兴趣的:(android,UI,3D,gallery)