/
GravityRotationHelper.kt
161 lines (146 loc) · 5.74 KB
/
GravityRotationHelper.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.ziwenl.library
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.util.Log
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import com.ziwenl.library.GravityRotationImageView.Companion.MOVING_RANGE_DEFAULT
import org.jetbrains.annotations.NotNull
/**
* PackageName : com.ziwenl.library
* Author : Ziwen Lan
* Date : 2021/9/18
* Time : 14:13
* Introduction : 重力感应帮助类
* 实例磁场和加速度传感器,并注册监听
* 通过 lifecycle 绑定宿主生命周期实现注册反注册
* 传递磁场和加速度传感器获得的数据给 GravityRotationImageView
*
* @param context 上下文对象,必须已实现 LifecycleOwner
*/
class GravityRotationHelper(context: Context) {
/**
* 加速度与磁场传感器检测值集
*/
private var mAccelerationValues: FloatArray? = null
private var mMagneticValues: FloatArray? = null
/**
* 前景、后景
* 通过前景后景反向移动,实现裸眼 3D 效果
*/
private var mFrontView: GravityRotationImageView? = null
private var mBackView: GravityRotationImageView? = null
/**
* 最大可移动范围(前景后景的可移动范围)
*/
private var mMaxMovingRange = 0f
/**
* 传感器管理器与监听
*/
private var mSensorManager: SensorManager? = null
private var mSensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
when (event.sensor.type) {
Sensor.TYPE_ACCELEROMETER -> {
//加速度
mAccelerationValues = event.values
handleAccelerometerAndMagneticData()
}
Sensor.TYPE_MAGNETIC_FIELD -> {
//磁场
mMagneticValues = event.values
handleAccelerometerAndMagneticData()
}
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
}
private fun handleAccelerometerAndMagneticData() {
if (mAccelerationValues != null && mMagneticValues != null) {
if (mFrontView != null && mBackView !== null) {
mFrontView?.handleSensorChangedValues(
mAccelerationValues!!,
mMagneticValues!!,
mMaxMovingRange
)
mBackView?.handleSensorChangedValues(
mAccelerationValues!!,
mMagneticValues!!,
mMaxMovingRange
)
}
}
}
init {
if (context is LifecycleOwner) {
//获取传感器管理类实例
mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
//加速度传感器实例
val accelerationSensor = mSensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
//磁场传感器
val magneticSensor = mSensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
context.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(@NotNull owner: LifecycleOwner) {
//注册监听
mSensorManager?.registerListener(
mSensorEventListener,
accelerationSensor,
SensorManager.SENSOR_DELAY_GAME
)
mSensorManager?.registerListener(
mSensorEventListener,
magneticSensor,
SensorManager.SENSOR_DELAY_GAME
)
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(@NotNull owner: LifecycleOwner) {
mSensorManager?.unregisterListener(mSensorEventListener)
}
})
} else {
Log.e(
"GravityRotationHelper",
"GravityRotationHelper init error : context is LifecycleOwner = false "
)
}
}
/**
* 添加需要实现裸眼 3D 效果的视图组
* 旋转移动过程中,前景后景随旋转角度偏移
* @param frontView 前景
* @param backView 后景
* @param maxMovingRange 最大可移动范围 dp
*/
fun attachViews(
frontView: GravityRotationImageView,
backView: GravityRotationImageView,
maxMovingRange: Float = MOVING_RANGE_DEFAULT
) {
//旧持有前景后景 View 不为空时,记录并重置对应 scroll 值
val oldFrontViewScrollX = mFrontView?.scrollX ?: 0
val oldFrontViewScrollY = mFrontView?.scrollY ?: 0
val oldBackViewScrollX = mBackView?.scrollX ?: 0
val oldBackViewScrollY = mBackView?.scrollY ?: 0
val oldRotationAngleX = mFrontView?.rotationAngleX ?: 0
val oldRotationAngleY = mFrontView?.rotationAngleY ?: 0
mFrontView = frontView
mBackView = backView
mFrontView?.rotationAngleX = oldRotationAngleX
mFrontView?.rotationAngleY = oldRotationAngleY
mBackView?.rotationAngleX = oldRotationAngleX
mBackView?.rotationAngleY = oldRotationAngleY
//继承上一组前景后景 View 的 scroll 值
mFrontView?.scrollTo(oldFrontViewScrollX, oldFrontViewScrollY)
mBackView?.scrollTo(oldBackViewScrollX, oldBackViewScrollY)
mMaxMovingRange = maxMovingRange
}
}