绘制K线第五章:双指放大缩小

双指缩放逻辑

概述

双指缩放功能允许用户通过双指手势放大或缩小K线图,改变K线的显示宽度,从而查看更多或更少的数据。

使用的API

1. ScaleGestureDetector

作用:Android系统提供的手势检测器,用于检测双指缩放手势。

关键API

  • ScaleGestureDetector(context, listener) - 创建手势检测器
  • onTouchEvent(event) - 处理触摸事件
  • detector.scaleFactor - 获取缩放因子(>1放大,<1缩小)

实现代码

kotlin 复制代码
// 创建缩放手势检测器
private val scaleGestureDetector: ScaleGestureDetector by lazy {
    ScaleGestureDetector(context, this)
}

// 实现接口
class ScrollableAndScalableKLineView : View, ScaleGestureDetector.OnScaleGestureListener {
    // 实现三个回调方法
    override fun onScaleBegin(detector: ScaleGestureDetector): Boolean
    override fun onScale(detector: ScaleGestureDetector): Boolean
    override fun onScaleEnd(detector: ScaleGestureDetector)
}
2. MotionEvent

作用:检测触摸点数量,区分单指和多指操作。

关键API

  • event.pointerCount - 获取触摸点数量
  • event.actionMasked - 获取触摸事件类型

核心概念

缩放比例 klineScaleX
  • 作用:控制K线宽度的缩放倍数
  • 范围:0.5 ~ 2.0(可配置)
  • 默认值:1.0(不缩放)
  • 影响 :缩放后,每根K线的宽度 = 原始宽度 × klineScaleX
缩放后的K线宽度
kotlin 复制代码
// 缩放后的总宽度(包括K线宽度和间距)
private fun getScaledTotalCandleWidth(): Float {
    return config.getTotalCandleWidth() * klineScaleX
}

缩放实现原理

1. 手势检测

使用 ScaleGestureDetector 检测双指缩放手势,通过 onScale() 回调累积缩放因子:

kotlin 复制代码
override fun onScale(detector: ScaleGestureDetector): Boolean {
    klineScaleX *= detector.scaleFactor  // 累积缩放
    klineScaleX = klineScaleX.coerceIn(minScaleX, maxScaleX)  // 限制范围
    invalidate()  // 重绘
    return true
}
2. 手势冲突处理

问题ScaleGestureDetectorGestureDetector 可能同时处理触摸事件。

解决方案

  • 使用 scaleGestureDetector.isInProgress 判断是否正在缩放,如果正在缩放则不处理滚动
  • onScaleBegin() 中停止滚动动画,避免同时进行
kotlin 复制代码
override fun onTouchEvent(event: MotionEvent): Boolean {
    scaleGestureDetector.onTouchEvent(event)
    
    // 如果正在缩放,不处理滚动
    if (scaleGestureDetector.isInProgress) {
        return true
    }
    
    // 处理滚动...
}

需要调整的地方

缩放需要在以下地方应用:K线宽度、间距、滚动边界、translateX、可见范围、滚动位置。所有计算都使用 getScaledTotalCandleWidth() 获取缩放后的宽度。

缩放与滚动的协调

先处理缩放,如果正在缩放则不处理滚动。缩放后重新计算滚动边界,自动调整滚动位置。

效果

相关推荐
2501_937189232 小时前
IPTV 2026 优化版:解码适配 + 安全运维双升级,筑牢使用体验基石
android·源码·开源软件·源代码管理
朽木成才2 小时前
Android+Flutter混合开发实战
android·flutter
天燹3 小时前
Qt 6 嵌入 Android 原生应用完整教程
android·开发语言·qt
美狐美颜sdk3 小时前
企业级直播美颜SDK与动态贴纸SDK开发技术方案拆解与落地实践
android·人工智能·计算机视觉·第三方美颜sdk·人脸美型sdk
PwnGuo4 小时前
Android逆向:在 Unidbg 中解决 native 函数内调用 Java 方法的报错
android·java·python
Kratzdisteln5 小时前
【1902】优化后的三路径学习系统
android·学习
Digitally5 小时前
如何将文件从 iPhone 传输到 Android
android·ios·iphone
a3158238065 小时前
Android修改调试屏幕的选择方向
android·adb·屏幕旋转
超级数据查看器6 小时前
超级数据查看器 更新日志(包含的功能)
android·java·数据库·sqlite·安卓