android图片点击全屏显示,Android浏览图片,点击放大至全屏效果

本文介绍如何在Android应用中实现图片点击后全屏显示的效果,类似于QQ空间的图片浏览功能。通过自定义ImageView控件`SmoothImageView`,完成图片的平滑缩放、平移和分割动画。涉及关键步骤包括:图片尺寸和位置信息的传递、缩放和平移的计算、动画的执行。最终实现在点击图片后,从一个CENTER_CROP的ImageView平滑过渡到FIT_CENTER的全屏显示。
摘要由CSDN通过智能技术生成

近期做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果非常赞,于是也做了个类似的效果。

例如以下。

128430993_1_20180327045309222

我不知道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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值