从一个activity到另一个activity的过渡

1.小图点击事件代码@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.img_1:

view.setClickable(false);

Intent intentS = new Intent(this, ImageActivity.class);

int[] screenLocationS = new int[2];

view.getLocationOnScreen(screenLocationS);

intentS.putExtra(LEFT, screenLocationS[0]).//将图片位置传到大图activity用于动画初始位置

putExtra(TOP, screenLocationS[1]).

putExtra(WIDTH, view.getWidth()).

putExtra(HEIGHT, view.getHeight()).

putExtra(IMAGE, _snapUrl).

putExtra(TITLE, _name);

startActivity(intentS);

overridePendingTransition(0, 0);//取消原有默认的Activity到Activity的过渡动画

break;

case R.id.img_2:

view.setClickable(false);

Intent intentM = new Intent(this, ImageActivity.class);

int[] screenLocationM = new int[2];

view.getLocationOnScreen(screenLocationM);

intentM.putExtra(LEFT, screenLocationM[0]).//将图片位置传到大图activity用于动画初始位置

putExtra(TOP, screenLocationM[1]).

putExtra(WIDTH, view.getWidth()).

putExtra(HEIGHT, view.getHeight()).

putExtra(IMAGE, _matchUrl).

putExtra(TITLE, _name);

startActivity(intentM);

overridePendingTransition(0, 0);//取消原有默认的Activity到Activity的过渡动画

break;

}

}

2.大图Activity代码public class BigImageActivity extends Activity implements View.OnClickListener {

private static final int DURATION = 150;

public final static String TITLE  = "Title";

public final static String TOP    = "Top";

public final static String LEFT   = "Left";

public final static String WIDTH  = "Width";

public final static String HEIGHT = "Height";

public final static String IMAGE  = "Image";

private int   mLeftDelta;

private int   mTopDelta;

private float mWidthScale;

private float mHeightScale;

private int           intentTop;

private int           intentLeft;

private int           intentWidth;

private int           intentHeight;

private LinearLayout  linearLayout;

private ColorDrawable colorDrawable;

private ImageView     imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

FaceDetectionApp.setWindowTrans(this, true, false);

setContentView(R.layout.activity_image);

initView();

if (savedInstanceState == null) {

ViewTreeObserver observer = imageView.getViewTreeObserver();

observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

@Override

public boolean onPreDraw() {

imageView.getViewTreeObserver().removeOnPreDrawListener(this);

int[] screenLocation = new int[2];

imageView.getLocationOnScreen(screenLocation);

mLeftDelta = intentLeft - screenLocation[0];

mTopDelta = intentTop - screenLocation[1];

mWidthScale = (float) intentWidth / imageView.getWidth();

mHeightScale = (float) intentHeight / imageView.getHeight();

enterAnimation(new Runnable() {

@Override

public void run() {

Matrix matrix = imageView.getMatrix();

imageView.setImageMatrix(matrix);

imageView.setScaleType(ImageView.ScaleType.MATRIX);

imageView.setOnTouchListener(new ImageTouchListener());

}

});

return true;

}

});

}

}

@Override

protected void initView() {

super.initView();

linearLayout = findViewById(R.id.ll_img);

imageView = findViewById(R.id.img);

initValue();

}

@Override

protected void initValue() {

super.initValue();

colorDrawable = new ColorDrawable(ContextCompat.getColor(this, R.color.color_item_background));

linearLayout.setBackground(colorDrawable);

Bundle bundle = getIntent().getExtras();

if (bundle != null) {

title = bundle.getString(TITLE);

intentTop = bundle.getInt(TOP);

intentLeft = bundle.getInt(LEFT);

intentWidth = bundle.getInt(WIDTH);

intentHeight = bundle.getInt(HEIGHT);

String imgURL = bundle.getString(IMAGE);

asyncLoadImageSmallList(imageView, imgURL);//框架代码 不解释

imageView.setOnClickListener(this);

}

}

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.img:

view.setClickable(false);

exitAnimation(new Runnable() {

public void run() {

finish();

overridePendingTransition(0, 0);

}

});

break;

}

}

@Override

public void onBackPressed() {

exitAnimation(new Runnable() {

public void run() {

finish();

overridePendingTransition(0, 0);

}

});

}

public void enterAnimation(final Runnable enterAction) {

imageView.setPivotX(0);

imageView.setPivotY(0);

imageView.setScaleX(mWidthScale);

imageView.setScaleY(mHeightScale);

imageView.setTranslationX(mLeftDelta);

imageView.setTranslationY(mTopDelta);

TimeInterpolator sDecelerator = new DecelerateInterpolator();

imageView.animate().setDuration(DURATION).scaleX(1).scaleY(1).

translationX(0).translationY(0).setInterpolator(sDecelerator).withEndAction(enterAction);

ObjectAnimator bgAnim = ObjectAnimator.ofInt(colorDrawable, "alpha", 0, 255);

bgAnim.setDuration(DURATION);

bgAnim.start();

}

public void exitAnimation(final Runnable endAction) {

TimeInterpolator sInterpolator = new AccelerateInterpolator();

imageView.animate().setDuration(DURATION).scaleX(mWidthScale).scaleY(mHeightScale).

translationX(mLeftDelta).translationY(mTopDelta).setInterpolator(sInterpolator).withEndAction(endAction);

ObjectAnimator bgAnim = ObjectAnimator.ofInt(colorDrawable, "alpha", 0);

bgAnim.setDuration(DURATION);

bgAnim.start();

}

}

3.缩放与移动代码public class ImageTouchListener implements View.OnTouchListener {

private              boolean isClick   = false;

private              int     mode      = 0;// default value

/**

* Drag mode

*/

private static final int     MODE_DRAG = 1;

/**

* Zoom mode

*/

private static final int     MODE_ZOOM = 2;

/**

* Beginning point

*/

private PointF startPoint    = new PointF();

private Matrix matrix        = new Matrix();

private Matrix currentMatrix = new Matrix();

/**

* Distance between two fingers

*/

private float  startDis;

/**

* The middle point of two fingers

*/

private PointF midPoint;

private float values[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};

private float touchX   = 0;

private float touchY   = 0;

private float scaleXY  = 0;

@Override

public boolean onTouch(View v, MotionEvent event) {

ImageView imageView = (ImageView) v;

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

isClick = true;

mode = MODE_DRAG;

currentMatrix.set(imageView.getImageMatrix());

matrix.set(currentMatrix);

startPoint.set(event.getX(), event.getY());

touchX = event.getX();

touchY = event.getY();

if (scaleXY == 0) {

matrix.getValues(values);

scaleXY = values[0];

}

break;

case MotionEvent.ACTION_MOVE:

matrix.getValues(values);

if (mode == MODE_DRAG) {

float dx = event.getX() - startPoint.x;

float dy = event.getY() - startPoint.y;

if (dx > 15 || dx  15 || dy

isClick = false;

}

float width = (v.getWidth() * values[0]) / (scaleXY);

float height = (v.getHeight() * values[4]) / (scaleXY);

float offset1 = v.getContext().getResources().getDimension(R.dimen.item_height);

float offset2 = v.getContext().getResources().getDimension(R.dimen.item_height) * 1.2f * values[0];

if ((values[2] > v.getWidth() - offset1 && touchX - event.getX()

values[2] = v.getWidth() - offset1 + 5;

if (!(values[5] > v.getHeight() - offset1 && touchY - event.getY()

0)) {

values[5] += event.getY() - touchY;

touchY = event.getY();

}

matrix.setValues(values);

imageView.setImageMatrix(matrix);

return true;

} else if ((values[2] + width  0)) {//move to left

values[2] = offset1 - width - 5;

if (!(values[5] > v.getHeight() - offset1 && touchY - event.getY()

0)) {

values[5] += event.getY() - touchY;

touchY = event.getY();

}

matrix.setValues(values);

imageView.setImageMatrix(matrix);

return true;

}

if ((values[5] > v.getHeight() - offset1 && touchY - event.getY()

values[5] = v.getHeight() - offset1 + 5;

if (!(values[2] > v.getWidth() - offset1 && touchX - event.getX()  0)) {

values[2] += event.getX() - touchX;

touchX = event.getX();

}

matrix.setValues(values);

imageView.setImageMatrix(matrix);

return true;

} else if ((values[5] + height  0)) {//move to top

values[5] = offset2 - height - 5;

if (!(values[2] > v.getWidth() - offset1 && touchX - event.getX()  0)) {

values[2] += event.getX() - touchX;

touchX = event.getX();

}

matrix.setValues(values);

imageView.setImageMatrix(matrix);

return true;

}

touchX = event.getX();

touchY = event.getY();

matrix.set(currentMatrix);

matrix.postTranslate(dx, dy);

} else if (mode == MODE_ZOOM) {

float endDis = distance(event);

if (endDis > 10f) {

float scale = endDis / startDis;

if (values[0] / scaleXY  3 && scale > 1) {

return true;

}

matrix.set(currentMatrix);

matrix.postScale(scale, scale, midPoint.x, midPoint.y);

}

isClick = false;

}

break;

case MotionEvent.ACTION_UP:

if (isClick) {

v.performClick();

}

case MotionEvent.ACTION_POINTER_UP:

isClick = false;

mode = 0;

break;

case MotionEvent.ACTION_POINTER_DOWN:

isClick = false;

mode = MODE_ZOOM;

startDis = distance(event);

if (startDis > 10f) {

midPoint = mid(event);

currentMatrix.set(imageView.getImageMatrix());

}

break;

}

imageView.setImageMatrix(matrix);

return true;

}

/**

* Calculate the distance between two fingers

*/

private float distance(MotionEvent event) {

float dx = event.getX(1) - event.getX(0);

float dy = event.getY(1) - event.getY(0);

return (float) Math.sqrt(dx * dx + dy * dy);

}

/**

* calculate the middle point of the two fingers

*/

private PointF mid(MotionEvent event) {

float midX = (event.getX(1) + event.getX(0)) / 2;

float midY = (event.getY(1) + event.getY(0)) / 2;

return new PointF(midX, midY);

}

}

4.大图布局文件代码<?xml  version="1.0" encoding="utf-8"?>

android:id="@+id/ll_img"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/color_item_background"

android:orientation="vertical">

android:id="@+id/img"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:contentDescription="@string/app_name"

android:scaleType="fitCenter"/>

做个笔记,留作以后,不保证编译通过。并且部分代码涟源网络。

android图片缩放动画,Android开发笔记——点击查看大图过渡动画与图片缩放与移动...相关推荐

  1. 安卓 webview加载html图片自适应手机屏幕大小和点击查看大图

    我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...

  2. 小红书怎么点击查看大图_小红书图片如何调整呢?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一.首图 1.重要性 多图发布是当下小红书社区笔记的常态.图片上限为9张,建议博主一次发6~9张图,"仟人仟面"小红书运营主管小萍告诉 ...

  3. Android开发之--读取文件夹下图片生成略缩图并点击显示大图

    这是一个简单的Demo,目的是:读取文件夹下图片生成略缩图并点击显示大图. 先新建一个工程,创建一个ThumbnailsWindows的类,继承LinearLayout.代码如下: package o ...

  4. android webview加载html图片自适应手机屏幕大小点击查看大图

    我们在开发中,显示信息详情时,一般后台会给出html文本,在android端一般采用webview控件来展示,但是后台给出的html文本一般是给电脑端用的,没有自适配手机,导致手机端图片显示过大,需要 ...

  5. 【Android视图效果】共享元素实现仿微信查看大图效果

    在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...

  6. 直播电商平台开发,点击让窗口抖动动画效果

    直播电商平台开发,点击让窗口抖动动画效果 css代码 .shake {animation: shake 800ms ease-in-out;} @keyframes shake {10%, 90% { ...

  7. 直播电商平台开发,点击查看更多显示所有内容

    直播电商平台开发,点击查看更多显示所有内容 实现代码: mainactivity.xml: <?xml version="1.0" encoding="utf-8& ...

  8. Android开发笔记(九十六)集合动画与属性动画

    集合动画AnimationSet 补间动画有四大类:透明度动画AlphaAnimation.旋转动画RotateAnimation.缩放动画ScaleAnimation.平移动画TranslateAn ...

  9. Android开发笔记(一百五十)自动识别验证码图片

    若问目前IT领域最炙手可热的技术方向,必属人工智能(简称AI)无疑.前有谷歌的阿法狗完胜围棋世界冠军柯洁,后有微软小冰出版了诗集<阳光失了玻璃窗>,一时间沸沸扬扬,似乎人工智能无所不能,从 ...

最新文章

  1. mysql在线教程嵌套_MySQL update嵌套
  2. JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介
  3. 样本距离计算、向量范数、矩阵范数
  4. C# ReaderWriterLockSlim类
  5. 苹果电脑怎么投屏到电视_tcl电视怎么投屏
  6. 【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机
  7. 指静脉识别技术在安防行业的应用前景
  8. 《Java高并发程序设计》读书笔记 第二章 并行程序基础
  9. app具体介绍界面-01
  10. Bing翻译和Google翻译的比较
  11. Tushare使用分享
  12. 学科03:工程学重要模型
  13. 攻防世界,Reverse:logmein
  14. C Prime plus 第七章练习题
  15. 【每日随笔】记录完整的劳动仲裁过程 一 ( 赢火虫律师平台 | 赢火虫手机端跟进案件信息 | 等待律师接单 | 提交信息给律师 )
  16. Andriod 虚拟机
  17. hadoop dremel Caffeine Pregel
  18. 一个故事讲完https
  19. 心脏滴血(CVE-2014-0160)
  20. 【5】依赖注入DI(Dependency Injection)

热门文章

  1. 重磅|犀思云联手中国信通院、应通科技发布首部《云交换白皮书》
  2. EMCP 物联网云平台物联卡管理说明
  3. 【嵌入式UI框架:LVGL】使用NXP GUI Guider 拖拽式设计LVGL
  4. 【超简短的独立游戏开发教学】学习记录
  5. 机器学习期末考试复习
  6. renpy 替换图标
  7. Unity 制作字体
  8. 使用(VAE)生成建模,理解可变自动编码器背后的数学原理
  9. [社招][杭州]阿里菜鸟 P6 可帮内推,期待你的加入~
  10. Microbit无法下载程序,盘符显示MAINTENANCE的解决办法