textureview 缩放_View的双指缩放以及移动

最近做项目,做到了要让视频缩放的功能,所以写了一个小DEMO,进行双指手势的操作,DEMO是使用TextView做测试,实际使用监听放在TextureView也是正常运行。

首先就是记录下触摸屏幕的手指数量,一个手指触摸的时候进行移动操作,两个手指触摸的时候进行缩放操作,大于两个手指触摸的时候将不进行操作。

缩放模式的时候主要是记录下第一次双指间距,通过ACTION_MOVE回调得到的最新双指间距,和第一次得到的双指间距对比,通过setScaleX和setScaleY进行缩放的比例改变。

而移动模式的时候需要注意到,可移动的范围不能超过View的范围。通过setPivotX和setPivotY进行放大后的移动。

代码分解如下:

1.记录触摸手指的个数(触摸数量的变化在onTouch方法),定义缩放最大和最小的比例。isCanTouch 就是在外部可以选择是否开启手势缩放。

private boolean isCanTouch = false;

private int point_num = 0;//当前触摸的点数

public static final float SCALE_MAX = 8.0f; //最大的缩放比例

private static final float SCALE_MIN = 1.0f;//最小缩放比例

2.是否开启手势缩放

public void setIsCanTouch(boolean canTouch) {

isCanTouch = canTouch;

}

3.计算两个手指之间的距离的方法。

/**

* 计算两个点的距离

*

* @param event

* @return

*/

private double spacing(MotionEvent event) {

if (event.getPointerCount() == 2) {

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

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

return Math.sqrt(x * x + y * y);

} else {

return 0;

}

}

4.使用setScaleX和setScaleY进行缩放的比例改变。

5.使用setPivotX和setPivotY进行放大后的移动。

onTouch方法如下:

@Override

public boolean onTouch(View v, MotionEvent event) {

if (!isCanTouch) {

return false;

}

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

case MotionEvent.ACTION_DOWN:

point_num = 1;

downX = event.getX();

downY = event.getY();

break;

case MotionEvent.ACTION_UP:

point_num = 0;

downX = 0;

downY = 0;

break;

case MotionEvent.ACTION_MOVE:

if (point_num == 1) {

//只有一个手指的时候才有移动的操作

float lessX = (float) (downX - event.getX());

float lessY = (float) (downY - event.getY());

moveX = event.getX();

moveY = event.getY();

moveRawX = event.getRawX();

moveRawY = event.getRawY();

setSelfPivot(lessX, lessY);

//setPivot(getPivotX() + lessX, getPivotY() + lessY);

} else if (point_num == 2) {

//只有2个手指的时候才有放大缩小的操作

moveDist = spacing(event);

double space = moveDist - oldDist;

float scale = (float) (getScaleX() + space / getWidth());

if (scale > SCALE_MIN && scale < SCALE_MAX) {

setScale(scale);

} else if (scale < SCALE_MIN) {

setScale(SCALE_MIN);

}

}

break;

case MotionEvent.ACTION_POINTER_DOWN:

oldDist = spacing(event);//两点按下时的距离

point_num += 1;

break;

case MotionEvent.ACTION_POINTER_UP:

point_num -= 1;

break;

}

return true;

}

6.移动的方法,设置了边界值,不让View移动到View的范围外。

/**

* 触摸使用的移动事件

*

* @param lessX

* @param lessY

*/

private void setSelfPivot(float lessX, float lessY) {

float setPivotX = 0;

float setPivotY = 0;

setPivotX = getPivotX() + lessX;

setPivotY = getPivotY() + lessY;

Log.e("lawwingLog", "setPivotX:" + setPivotX + " setPivotY:" + setPivotY

+ " getWidth:" + getWidth() + " getHeight:" + getHeight());

if (setPivotX < 0 && setPivotY < 0) {

setPivotX = 0;

setPivotY = 0;

} else if (setPivotX > 0 && setPivotY < 0) {

setPivotY = 0;

if (setPivotX > getWidth()) {

setPivotX = getWidth();

}

} else if (setPivotX < 0 && setPivotY > 0) {

setPivotX = 0;

if (setPivotY > getHeight()) {

setPivotY = getHeight();

}

} else {

if (setPivotX > getWidth()) {

setPivotX = getWidth();

}

if (setPivotY > getHeight()) {

setPivotY = getHeight();

}

}

setPivot(setPivotX, setPivotY);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tdd java_Java TDD简介–第1部分

tdd java欢迎来到测试驱动开发 &#xff08;TDD&#xff09;系列的介绍。 我们将在TDD上下文中讨论Java和JUnit &#xff0c;但这只是工具。 本文的主要目的是使您全面了解TDD&#xff0c;而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD&#xff0c;那么您要么是…

C++最佳实践 | 代码风格

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格&#xff08;本文&#xff09;3. 安全性4. 可维护性5. 可移植性及多线程6. 性能7. 正确性和脚本代码风格代码风格最…

使用map的find头文件_C++ map用法

C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。在一些程序中建立一个 map 可以起到事半功倍的效果&am…

lucene 查询示例_高级Lucene查询示例

lucene 查询示例本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…

okhttp 连接池_okhttp 源码分析

https://square.github.io/okhttp/​square.github.iosquare/okhttp​github.com0 概述okhttp是一个现代的网络请求框架Http/2 支持 所有访问同一个主机的Request都共用一个socketconnection pool 连接池 减少请求延迟GZIP 压缩数据&#xff0c;减少传输所用的带宽Response Cac…

程序员日均写7行代码被开除,公司:正常员工每天200行

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删根据前不久CSDN发布的《2021-2022中国开发者调查报告》显示&#xff0c;大部分程序员平均每天会写200行左右的代码。那么代码的数量能衡量一个程…

抽象工厂和工厂方法示例_工厂方法设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…

rust废铁最快_Rust初体验,它确实有点快

写了多年的Java&#xff0c;某天机缘巧合之下听说了一门语言叫Rust&#xff0c;Rust的亲爹是Mozilla&#xff0c;如果要和其它语言拼爹的话&#xff0c;实力应该还是可以的。官方介绍如下&#xff1a;Rust is blazingly fast and memory-efficient: with no runtime or garbage…

jax-ws和jax-rs_JAX-RS和JSON-P集成

jax-ws和jax-rs这篇简短的文章讨论了JAX-RS 2.0中对JSON-P的支持 JSON-P…&#xff1f; JSON处理API &#xff08;JSON-P&#xff09;是Java EE 7中引入的。 它提供了用于处理JSON数据的标准API&#xff0c;并且与XML对应的JAXP非常相似。 JSON-B &#xff08;JSON绑定&#x…

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删技巧 1&#xff1a;不要使用“GOTO”语句二十几年前&#xff0c;当计算机编程尚处于起步阶段时&#xff0c;程序流程是由“GOTO”语句来控制。该…

flyway版本号_Flyway版本化管理数据库脚本

假如我们有一个叫shiny的项目&#xff0c;它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的;简单结构图如下&#xff1a;image.png但是很多时候&#xff0c;现实开发团队是这样的&#xff1a;image.png我们的项目shiny项目的运行环境是有多套的&#xff0c;我们擅长解决…

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里&#xff0c;我一直在探索Netflix Hystrix库&#xff0c;并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容&#xff1a; Hystrix是一个延迟和容错库&#xff0c;旨在隔离对远程系统&#xff0c;服务和第三方库的访问点&#xff0c…

89 个嵌入式相关概念,你懂几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删01操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内…

python源码笔记_python源码学习笔记(二)

(二) python 继承和多态这非常类似C的功能&#xff0c;只不过是是在C基础上开发的。由上一节知&#xff0c;python的所有对象的基础都是PyObject&#xff0c;所以例如创建一个PyIntObject对象&#xff0c;是通过PyObejct*变量来维护&#xff0c;所以在python内部各个函数之间传…

linux 延时一微秒_让我们暂停一微秒

linux 延时一微秒低延迟Java应用程序中的许多基准测试涉及必须在一定负载下测量系统。 这就要求保持事件进入系统的稳定吞吐量&#xff0c;而不是在没有任何控制的情况下以全油门将事件泵入系统。 我经常要做的任务之一是在事件之间将生产者线程暂停一小段时间。 通常&#xf…

C语言不是最好的,却是我最爱的~

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删以下为译文&#xff1a;虽然 C 语言并不是我所学的第一门语言&#xff0c;也不是我的最后一门语言&#xff0c;但是我仍然非常喜欢 C&#xff0c…

vue 传递多行数据_vue父组件向子组件传递多个数据的实例

在平时我们使用VUE组件的时候&#xff0c;经常需要将父组件的某些数据传递给子组件&#xff0c;这个时候&#xff0c;我们通常会有很多的办法&#xff0c;这里主要分为两种情况&#xff1a;第一种&#xff1a;静态数据传递&#xff1a;传递一个 字符串第二种&#xff1a;动态数…

lucene 源码分析_Lucene分析过程指南

lucene 源码分析本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…

ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2

1. 长数据是什么鬼&#xff1f;之前介绍了如何将多个性状的箱线图放在一个图上&#xff0c;比如learnasreml包中的fm数据&#xff0c;它有h1~h5五年的株高数据&#xff0c;想对它进行作图。「数据预览&#xff1a;」> library(learnasreml)> data(fm)> head(fm) Tree…

面向对象,C语言实现简单工厂模式,思路+代码

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、简介简单工厂方法定义一个用于创建对象的类&#xff0c;该类接受一个参数&#xff0c;通过参数决定创建不同的对象。GOF并没有把简单工厂方法…