Android拖动和缩放

时间:2022-08-25 23:01:57

拖拽和缩放

多点触控的理论学完了之后,这里开始实践。本节主要介绍使用onTouchEvent()方法处理触控事件。

拖动一个对象

如果你使用的是Android 3.0或者之后的系统,那么你可以使用内置的拖拽实践监听器`View.OnDragListener`。

用touch手势把一个对象从屏幕的一边拽到另一边是很常见的一种用法。以下代码展示了如何拖拽一个

屏幕上的图片。但是主要一下内容:

  • 在一个拖动(或者叫做scroll)操作里,app需要知道开始触控点,不管有几根指头放在屏幕上

    只需要记住第一根指头的点。但是,在拖动图片的过程中,用户有放上了好几个手指,然后把第一个触控的

    手指拿开了屏幕。如果你的app只记录单个手指的触控操作,那么就需要把第二个手指的触控点作为默认触控点

    并把图片移动到该位置。

  • 为了防止上面的情况发生,你的app需要区分初始触控点和其他的触控点。要记录初始触控点以外的触控点,就需要用到

    前文所说的ACTION_POINTER_DOWNACTION_POINTER_UP事件。ACTION_POINTER_DOWNACTION_POINTER_UP

    可以在onTouchEvent()回调中取得。

  • ACTION_POINTER_UP发生的时候,下面的示例代码可以获取到index,并确保触控ID指向的触控事件是有效的。如果

    触控点已经无效,则获取一个有效的,并获取其X和Y坐标。这个坐标是在ACTION_MOVE事件中获取,图片将被移动到该位置。

以下代码会记录起始触控点的位置,追踪手指移动的新位置,并把图片移动到该位置。并按照上面描述的方法处理可能的异常情况。

注意以下代码用了getActionMasked()方法。为了保证兼容可以使MotionEventCompat.getActionMasked()来获取触控的MotionEvent

补充说明,为了不让读者态度困惑。所以没有使用Google的示例代码。原来的示例代码并没有突出在Activity中拖动一个View的功能。而是主要在一个View内部如何相应拖动和缩放功能。这和前文所述的主题有一定的不符合,所以笔者做了下面的修改。如有不妥请指出。

override fun onTouchEvent(event: MotionEvent?): Boolean {
var action = MotionEventCompat.getActionMasked(event) when (action) {
MotionEvent.ACTION_DOWN -> {
val pointerIndex = MotionEventCompat.getActionIndex(event!!)
val x = MotionEventCompat.getX(event!!, pointerIndex)
val y = MotionEventCompat.getY(event!!, pointerIndex) mLastTouchX = x
mLastTouchY = y mActivePointerId = MotionEventCompat.getPointerId(event, 0)
}
MotionEvent.ACTION_MOVE -> {
val pointerIndex = MotionEventCompat.findPointerIndex(event!!, mActivePointerId)
val x = MotionEventCompat.getX(event!!, pointerIndex)
val y = MotionEventCompat.getY(event!!, pointerIndex) val dx = x - mLastTouchX!!
val dy = y - mLastTouchY!! mPosX = mPosX ?: 0.0f + dx
mPosY = mPosY ?: 0.0f + dy // mImageView?.x = mPosX!!
// mImageView?.y = mPosY!!
mImageView?.x = x
mImageView?.y = y Log.d("##DRAG", "Pointer x- $x | y- $y")
Log.d("##DRAG", "View x- ${mImageView?.x} y- ${mImageView?.y}") mLastTouchX = x
mLastTouchY = y }
MotionEvent.ACTION_UP -> {
mActivePointerId = INVALID_POINTER_ID
}
MotionEvent.ACTION_CANCEL -> {
mActivePointerId = INVALID_POINTER_ID
}
MotionEvent.ACTION_POINTER_UP -> {
val pointerIndex = MotionEventCompat.getActionIndex(event!!)
val pointerId = MotionEventCompat.getPointerId(event!!, pointerIndex) if (pointerId == mActivePointerId) {
val newPointerIndex = if (pointerIndex == 0) 1 else 0
mLastTouchX = MotionEventCompat.getX(event!!, newPointerIndex)
mLastTouchY = MotionEventCompat.getY(event!!, newPointerIndex)
mActivePointerId = MotionEventCompat.getPointerId(event!!, newPointerIndex)
}
}
} return true
}

总结以下上述内容:

  1. 触控ID(pointer Id)可以唯一制定一个触控事件
  2. index对应的触控事件可能发生改变。但是,只有通过触控的index可以获得触控的坐标。

所以,使用的时候先在ACTION_DOWN里得到触控index,再用触控index获得触控Id存起来。之后每次在ACTION_MOVE事件中,

用触控Id得到触控index,再用这个index得到触控的坐标。

在ACTION_UP、ACTION_CANCEL事件里把触控Id设置为空(或者无效)。在ACTION_POINTER_UP里把作废的触控Id置换为有效的触控Id。

这个是关于触控的坐标的。在默认的Activity里实现这个拖拽的功能,你会发现这个图片在拖动的一瞬间图片会下移一定的距离。

由于图片的大小设定为50dp,下移的距离和这个距离非常接近。在设定为全屏的时候,下移不会再发生。说明触控点的坐标是基于全屏的,

但是ImageView定位的坐标是基于当前的ViewGroup的。这一点也非常重要,如果你需要保留ActionBar的话,坐标数据需要从全屏转化为当前

ImageView所在的ViewGroup的。

to be continued...

Android拖动和缩放的更多相关文章

  1. Android拖动和缩放图片

    Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中 ...

  2. ion-scroll zooming="true" android端无法缩放的问题

    很久很久没更新博客了,从今天开始决定以后陆续写一些博文,总结下自己在开发中碰到的问题. ionic项目.ion-scroll zooming="true" 在android端无法缩 ...

  3. touch.js 拖动、缩放、旋转 (鼠标手势)

    可以实现手势操作:拖动.缩放.旋转.封装好的脚本方法是这样的: var cat = window.cat || {}; cat.touchjs = { left: 0, top: 0, scaleVa ...

  4. 在WPF中的Canvas上实现控件的拖动、缩放

    如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个*:) 造*前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...

  5. svg图片拖动与缩放

    引入jquery.js文件,svg-pan-zoom.min.js文件 和 hammer.min.js 文件 这三个文件可以在网上搜一下下载 //svg拖动和缩放 initPanZoom() { th ...

  6. android图片的缩放、圆角处理

    android中图片缩放方法有三种:1,bitmapFactory:2,bitmap+metrix:3,thumbUtil 方法一:bitmapFactory: public static Bitma ...

  7. 使用Android的硬件缩放技术优化执行效率

    Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.xuanyusong.com/archives/3205 Android中GLSurfaceView在横竖屏切 ...

  8. Android Developers:拖动和缩放

    这个课程描述了如何使用手势来拖拽和缩放屏幕的对象,使用onTouchEvent()方法来获取触摸事件.这里是这节课程使用的源代码. 拖动一个对象 ——————————————————————————— ...

  9. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

随机推荐

  1. 布局文件中fill_parent、match_parent和wrap_content有什么区别?

    fill_parent 宽度或者高度 布满整个屏幕从Android 2.2开始fill_parent改名为match_parent.wrap_content布局元素将根据内容更改大小.

  2. CAS分析——Core

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. 最大流量dinci模板

    我们知道.增广路径EK时间是在充电算法的O(n*m^2).找到最短增广路径的时间复杂度为O(m*n^2).这样的时间复杂度主要是寻找扩充道路. 这里也有一个演示Dinci算法,使用BFS层次结构图,然 ...

  4. cpp(第十一章)

    1. std::istream & operator>>(std::istream &is,complex_c &t) { std::cout<<&qu ...

  5. node&period;js的安装的配置

    一.Node.js 安装配置 Node.js 提供在Windows和Linux上安装 1.  Window 上安装Node.js 64 位安装包下载地址 : https://nodejs.org/di ...

  6. 微信 登录 Scope 参数错误或没有 Scope 权限

    //电脑端 扫码授权登录 public static string AuthUrl = "https://open.weixin.qq.com/connect/qrconnect?appid ...

  7. 爬虫案例之Pubmed数据库下载

    代码 # encoding=utf-8 import os, time, re import urllib.request import urllib.parse import ssl ssl._cr ...

  8. 关于如何在电脑上安装adb来操作手机&lpar;Android&rpar;的方法及步骤

    1.需要真实的安卓手机: 2.安卓手机需要开启USB调试模式,允许电脑进行调试(各个手机的开启方式可能不同,不知道的自行百度): 3.电脑需要安装ADB驱动,这里提供一个下载地址:https://ad ...

  9. 树莓GPIO &amp&semi;&amp&semi;python

      from http://www.cnblogs.com/xiaobo-Linux/p/8969324.html 命令行控制LED灯  echo 12 > /sys/class/gpio/ex ...

  10. nginx location 匹配的规则

    nginx 的配置文件中, server里面的location 的配置项的理解: server { listen 24010; client_max_body_size 30M; location = ...