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

缩放与滚动的协调

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

效果

相关推荐
李堇4 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly5 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者88 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20358 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥8 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓8 小时前
[JDBC]元数据
android
独行soc9 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能9 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿9 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc9 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮