安卓用手指触碰屏幕缩放和移动,三指触碰屏幕旋转图片

Android手指移动动画效果实现与实战 Android 提供了多种动画机制来实现界面动态效果,其中最常用的两种动画类型是视图动画(View Animation)属性动画(Property Animation)。在现代Android开发中,第方动画库已成为提升UI体验的重要工具。这些库通常基于矢量图形、JSON动画资源或对低版本系统的兼容性优化,提供了比原生动画更灵活、更高效的动画实现方式。通过引入 Lottie NineOldAndroids 等第方动画库,开发者可以实现比原生动画更丰富、更灵活的动画效果。 阅读详情

原文链接

package com.multitouch.example;

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MultiTouch extends Activity implements OnTouchListener {

    // these matrices will be used to move and zoom image
    private Matrix matrix = new Matrix();
    private Matrix savedMatrix = new Matrix();
    // we can be in one of these 3 states
    private static final int NONE = 0;
    private static final int DRAG = 1;
    private static final int ZOOM = 2;
    private int mode = NONE;
    // remember some things for zooming
    private PointF start = new PointF();
    private PointF mid = new PointF();
    private float oldDist = 1f;
    private float d = 0f;
    private float newRot = 0f;
    private float[] lastEvent = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView view = (ImageView) findViewById(R.id.imageView);
        view.setOnTouchListener(this);
    }

    public boolean onTouch(View v, MotionEvent event) {
        // handle touch events here
        ImageView view = (ImageView) v;
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist = spacing(event);
                if (oldDist > 10f) {
                    savedMatrix.set(matrix);
                    midPoint(mid, event);
                    mode = ZOOM;
                }
                lastEvent = new float[4];
                lastEvent[0] = event.getX(0);
                lastEvent[1] = event.getX(1);
                lastEvent[2] = event.getY(0);
                lastEvent[3] = event.getY(1);
                d = rotation(event);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    matrix.set(savedMatrix);
                    float dx = event.getX() - start.x;
                    float dy = event.getY() - start.y;
                    matrix.postTranslate(dx, dy);
                } else if (mode == ZOOM) {
                    float newDist = spacing(event);
                    if (newDist > 10f) {
                        matrix.set(savedMatrix);
                        float scale = (newDist / oldDist);
                        matrix.postScale(scale, scale, mid.x, mid.y);
                    }
                    if (lastEvent != null && event.getPointerCount() == 3) {
                        newRot = rotation(event);
                        float r = newRot - d;
                        float[] values = new float[9];
                        matrix.getValues(values);
                        float tx = values[2];
                        float ty = values[5];
                        float sx = values[0];
                        float xc = (view.getWidth() / 2) * sx;
                        float yc = (view.getHeight() / 2) * sx;
                        matrix.postRotate(r, tx + xc, ty + yc);
                    }
                }
                break;
        }

        view.setImageMatrix(matrix);
        return true;
    }

    /**
     * Determine the space between the first two fingers
     */
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return FloatMath.sqrt(x * x + y * y);
    }

    /**
     * Calculate the mid point of the first two fingers
     */
    private void midPoint(PointF point, MotionEvent event) {
        float x = event.getX(0) + event.getX(1);
        float y = event.getY(0) + event.getY(1);
        point.set(x / 2, y / 2);
    }

    /**
     * Calculate the degree to be rotated by.
     *
     * @param event
     * @return Degrees
     */
    private float rotation(MotionEvent event) {
        double delta_x = (event.getX(0) - event.getX(1));
        double delta_y = (event.getY(0) - event.getY(1));
        double radians = Math.atan2(delta_y, delta_x);
        return (float) Math.toDegrees(radians);
    }
}

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/butterfly"
android:scaleType="matrix" /> //设置这个属性很关键

</FrameLayout>


Android手势控制实战:实现图像旋转、平移与缩放 简介:在Android开发中,手势交互是提升用户体验的关键功能之一。本文介绍如何通过自定义View——TouchImageView,扩展原生ImageView以支持图像的手势操作,包括双缩放、拖拽平移旋转。基于MotionEvent、ScaleGestureDetectorGestureDetector等核心类,结合Matrix变换机制,实现流畅的多点触控效果,并提供完整的实现逻辑与优化建议,适用于图像浏览、地图操作等应用场景。 阅读详情

相关推荐

Android屏幕画笔应用开发

移动应用开发中,触摸事件处理是与用户交互的基础,它涉及监听响应用户的触摸动作,如点击、滑动等。触摸事件允许开发者捕捉用户的直接操作,并将这些动作转化为应用中的动作响应,从而提供更加直观、流畅的用户体验。

weixin_35756130的博客 773

Android实现图片手指旋转功能

主要为大家详细介绍了Android实现图片手指旋转功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

高仿微信截图功能Android实战项目

Android 的输入事件处理机制是一个高度模块化且层次分明的系统架构,其核心目标是在保证响应效率的同时,提供灵活的事件拦截与消费控制能力。整个流程始于用户的物理触碰屏幕行为,由硬件驱动采集原始数据并封装为对象,随后经由系统服务(如 InputManagerService)转发至对应的应用进程,在 View 层级树中逐级传递,最终被某个视图组件消费或忽略。这一过程不仅涉及跨进程通信(IPC),还包括复杂的优先级判断与事件重定向逻辑,构成了 Android UI 交互的基础骨架。

weixin_42465332的博客 384

一款非常实用的屏幕缩放软件

在教学中,实用投影仪时,电脑屏幕上的字比较小,很不利于教学,有了这款软件你就可以随意缩放屏幕,让教学变得越来越简单。

Android修改屏幕缩放比例

Android开发中,想要自己设置系统默认的屏幕缩放比列 在原生的setting中,Accessibility > DisPlay Size,可以设置屏幕缩放 个人思路是改变进度条的值,先跟着这个流程走一遍 1、首先找到这个界面对应的代码文件 packages\apps\Settings\src\com\android\settings\PreviewSeekBarPreferenceFragment.java 找到进度条拖动时的对应代码: @Override pub

curly_x的博客 6481

android屏幕缩放比例,Android屏幕适配之--自定义像素的缩放比例来实现屏幕适配...

Android屏幕适配之--自定义像素的缩放比例来实现屏幕适配在Android的适配中,可以采用自定义布局的形式,来通过计算像素的缩放比例来实现适配。大致思路就是,通过拿到设备实际的长宽像素值来除以参考设备的长宽值,得到这一个比例值,在设置控件的长宽值得时候,拿到开发者定的长宽值乘以这个比例值,就能得到控件的实际显示大小了,公式大致如下:scaleX = 设备实际像素值 / 参考设计图的像素值控...

weixin_34198817的博客 954

【Android M】平台方实现左右滑动任何应用界面截屏

MultiGestureMonitor类为多手势检测的关键类,具体支持几个手指截屏,由常亮"SUPPORT_FINGER_COUNTS"控制,此处为3,即截屏 A,MULTI_FINGER_SCREEN_SHOT_ENABLED = "multi_finger_screen_shot_enabled" 为截屏的控制开关 B,满足滑动手势后调用notifyScreenshotGestureCompleted()方法发送Action到PhoneWindowManager类,调用takeScre

好久不见 4743

android 屏幕的放大缩小实现

                       ios中UIScrollView能很好的实现放大缩小功能,在anroid这里,scrollview并不能很好的支持放大缩小,而对于简单的图片放大,缩小,android可以使用ZoomControls控件来实现一些简单图片放大缩小,移动,,,,当然,直接使用webview来加载图片也是能很好实现图片放大缩小功能的。                    ...

lxl403853563的博客 9619

android 监听两缩放,Android两根手指放大/缩小不起作用

我找到了这个How to enable the (two finger) zoom in/out feature for an image in android在日志中,我看到它正在运行,但是图像没有改变,我在做什么错?这是我的XMLxmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"an...

weixin_34113453的博客 648

自动旋屏的测试工具

本工具可以每5秒自动旋转一次屏幕,并打印当前可用的内存。 使用 logcat | grep availMem & 来测试旋转屏幕发生的情况, 只有重启才会停止测试。 下载地址见http://www.bangchui.org/read.php?tid=21026&page

码夫的专栏 2372

Android实现图片随着手指触摸屏移动(附带源码)

Android实现图片随着手指触摸屏移动(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1160

安卓实现照片缩放[不旋转]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:conte

AIOT魔法师 173

html5封装图片,html5手势操作与多操作封装与Canvas图片裁切实战

当前情况,移动端的开发占比越来越高,单的拖拽触碰操作是常规需要。特殊的多操作与手势操作还需另做处理,而且还涉及到兼容性问题。//屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件,安卓不存在需要另外封装//gesturestart 多操作触发时//gesturechange 两根手指发生变化时//gestureend 两根手指全部抬起时* 首先是手势操作的参数说明ini...

weixin_39732249的博客 180

android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果

           首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.)                             搜狐客户端                                    百度新闻客户端                              新浪微博      

yuanyuan_186的专栏 1003

html5手势操作与多操作封装与Canvas图片裁切实战

当前情况,移动端的开发占比越来越高,单的拖拽触碰操作是常规需要。特殊的多操作与手势操作还需另做处理,而且还涉及到兼容性问题。 // 屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件,安卓不存在需要另外封装 // gesturestart 多操作触发时 // gesturechange 两根手指发生变化时 // gestureend 两根手指全部抬起时 ...

weixin_30821731的博客 401

移动Web资源整理

http://www.cocoachina.com/webapp/20150617/12070.html 本人于2013年底接触移动端,简单做下总结,首先了解下移动Web带来的问题: 设备更新换代快:低端机遗留下问题、高端机带来新挑战 浏览器厂商不统一:兼容问题多 网络更复杂:弱网络,页面打开慢 低端机性能差:页面操作卡顿 HTML5新技术...

weixin_30312557的博客 313

实现个人信息界面动态下拉图片视图

在Android应用中,动画资源通常存储在res/anim目录下。定义动画资源的方式主要有两种:XML代码。XML是定义动画资源的首选方法,因为它易于阅读、编辑复用。补间动画通常在XML文件中定义其属性,例如:<translate</set>此XML文件定义了一个从左至右的水平平移动画,从起始位置平移到100%的位置。

weixin_36464343的博客 338

Android手势ImageView之(自定义GestureDetector)

前言:本来是打算周末把手势ImageView篇的内容给做掉的,结果又是昏睡了两天,唉唉~~看来以后还是不能这样了,先不说废话了,进入我们今天的主题吧。先贴上前面内容的地址: Android手势ImageView部曲(一) Android手势ImageView部曲(二) Android手势ImageView部曲() 前面我们讲到了ScaleGestureDetector这个工具类,我在疑惑

vv_bug 3179
上一篇: 解决 out of memory 的方法
下一篇: popupmenu and menu
濯君
博客等级 码龄11年 148粉丝 195原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值