近期做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果非常赞,于是也做了个类似的效果。
例如以下。
我不知道QQ那个是怎么做的。我的思路例如以下:
首先。从图片缩略界面跳转到图片详情页面,应该是从一个Activity跳转到另外一个Activity,应该图片详情页面也有非常多操作。用View或者Dialog不是非常好。所以如今难点就是。怎样使得前一个界面的ImageView在另外一个界面做缩放分割动画。
一般缩略界面的ImageView的是如上图所看到的的正方形的,而且是CENTER_CROP缩放属性的。CENTER_CROP属性会导致ImageView中显示的Bitmap有被分割达到填充的效果。
而详情页面的ImageView一般都是FIT_CENTER的缩放属性。所以要保证这个跳转动画的流畅。要做例如以下的变化:
1、Bitmap的缩放,由于缩略图和详情图的缩放比例肯定不一样
2、Bitmap位置的平移。由于缩略图的位置是不确定的,我们要使他平移到中间
3、Bitmap的分割,由于CENTER_CROP是分割过得,而FIT_CENTER是没有分割的,那么两幅图显示的内容区域是不同的,所以也要显示区域的平滑变换。
要完毕上面的效果,假设单单是指对ImageView做一个动画变换,我认为是完毕不了这个要求的。所以自己重写了ImageView来完毕上述的变换。
直接贴上基本的ImageView
package com.roamer.ui.view;
import android.animation.Animator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
/**
* 2d平滑变化的显示图片的ImageView
* 仅限于用于:从一个ScaleType==CENTER_CROP的ImageView,切换到还有一个ScaleType=
* FIT_CENTER的ImageView,或者反之 (当然,得使用相同的图片最好)
*
* @author Dean Tao
*
*/
public class SmoothImageView extends ImageView {
private static final int STATE_NORMAL = 0;
private static final int STATE_TRANSFORM_IN = 1;
private static final int STATE_TRANSFORM_OUT = 2;
private int mOriginalWidth;
private int mOriginalHeight;
private int mOriginalLocationX;
private int mOriginalLocationY;
private int mState = STATE_NORMAL;
private Matrix mSmoothMatrix;
private Bitmap mBitmap;
private boolean mTransformStart = false;
private Transfrom mTransfrom;
private final int mBgColor = 0xFF000000;
private int mBgAlpha = 0;
private Paint mPaint;
public SmoothImageView(Context context) {
super(context);
init();
}
public SmoothImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SmoothImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
mSmoothMatrix = new Matrix();
mPaint=new Paint();
mPaint.setColor(mBgColor);
mPaint.setStyle(Style.FILL);
//setBackgroundColor(mBgColor);
}
public void setOriginalInfo(int width, int height, int locationX, int locationY) {
mOriginalWidth = width;
mOriginalHeight = height;
mOriginalLocationX = locationX;
mOriginalLocationY = locationY;
// 由于是屏幕坐标。所以要转换为该视图内的坐标,由于我所用的该视图是MATCH_PARENT,所以不用定位该视图的位置,假设不是的话。还须要定位视图的位置,然后计算mOriginalLocationX和mOriginalLocationY
mOriginalLocationY = mOrigin