Android编程实现的超炫图片浏览器

2019-12-10 19:43:25王冬梅

仅仅实现了图片的倒影效果还不够,因为在coverflow中图片切换是有旋转和缩放效果的,而自带的gallery中并没有实现。因此,我们扩展自带的gallery,实现自己的galleryflow。在原gallery类中,提供了一个方法getChildStaticTransformation()以实现对图片的变换。我们通过覆写这个方法并在其中调用自定义的transformImageBitmap(“每个图片与gallery中心的距离”)方法,,即可实现每个图片做相应的旋转和缩放。其中使用了camera和matrix用于视图变换。具体可参考代码注释。

public class GalleryFlow extendsGallery { 
  /** 
   * Graphics Camera used for transforming the matrix of ImageViews 
   */ 
  privateCamera mCamera = newCamera(); 
  /** 
   * The maximum angle the Child ImageView will be rotated by 
   */ 
  privateint mMaxRotationAngle =60; 
  /** 
   * The maximum zoom on the centre Child 
   */ 
  privateint mMaxZoom = -120; 
  /** 
   * The Centre of the Coverflow 
   */ 
  privateint mCoveflowCenter; 
  publicGalleryFlow(Context context) { 
    super(context); 
    this.setStaticTransformationsEnabled(true); 
  } 
  publicGalleryFlow(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.setStaticTransformationsEnabled(true); 
  } 
  publicGalleryFlow(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.setStaticTransformationsEnabled(true); 
  } 
  /** 
   * Get the max rotational angle of the image 
   * 
   * @return the mMaxRotationAngle 
   */ 
  publicint getMaxRotationAngle() { 
    returnmMaxRotationAngle; 
  } 
  /** 
   * Set the max rotational angle of each image 
   * 
   * @param maxRotationAngle 
   *   the mMaxRotationAngle to set 
   */ 
  publicvoid setMaxRotationAngle(intmaxRotationAngle) { 
    mMaxRotationAngle = maxRotationAngle; 
  } 
  /** 
   * Get the Max zoom of the centre image 
   * 
   * @return the mMaxZoom 
   */ 
  publicint getMaxZoom() { 
    returnmMaxZoom; 
  } 
  /** 
   * Set the max zoom of the centre image 
   * 
   * @param maxZoom 
   *   the mMaxZoom to set 
   */ 
  publicvoid setMaxZoom(intmaxZoom) { 
    mMaxZoom = maxZoom; 
  } 
  /** 
   * Get the Centre of the Coverflow 
   * 
   * @return The centre of this Coverflow. 
   */ 
  privateint getCenterOfCoverflow() { 
    return(getWidth() - getPaddingLeft() - getPaddingRight()) / 2 
        + getPaddingLeft(); 
  } 
  /** 
   * Get the Centre of the View 
   * 
   * @return The centre of the given view. 
   */ 
  privatestatic int getCenterOfView(View view) { 
    returnview.getLeft() + view.getWidth() / 2; 
  } 
  /** 
   * {@inheritDoc} 
   * 
   * @see #setStaticTransformationsEnabled(boolean) 
   */ 
  protectedboolean getChildStaticTransformation(View child, Transformation t) { 
    finalint childCenter = getCenterOfView(child); 
    finalint childWidth = child.getWidth(); 
    introtationAngle = 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); 
    } 
    returntrue; 
  } 
  /** 
   * 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. 
   */ 
  protectedvoid onSizeChanged(intw, int h, int oldw, int oldh) { 
    mCoveflowCenter = getCenterOfCoverflow(); 
    super.onSizeChanged(w, h, oldw, oldh); 
  } 
  /** 
   * Transform the Image Bitmap by the Angle passed 
   * 
   * @param imageView 
   *   ImageView the ImageView whose bitmap we want to rotate 
   * @param t 
   *   transformation 
   * @param rotationAngle 
   *   the Angle by which to rotate the Bitmap 
   */ 
  privatevoid transformImageBitmap(ImageView child, Transformation t, 
      introtationAngle) { 
    mCamera.save(); 
    finalMatrix imageMatrix = t.getMatrix(); 
    finalint imageHeight = child.getLayoutParams().height; 
    finalint imageWidth = child.getLayoutParams().width; 
    finalint 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) { 
      floatzoomAmount = (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(); 
  } 
}