Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

 

在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作,记录两根手指的中心点位置,根据ScaleGestureDetector检测到的缩放因子(系数),放大原图,并移动放大前两根手指中心点在原图的位置移动到放大后区域。

 

class MyImageView : AppCompatImageView {private var mCenterX = 0fprivate var mCenterY = 0fprivate val mCirclePaint = Paint()private var mSrcBmp: Bitmap? = nullprivate var mScaleBmp: Bitmap? = nullprivate var testIV: ImageView? = null//放大系数。private var mScaleFactor = 1fprivate var mScaleGestureDetector: ScaleGestureDetector? = nullprivate var mCanDrawScaleBmp = falseprivate var mCanDrawCircle = falseconstructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {mSrcBmp = (drawable as BitmapDrawable).bitmap //mSrcBmp是原始图大小,没有缩放和拉伸的。mCirclePaint.style = Paint.Style.STROKEmCirclePaint.strokeWidth = 10fmCirclePaint.isAntiAlias = truemCirclePaint.color = Color.REDmScaleGestureDetector = ScaleGestureDetector(ctx, object : ScaleGestureDetector.SimpleOnScaleGestureListener() {override fun onScaleEnd(detector: ScaleGestureDetector) {super.onScaleEnd(detector)if (detector.currentSpan > 50 && detector.timeDelta > 10) {mScaleFactor = detector.scaleFactor}}override fun onScale(detector: ScaleGestureDetector): Boolean {//更新两个手指缩放的中心点。mCenterX = detector.focusXmCenterY = detector.focusYreturn super.onScale(detector)}})}fun setTestImageView(iv: ImageView?) {testIV = iv}private fun updateView() {this.invalidate()}override fun onTouchEvent(event: MotionEvent): Boolean {when (event.actionMasked) {MotionEvent.ACTION_MOVE -> {mScaleGestureDetector?.onTouchEvent(event)mCanDrawCircle = true}MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {mCanDrawScaleBmp = true //两个手指松开了,可以绘制放大的图。mCanDrawCircle = false}}updateView()return true}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)if (mCanDrawCircle) {canvas.drawCircle(mCenterX, mCenterY, 10f, mCirclePaint)}if (mCanDrawScaleBmp) {myDraw(canvas)}}private fun myDraw(canvas: Canvas) {Thread.sleep(1500)if (mScaleBmp == null) {//创建一次,避免重复创建,提高速度。mScaleBmp = Bitmap.createScaledBitmap(mSrcBmp!!,(this.width * mScaleFactor + 1).toInt(), //注意这里的精度损失,会造成坐标偏移.(this.height * mScaleFactor + 1).toInt(),//注意这里的精度损失,会造成坐标偏移.true)}val cx = this.width / 2fval cy = this.height / 2fval matrix = Matrix()matrix.setScale(mScaleFactor, mScaleFactor)matrix.setTranslate(cx - mCenterX * mScaleFactor, cy - mCenterY * mScaleFactor)canvas.drawBitmap(mScaleBmp!!, matrix, null)//中心圆圈canvas.drawCircle(cx, cy, 40f, mCirclePaint)}
}

 

 

两根手指在原图上缩放,红色小圆圈实时处于两根手指的中心点:

5c5b88a3bb2144bba15e5bc451a242a8.png

 

cdd57a98a3c84e46bed9d2b91c1baeb8.png

 

 

 

当两根手指离开屏幕后,然后放大原图,并把原先手指中心点“点中”的原图位置,移动到屏幕中心:

b1c387a14e8e4c3eae1ac5df7d164ef0.png

 

 

Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客文章浏览阅读663次,点赞14次,收藏17次。需要注意的,因为在xml布局里面特别设置了ImageView的高度为wrap_content,手指在屏幕触点的位置是放大镜里面放大图片后准确圆心位置,但是,如果ImageView设置成match_parent,则因为ImageView里面的Bitmap被缩放(此处Bitmap其实小于ImageView,被拉伸了),拉伸后的Bitmap水平方向坐标与ImageView一直重合,但竖直方向,Bitmap坐标与ImageView不一致,会造成一种现象,手指触点放大镜放大后,水平方向是正确的,但竖直方向有偏移量。https://blog.csdn.net/zhangphil/article/details/135630975

 

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

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

相关文章

Dubbo源码解析第一期:如何使用Netty4构建RPC

一、背景 早期学习和使用Dubbo的时候(那时候Dubbo还没成为Apache顶级项目),写过一些源码解读,但随着Dubbo发生了翻天覆地的变化,那些文章早已过时,所以现在计划针对最新的Apache Dubbo源码来进行“阅读理解…

插件化/热修复

1、如何规避Android P对私有API的访问限制 ● Android:Pie — 9.0 — 28 ● 一般都是通过反射访问私有 API 1.1、私有API Android源码查看网址 (1)hide public hide public方法无法直接使用,可以自行编译系统源码&#xff0c…

【Visual Object Tracking】Learning notes

Dense Optical Tracking: Connecting the Dots 参考学习来自: 单目标跟踪 Siamese系列网络:SiamFC、SiamRPN、one-shot跟踪、one-shotting单样本学习、DaSiamRPN、SiamRPN、SiamMask 单目标跟踪:跟踪效果 / 单目标跟踪:数据集处…

Python入门(一)

anaconda安装 官网:https://www.anaconda.com下载 jupyter lab 简介: 包含了Jupyter Notebook所有功能。 JupyterLab作为一种基于web的集成开发环境,你可以使用它编写notebook,操作终端,编辑markdown文本&#xf…

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

揭秘安全测试--一起学习吧之安全测试

笔者最近又有个迭代要上线了~正处于安全测试阶段&#xff0c;今天想和大家一起谈谈安全测试相关的知识。 安全测试是指对应用程序存在的安全问题进行测试&#xff0c;目的是防止意外或者恶意对应用程序进行攻击。安全测试分为安全功能测试和安全渗透测试&#xff0c;其中安全功…

Qt 多次绘图

使用Qt 的时候发现&#xff1a; 背景&#xff1a;自己定义一个类&#xff0c;把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程&#xff09;问题&#xff1a;当鼠标在窗口内单击的时候会触发2次绘图。&#xff1f;难道不应该是一次吗&#xff1f; 于是开始了如下的测试…

STM32 freertos 使用软件模拟串口uart

如题&#xff0c;为什么要这样做&#xff1f; 最近做的一个项目上使用了74HC595作为指示灯板使用&#xff1b; 这个灯板与驱动板是通过排线连接&#xff0c;排线约25cm长&#xff1b; 在实验室测试一切正常&#xff0c;发到客户手上使用就出现了某个LED跳动情况&#xff1b;…

【6】密评中对服务端采用“挑战-响应”机制进行身份鉴别的验证

对服务端采用“挑战-响应”机制进行身份鉴别的验证 1、提取出服务端的签名值 签名值&#xff08;hex&#xff09;&#xff1a; 3045022100e4795b5a947526f8e7cbd0edd571ea8749e0efd24323799346ea2c740c006c5a0220026189e51c19d20d40a82606d0ed72cb9530a189bbb94c09e4559d7d8f…

人工智能 | 自然语言处理的发展历程

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 自然语言处理的发展 方向一&#xff1a;技术进步1. 基于规则的语法&#xff08;1950-1990&#xff09;2. 统计语言处理&#xff08;1990-2010&#xff09;3. 基于深度学…

QSqlQuery 执行Update 判断执行成功与否

1.执行更新操作的SQL语句 update s_info set name"009" where contact_number "13511112222" 怎么样判断是否确实更新操作是执行成功的 &#xff0c;可以通过下列语句判断 query.numRowsAffected() > 0 2.主要的几步操作如下: QSqlQuery query;query.…

亿发中小型企业erp软件智能化赋能,专业助力广东制造行业生产流程管理

在当前经济全球化的环境下&#xff0c;广东省的中小型制造业企业正面临多方面的严峻挑战。包括产品质量的维护、分销渠道的稳定、生产成本降低以及减轻生产过程中的资源消耗等难题。目前&#xff0c;随着信息技术的迅速发展&#xff0c;一些先进的IT工具&#xff0c;比如企业资…