当前位置: 首页 > article >正文

【Android】图片点击放大放小

📖Android图片点击放大放小

    • ✅1.触摸缩放
    • ✅2.缩放移动中心

✅1.触摸缩放

请添加图片描述

通过触摸事件获取触摸的坐标,并将其通过动画放大缩小即可实现:
这里的holder.photo_id换成图片组件即可。

private boolean isScale=false;

holder.photo_id.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                ImageView imageView = holder.photo_id;
                float x = event.getX();
                float y = event.getY();
                float pivotX = x ;
                float pivotY = y;
                if (!isScale){
                    // 设置缩放中心
                    imageView.setPivotX(pivotX);
                    imageView.setPivotY(pivotY);
                    // 开始放大动画
                    imageView.animate()
                            .scaleX(3.5f)
                            .scaleY(3.5f)
                            .setDuration(300)
                            .start();

                    isScale=true;
                }else {
                    // 设置缩放中心
                    imageView.setPivotX(pivotX);
                    imageView.setPivotY(pivotY);
                    // 开始缩小动画
                    imageView.animate()
                            .scaleX(1f)
                            .scaleY(1f)
                            .setDuration(300)
                            .start();
                    isScale=false;
                }

                return false;
            }
        });

✅2.缩放移动中心

请添加图片描述

这种需求就是能触摸想看的地方,放大到中心位置,可以更直观的看清,主要改变的地方:

  • 通过withEndAction动画结束事件,进行几次偏移
  • 还原时将偏移量从0开始即可
private boolean isScale=false;

holder.photo_id.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                ImageView imageView = holder.photo_id;
                float x = event.getX();
                float y = event.getY();
                float pivotX = x ;
                float pivotY = y;
                if (!isScale){
                    // 设置缩放中心
                    imageView.setPivotX(pivotX);
                    imageView.setPivotY(pivotY);
                    // 开始放大动画
                    imageView.animate()
                            .scaleX(3.5f)
                            .scaleY(3.5f)
                            .setDuration(300)
                            .withEndAction(new Runnable() {
                                @Override
                                public void run() {
                                    //移动偏移量计算
                                    float x1 = x - imageView.getPaddingLeft();
                                    float y1 = y - imageView.getPaddingTop();
                                    float x2 = imageView.getWidth() / 2 - x1;
                                    float y2 = imageView.getHeight() / 2 - y1;

                                    imageView.setTranslationX(x2);
                                    imageView.setTranslationY(y2);
                                }
                            })
                            .start();

                    isScale=true;
                }else {
                    // 设置缩放中心
                    imageView.setPivotX(pivotX);
                    imageView.setPivotY(pivotY);
                    // 开始放大动画
                    imageView.animate()
                            .translationX(0) // 重置translationX
                            .translationY(0) // 重置translationY
                            .scaleX(1f)
                            .scaleY(1f)
                            .setDuration(300)
                            .start();
                    isScale=false;
                }

                return false;
            }
        });

http://www.kler.cn/news/362897.html

相关文章:

  • 类加载器介绍
  • 【AI创新】优化ChatGPT提示词Prompt设计:释放AI的无限潜能
  • 8阻塞队列
  • 记录:网鼎杯2024赛前热身WEB01
  • 蘑菇分类识别数据集(猫脸码客 第222期)
  • 【银河麒麟高级服务器操作系统-实例】集群存储文件系统异常,本地复现+详细分析+解决建议
  • 【数据结构与算法】之链表经典算法大集合
  • 2024.10.23 软考学习笔记(知识点)
  • 【1024程序员节】Mini-Omni2:实现具有视觉、语音和双工功能的开源 GPT-4o 模型
  • FPGA实现UDP通信(4)——数据接收实现
  • Hadoop 安装教程——单节点模式和分布式模式配置
  • freeswitch-esl动态控制录制音频(开始、停止)
  • 项目提测质量不高导致延期何解?
  • Rust中的Send特征:线程间安全传输所有权详解
  • shell——正则表达式入门
  • Python知识点:基于Python工具,如何使用Stellar SDK进行金融应用开发
  • Java | Leetcode Java题解之第504题七进制数
  • Godot Zelda教程练习1
  • 基于neo4j的知识图谱展示系统
  • 深度学习 之 模型部署 使用Flask和PyTorch构建图像分类Web服务
  • 使用pyqt创建一个移动的矩形
  • 关于人工智能的一些展望
  • AI冲击,AI程序员-2024程序员危机与机遇并存
  • GO基础(string相关)
  • SQL 中查找重复数据的四种方法
  • 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目