android点击后图片变大,Android实现点击缩略图放大效果

2023-10-31

import android.animation.Animator;

import android.animation.AnimatorListenerAdapter;

import android.animation.AnimatorSet;

import android.animation.ObjectAnimator;

import android.graphics.Point;

import android.graphics.Rect;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.view.animation.DecelerateInterpolator;

import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

// 持有这个动画的引用,让他可以在动画执行中途取消

private Animator mCurrentAnimator;

private int mShortAnimationDuration;

private View imageView1;

private View imageView2;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

imageView1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

zoomImageFromThumb(imageView1,R.mipmap.ic_launcher);

}

});

imageView2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

zoomImageFromThumb(imageView2,R.mipmap.ic_launcher);

}

});

// 系统默认的短动画执行时间 200

mShortAnimationDuration = getResources().getInteger(

android.R.integer.config_shortAnimTime);

}

private void initView() {

imageView1 = (ImageView) findViewById(R.id.imageView1);

imageView2 = (ImageView) findViewById(R.id.imageView2);

}

private void zoomImageFromThumb(final View thumbView, int imageResId) {

// 如果有动画正在运行,取消这个动画

if (mCurrentAnimator != null) {

mCurrentAnimator.cancel();

}

// 加载显示大图的ImageView

final ImageView expandedImageView = (ImageView) findViewById(

R.id.expanded_image);

expandedImageView.setImageResource(imageResId);

// 计算初始小图的边界位置和最终大图的边界位置。

final Rect startBounds = new Rect();

final Rect finalBounds = new Rect();

final Point globalOffset = new Point();

// 小图的边界就是小ImageView的边界,大图的边界因为是铺满全屏的,所以就是整个布局的边界。

// 然后根据偏移量得到正确的坐标。

thumbView.getGlobalVisibleRect(startBounds);

findViewById(R.id.imageView1).getGlobalVisibleRect(finalBounds, globalOffset);

startBounds.offset(-globalOffset.x, -globalOffset.y);

finalBounds.offset(-globalOffset.x, -globalOffset.y);

// 计算初始的缩放比例。最终的缩放比例为1。并调整缩放方向,使看着协调。

float startScale=0;

if ((float) finalBounds.width() / finalBounds.height()

> (float) startBounds.width() / startBounds.height()) {

// 横向缩放

float startWidth = startScale * finalBounds.width();

float deltaWidth = (startWidth - startBounds.width()) / 2;

startBounds.left -= deltaWidth;

startBounds.right += deltaWidth;

} else {

// 竖向缩放

float startHeight = startScale * finalBounds.height();

float deltaHeight = (startHeight - startBounds.height()) / 2;

startBounds.top -= deltaHeight;

startBounds.bottom += deltaHeight;

}

// 隐藏小图,并显示大图

thumbView.setAlpha(0f);

expandedImageView.setVisibility(View.VISIBLE);

// 将大图的缩放中心点移到左上角。默认是从中心缩放

expandedImageView.setPivotX(0f);

expandedImageView.setPivotY(0f);

//对大图进行缩放动画

AnimatorSet set = new AnimatorSet();

set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, finalBounds.left))

.with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, finalBounds.top))

.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f))

.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f));

set.setDuration(mShortAnimationDuration);

set.setInterpolator(new DecelerateInterpolator());

set.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

mCurrentAnimator = null;

}

@Override

public void onAnimationCancel(Animator animation) {

mCurrentAnimator = null;

}

});

set.start();

mCurrentAnimator = set;

// 点击大图时,反向缩放大图,然后隐藏大图,显示小图。

final float startScaleFinal = startScale;

expandedImageView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if (mCurrentAnimator != null) {

mCurrentAnimator.cancel();

}

AnimatorSet set = new AnimatorSet();

set.play(ObjectAnimator

.ofFloat(expandedImageView, View.X, startBounds.left))

.with(ObjectAnimator

.ofFloat(expandedImageView,

View.Y,startBounds.top))

.with(ObjectAnimator

.ofFloat(expandedImageView,

View.SCALE_X, startScaleFinal))

.with(ObjectAnimator

.ofFloat(expandedImageView,

View.SCALE_Y, startScaleFinal));

set.setDuration(mShortAnimationDuration);

set.setInterpolator(new DecelerateInterpolator());

set.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

thumbView.setAlpha(1f);

expandedImageView.setVisibility(View.GONE);

mCurrentAnimator = null;

}

@Override

public void onAnimationCancel(Animator animation) {

thumbView.setAlpha(1f);

expandedImageView.setVisibility(View.GONE);

mCurrentAnimator = null;

}

});

set.start();

mCurrentAnimator = set;

}

});

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android点击后图片变大,Android实现点击缩略图放大效果 的相关文章

  • DENOISING DIFFUSION IMPLICIT MODELS 论文笔记

    前言 生成模型现在主要分为两类 分别是GAN和Diffusion Model 但是GAN存在一个很棘手的问题就是训练不稳定 这也是Diffusion Model相比之下的优势 DDPM是基于Markovian扩散过程的模型 虽然在生成模型上
  • Java循环结构和DeBug概述

    循环结构 掌握while 循环 先判断在执行 1 循环初始化变量 2 循环条件 3 循环操作 4 循环出口 将循环条件逐渐变为不满足 例图下 do while 循环 先执行在判断 1 声明键盘录入 无论条件是否合格 都会先执行依次循环操作
  • Basic Level 1067 试密码 (20分)

    题目 当你试图登录某个系统却忘了密码时 系统一般只会允许你尝试有限多次 当超出允许次数时 账号就会被锁死 本题就请你实现这个小功能 输入格式 输入在第一行给出一个密码 长度不超过 20 的 不包含空格 Tab 回车的非空字符串 和一个正整数
  • MQTT 消息通信工具使用

    MQTT 介绍 MQTT是机器对机器 M2M 物联网 IoT 连接协议 它被设计为一个极其轻量级的发布 订阅消息传输协议 对于需要较小代码占用空间和 或网络带宽非常宝贵的远程连接非常有用 是专为受限设备和低带宽 高延迟或不可靠的网络而设计
  • Node.js的前世今生,Node.js和npm安装教程

    Node js是目前非常火热的技术 但是它的诞生经历却很奇特 众所周知 在Netscape设计出JavaScript后的短短几个月 JavaScript事实上已经是前端开发的唯一标准 后来 微软通过IE击败了Netscape后一统桌面 结果
  • SpringBoot实战(二十四)集成 LoadBalancer

    目录 一 简介 1 定义 2 取代 Ribbon 3 主要特点与功能 4 LoadBalancer 和 OpenFeign 的关系 二 使用场景一 Eureka LoadBalancer 服务A loadbalancer consumer
  • Qt 集成 FFmpeg 实现颜色格式转换

    目录 1 Qt 集成 FFmpeg 1 1 下载 FFmpeg 1 2 Qt 集成 FFmpeg 1 2 1 修改 pro 文件 1 2 2 放入 dll 文件 1 2 3 代码中使用 FFmpeg 2 图像格式转换 3 预览 4 项目地址
  • 图形学--Transformation

    为什么突然写图形学的东西了呢 当然是学校要上这门课 摊 2D Transformation scale 缩放 其中这个对角矩阵是缩放矩阵 Reflection 反转 Shear 切变 Roatate 旋转 默认绕原点旋转 逆时针 旋转 角是
  • Android 使用ViewPager创建导航页(最简单方法,不服来辩)

    要说写一个APP最先要写的是什么 那肯定是导航页了 导航页怎么实现呢 这里介绍其中一种使用方法ViewPager 好了废话不多说 一 VIewPager是什么 ViewPager继承自ViewGroup 是一个View容器 用于装载多个Vi
  • 网络编程学习笔记(基础)

    序言 这个博客有点 胡吃海喝 的味道 所写虚于所实哈 笔记记的是一个B站up主的 目录 TCP 双向的沟通 双向奔赴 gt 稳定 UDP 单向的沟通 单相思 gt 发送 网络编程的作用 网络编程的重点在于 联机 单机游戏和联机游戏的区分 网
  • R从文件中读取数据,输出文件

    看了几天的书 终于到这一步了 说实话 用R来做统计 很少有人手动的去输入那些数字 肯定是从别的地方导入的 我们用来处理就可以了 所以到这里才算是真正的入门 前面都是做基础的练手 我学习R从 R语言与统计分析 入手 第一个例子 从书上的例子
  • window消息,窗口学习笔记

    线程和窗口的关系 如上图在 点击了窗口后 int a 100 这条语句不会执行 知道把窗口关闭掉才会执行 如果把SendMessage函数改为PostMessage函数 则直接会执行到这条语句
  • java代码对比工具_代码比较工具(Diffuse)

    支持命令行提示和一个基于GUI的窗口工具包 他在命令行中的速度是相当快的 支持像 C Python Java XML 等语言的语法高亮显示 可视化比较 非常直观 支持两相比较和三相比较 这就是说 使用 Diffuse 你可以同时比较两个或三
  • ChatGPT 太贵?一键部署自己的私有大模型

    部署你的私有化对话机器人 只需要三步 克隆 github 中文版 LLaMa repo 下载 HuggingFace 13B 16K 完整模型 启动对话窗口 没错 就是这么简单 我把这份操作指南 做成了一份 Jupyter Notebook
  • 遗传算法(GA)优化BP神经网络分类预测,GA-BP分类预测,多特征输入模型。多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据集 xlsx 划分训练集和测试集 P train res 1 250 1
  • 萤火学堂视频:硬件设计-PCB原理图简要讲解

    萤火学堂 视频 硬件设计 PCB原理图简要讲解 https v youku com v show id XNDY0MTYyNDk4NA 3D 3D html
  • java 批量查询es_java操作ES的简单查询和bool查询

    导入包 org elasticsearch client transport 5 2 2 org apache logging log4j log4j api 2 7 org apache logging log4j log4j core
  • 实验七,运算符重载

    一 实验目的和要求 熟悉运算符重载的定义和使用方法 二 实验内容 1 调试下列程序 sy7 1 cpp include
  • CSDN每日一练20230310

    题目名称 一维数组的最大子数组和 题目描述 下面是一个一维数组的 最大子数组的和 的动态规划的解法 include

随机推荐

  • ffmpeg-linux系统编译so库

    windows10下安装双系统 这个流程百度一下一大把资料 1 ubuntu 18 04 3 desktop amd64 iso 驱动器 2 安装VMware Workstation Pro 3 配置linux下配置ndk环境 4 下载ff
  • Android 7.0 Camera架构源码分析1 - CameraService启动

    本系列教程主要讲解Camera从APP层到HAL层的整个流程 第一篇先讲解CameraService的启动 后面会讲解open preview takepicture的流程 Android 7 0之前CameraService是在media
  • Java中抛出的内存异常总结

    Java中抛出的内存异常总结 根据上述的总结 可以整理出来 JVM在运行的时候大致会分为五个区域 方法区 堆区 本地方法栈 虚拟机栈 程序计数器 其中程序计数器不会报出OutOfMemoryError错误 其他的都有可能会报出这个错误 St
  • 逆向百度翻译

    逆向步骤 访问首页 https fanyi baidu com 获取set cookie 第二次根据cookie 获取的首页包含token 正则匹配出来 算出sign 根据查询入参 js逆向算出sign 最终 cookie sign 和 t
  • 【魔改YOLOv5-6.x(上)】结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet

    文章目录 前言 一 Shufflenetv2 论文简介 模型概述 加入YOLOv5 二 Mobilenetv3 论文简介 模型概述 深度可分离卷积 逆残差结构 SE通道注意力 h swish激活函数 加入YOLOv5 三 Ghostnet
  • fifo读写写测试

    记录学习日常 本实验参考正点原子的实验教程 按照自己的理解来完成实验 四个模块 第一个模块是调用fifo IP核并设计类型 二 写如数据模块 三 读数据模块 四 顶层模块 ip核设置如图 二 写数据模块的输入有时钟 复位 写满 写空 输出有
  • 实战:彻底搞定 SpringBoot 整合 Kafka

    前言 kafka是一个消息队列产品 基于Topic partitions的设计 能达到非常高的消息发送处理性能 Spring创建了一个项目Spring kafka 封装了Apache 的Kafka client 用于在Spring项目里快速
  • Java初识 (数据类型)

    有人说Java是一种简单的语言 实际上没有简单的语言 只有相对简单 Java是一种面向对象的语言 学习Java 首先得了解 JDK JDK Java开发者工具 JRM Java运行环境 JVM Java虚拟机 面试题 main 函数的参数是
  • 编写shell脚本——一键启动Hadoop集群

    第一步 1 创建一个存放脚本的目录 命令 mkdir bin 注 如果不了解存放脚本目录的命名 就将目录名命名为 bin 如果 自己命名为其他可能在后面第四步的时候查找不到脚本 2 在bin目录下创建 hadoop sh 脚本 1 进入新创
  • gp基础篇-用户与资源队列管理

    author skate time 2012 11 16 gp基础篇 用户与资源队列管理 gp像oracle一样 有自己的独立的用户管理模块 但gp不像oracle那样 把用户和用户组分的那么细 gp中的用户 即是用户 又是用户组gp中的用
  • 目标检测研究现状调研

    近期在调研目标检测的研究现状 包括two stage和one stage 以及anchor based和anchor free 把用到的一些链接记录一下 方便查阅 机器之心的一篇文章 从锚点到关键点 最新的目标检测方法发展到哪了 这篇文章介
  • linux jmap命令详解,jmap命令 linux jmap如何使用

    1 linux jmap如何使用 jmap命令可以获得运行中的jvm的堆的快照 从而可以离线分析堆 以检查内存泄漏 检查一些严重影响性能的大对象的创建 检查系统中什么对象最多 各种对象所占内存的大小 命令格式 jmap options pi
  • Linux和Windows火狐浏览器书签无法同步

    前言 装了ubuntu后发现Windows下的firefox书签无法同步 而且都登陆了相同的Google账号 最终发现问题所在 firefox有个全球服务和本地服务 ubuntu下的firefox默认是全球服务的 而windows下的fir
  • 利用do while 循环和 switch 分支语句做一个简易的ATM机

    自己的写的过程体会 第一步 重要的 要检查你的电脑是否联网了 本人在写到第3步时没注意到电脑没联网 就一直在显示不了你想要的结果 本来信誓旦旦说没错啊 就是这样啊 可是就显示不了 后来才发现是网络问题 所以 网络很重要 一把泪 啊 然后呢
  • python收集数据做主神_里纲_[综漫]收集数据做主神小说无防盗章节_作者忘却的悠_新书包网(www.51aslz.com)...

    里包恩怎么了 没什么 只是在想 你做为里包恩的学生 能不能帮我个忙 帮忙 纲不好意思的抓了抓头发 所有的心思都写在了脸上 什么我这么废柴能帮什么忙 虽然我很想帮忙 但是我真的什么都做不好 找里包恩本人更快吧 实在不行还有山本和狱寺他们 不过
  • RequestMapping中produces属性作用

    注解RequestMapping中produces属性可以设置返回数据的类型以及编码 可以是json或者xml RequestMapping value xxx produces application json charset UTF 8
  • mysql如何将表导出到excel

    一 显示当前使用或者指定的database中的每个表的信息 信息包括表类型和表的最新更新时间 show table status 二 mysql如何将表结构导出到excel SELECT TABLE NAME 表名 COLUMN NAME
  • 计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

    目录 参考 定义 Mark R CNN 结构 思路 Mask R CNN训练阶段使用的Mask样例 Mask R CNN实例分割结果 Mask R CNN检测姿态 参考 论文题目 Mask R CNN 论文链接 论文下载 论文代码 Face
  • 四、在原理图中添加每个元件的封装

    画完每个元件的封装后 回到原理图界面 双击每个原理图元件 在编辑中添加封装 全部添加好右键点击原理图 选择validate pcb 那个 编译原理图文件 会自动检查错误 检查出来可以导出一个错误文档 然后根据文档修正即可 这个编译是将元件的
  • android点击后图片变大,Android实现点击缩略图放大效果

    import android animation Animator import android animation AnimatorListenerAdapter import android animation AnimatorSet