绘制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() 获取缩放后的宽度。

缩放与滚动的协调

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

效果

相关推荐
localbob5 小时前
Pico 4XVR 1.10.13安装包下载与安装教程 ico 4XVR最新版下载、4XVR 1.10.13 APK安装包、Pico VR看电影软件、4XVR完整版安装教程、Pico 4播放器推荐、V
android·vr·vr播放器·vr眼镜播放器下载·pico 4xvr·4xvr下载·pico 4xvr最新版安装包
峥嵘life6 小时前
Android16 EDLA【CTS】CtsConnectivityMultiDevicesTestCases存在fail项
android·学习
大傻^6 小时前
SpringAI2.0 Null Safety 实战:JSpecify 注解体系与 Kotlin 互操作
android·开发语言·人工智能·kotlin·springai
游戏开发爱好者86 小时前
React Native iOS 代码如何加密,JS 打包 和 IPA 混淆
android·javascript·react native·ios·小程序·uni-app·iphone
kcuwu.6 小时前
Python判断及循环
android·java·python
轩情吖6 小时前
MySQL之索引
android·数据库·mysql·b+树·索引·page·
2501_915918417 小时前
iOS mobileprovision 描述文件管理,新建、下载和内容查看
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张7 小时前
iOS 应用程序使用历史记录和耗能记录怎么查?
android·ios·小程序·https·uni-app·iphone·webview
用户69371750013848 小时前
OS级AI Agent:手机操作系统的下一个战场
android·前端·人工智能
私人珍藏库8 小时前
[Android] 亿连车机版V7.0.1
android·app·软件·车机