SGraphyView.kt 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. /*
  2. * ********************************************************************************************************************
  3. *
  4. * iFHS7.
  5. * ;BBMBMBMc rZMBMBR BMB
  6. * MBEr:;PBM, 7MBMMEOBB: BBB RBW
  7. * XK: BO SB. :SZ MBM. c;; ir BBM :FFr :SSF: ;xBMB:r iuGXv. i:. iF2;
  8. * DBBM0r. :D S7 ;XMBMB GMBMu. MBM: BMB MBMBBBMBMS WMBMBMBBK MBMBMBM BMBRBMBW .MBMBMBMBB
  9. * :JMRMMD .. , 1MMRM1; ;MBMBBR: MBM ;MB: BMB: MBM. RMBr sBMH BM0 UMB, BMB. KMBv
  10. * ;. XOW B1; :uM: 1RE, i .2BMBs rMB. MBO MBO JMB; MBB MBM BBS 7MBMBOBM: MBW :BMc
  11. * OBRJ.SEE MRDOWOR, 3DE:7OBM . ;BMB RMR7BM BMB MBB. BMB ,BMR .BBZ MMB rMB, BMM rMB7
  12. * :FBRO0D0 RKXSXPR. JOKOOMPi BMBSSWBMB; BMBB: MBMB0ZMBMS .BMBOXRBMB MBMDE RBM2;SMBM; MBB xBM2
  13. * iZGE O0SHSPO. uGZ7. sBMBMBDL :BMO OZu:BMBK, rRBMB0; ,EBMB xBMBr:ER. RDU :OO;
  14. * ,BZ, 1D0 RPSFHXR. xWZ .SMr . .BBB
  15. * :0BMRDG RESSSKR. 2WOMBW; BMBMR
  16. * i0BM: SWKHKGO MBDv
  17. * .UB OOGDM. MK, Copyright (c) 2015-2019. 斯伯坦机器人
  18. * , XMW ..
  19. * r All rights reserved.
  20. *
  21. * ********************************************************************************************************************
  22. */
  23. package com.sybotan.android.graphy
  24. import android.content.Context
  25. import android.graphics.*
  26. import android.util.AttributeSet
  27. import android.util.Log
  28. import android.view.*
  29. import com.sybotan.android.graphy.enums.SGraphyViewTouchState
  30. import com.sybotan.android.graphy.events.SGraphyViewMoveEvent
  31. import com.sybotan.android.graphy.events.SGraphyViewZoomEvent
  32. import com.sybotan.android.graphy.utils.MatrixUtil
  33. import com.sybotan.base.extensions.toJson
  34. import org.greenrobot.eventbus.EventBus
  35. import java.util.concurrent.ExecutorService
  36. import java.util.concurrent.Executors
  37. import kotlin.math.max
  38. import kotlin.math.min
  39. /**
  40. * SGraphy图形引擎视图类
  41. *
  42. * @author 庞利祥(sybotan@126.com)
  43. */
  44. open class SGraphyView(context: Context, attrs: AttributeSet? = null) : SurfaceView(context, attrs),
  45. SurfaceHolder.Callback, View.OnTouchListener, GestureDetector.OnGestureListener, Runnable {
  46. /**
  47. * 类对象
  48. */
  49. companion object {
  50. private val TAG = SGraphyView::class.java.name
  51. private var fitrate = 0.8f
  52. } // companion object
  53. /** 指向加载到视图中的场景 */
  54. var scene: SGraphyScene? = null
  55. set(value) {
  56. if (field == value) { // 如果场景没有变化
  57. return
  58. }
  59. field?.view = null
  60. value?.view = this
  61. // 保存场景
  62. field = value
  63. }
  64. /** 旋转 */
  65. var rotate = 0.0f
  66. /** 是否支持二指缩放操作 */
  67. var canZoom = true
  68. /** 缩放比例 */
  69. var scale = 1f
  70. get() = max(min(field, maxScale), minScale)
  71. set(value) {
  72. field = value
  73. moveRange()
  74. }
  75. /** 最小缩放比例 */
  76. var minScale = 0.0000001f
  77. set(value) {
  78. field = min(value, maxScale)
  79. }
  80. /** 最大缩放比例 */
  81. var maxScale = 1000000f
  82. set(value) {
  83. field = max(value, minScale)
  84. }
  85. /** 是否支持移动场景操作 */
  86. var canMove = true
  87. /** 场景原点位置在视图中的位置 */
  88. var pos = PointF(0f, 0f)
  89. get() {
  90. field.x = min(max(field.x, minPos.x), maxPos.x)
  91. field.y = min(max(field.y, minPos.y), maxPos.y)
  92. return field
  93. }
  94. /** 视图原点最小值 */
  95. var minPos = PointF(Float.MIN_VALUE, Float.MIN_VALUE)
  96. /** 视图原点最大值 */
  97. var maxPos = PointF(Float.MAX_VALUE, Float.MAX_VALUE)
  98. /** 手执状态 */
  99. private var touchState = SGraphyViewTouchState.NoneState
  100. /** 是否在绘制状态 */
  101. private var isDrawing = false
  102. /** 手势解析器 */
  103. private val gesture by lazy {
  104. GestureDetector(this)
  105. }
  106. /** 未缩放时二指间距离 */
  107. private var beforeLength = 0.0f
  108. /** 缩放后二指间距离 */
  109. private var afterLength = 0.0f
  110. /** 后台绘制线程 */
  111. private var paintThread: Thread? = null
  112. private var canvas: Canvas? = null
  113. /** 线程池*/
  114. private var executorService: ExecutorService? = null
  115. private var runable = Runnable {
  116. run {
  117. while (true) {
  118. if (Thread.interrupted()) {
  119. Log.e("sajkskjd", "线程终止了")
  120. break
  121. }
  122. if (isDrawing) {
  123. try {
  124. // Thread.sleep(100)
  125. canvas = holder.lockCanvas()
  126. if (null == canvas) { // 如果canvas为空
  127. continue
  128. }
  129. drawScene(canvas!!)
  130. /*synchronized(holder) {
  131. drawScene(canvas!!)
  132. }*/
  133. } catch (e: Exception) {
  134. e.printStackTrace()
  135. } finally {
  136. try {
  137. if (null != canvas && null != holder) {
  138. holder.unlockCanvasAndPost(canvas)
  139. }
  140. } catch (e: Exception) {
  141. e.printStackTrace()
  142. }
  143. }
  144. }
  145. }
  146. }
  147. }
  148. fun runableTask() {
  149. executorService = Executors.newSingleThreadExecutor()
  150. executorService!!.execute(runable)
  151. }
  152. fun shutDown() {
  153. if (null != executorService) {
  154. executorService!!.shutdown()
  155. executorService!!.shutdownNow()
  156. }
  157. }
  158. /** 默认构造函数 */
  159. init {
  160. Log.d(TAG, "init")
  161. initView()
  162. } // init
  163. override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
  164. super.onMeasure(widthMeasureSpec, heightMeasureSpec)
  165. Log.e("w", widthMeasureSpec.toString())
  166. Log.e("h", heightMeasureSpec.toString())
  167. }
  168. /**
  169. * 适配视图到视图
  170. */
  171. fun fitSceneToView() {
  172. // 未设置场景
  173. if (null == scene) {
  174. return
  175. }
  176. // val w = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
  177. // val h = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
  178. // this.measure(width, height)
  179. // val h: Int = this.getMeasuredHeight()
  180. // val w: Int = this.getMeasuredWidth()
  181. this.post {
  182. val w = width.toFloat()
  183. val h = height.toFloat()
  184. val rect = scene!!.worldRect()
  185. setCenterPoint(
  186. PointF(rect.centerX(), rect.centerY()),
  187. min(w / rect.width(), h / rect.height()) * fitrate
  188. )
  189. // Log.e("w",w.toString())
  190. // Log.e("h",h.toString())
  191. // Log.e("rect1",rect.toJson())
  192. // Log.e("min",(min(w / rect.width(), h / rect.height())).toJson())
  193. }
  194. } // Function FitView()
  195. /**
  196. * 设置中心点
  197. *
  198. * @param scale 场景的缩放比例
  199. */
  200. fun setCenterPoint(pos: PointF, scale: Float? = null) {
  201. if (scale != null) {
  202. this.scale = scale
  203. }
  204. this.pos = PointF(
  205. -pos.x * this.scale + this.width.toFloat() / 2f,
  206. -pos.y * this.scale + this.height.toFloat() / 2f
  207. )
  208. } // Function setCenterPoint()
  209. /**
  210. * 限定移动范围
  211. */
  212. fun moveRange() {
  213. if (scene == null) {
  214. return
  215. }
  216. val w = this.width.toFloat()
  217. val h = this.height.toFloat()
  218. val rect = scene!!.worldRect()
  219. this.minPos = PointF(
  220. -rect.centerX() * this.scale + w / 2f - rect.width() / 2f * this.scale,
  221. -rect.centerY() * this.scale + h / 2f - rect.height() / 2f * this.scale
  222. )
  223. /**
  224. * -(rect.left + rect.right) / 2f * graphyView.scale + width / 2 图形的中心点,
  225. * rect.width() / 2 * graphyView.scale / 0.8f 图形宽度的一半乘以缩放比例除以适配百分比
  226. *
  227. */
  228. this.maxPos = PointF(
  229. -rect.centerX() * this.scale + w / 2f + rect.width() / 2f * this.scale,
  230. -rect.centerY() * this.scale + h / 2f + rect.height() / 2f * this.scale
  231. )
  232. } // Function moveRange()
  233. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  234. // Surface相关操作
  235. /**
  236. * Surface创建成功时回调函数。
  237. *
  238. * @param holder surface创建成功时的保持器。
  239. */
  240. override fun surfaceCreated(holder: SurfaceHolder?) {
  241. Log.d(TAG, "surfaceCreated")
  242. isDrawing = true
  243. // 启动后台绘制线程
  244. paintThread = Thread(this)
  245. paintThread!!.start()
  246. // runableTask()
  247. return
  248. } // Function surfaceCreated()
  249. /**
  250. * Surface变现时回调函数。
  251. *
  252. * @param holder Surface保持器
  253. * @param format 新的surface格式
  254. * @param width 宽度
  255. * @param height 高度
  256. */
  257. override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
  258. Log.d(TAG, "surfaceChanged:width=$width, height=$height")
  259. return
  260. } // Function surfaceChanged()
  261. /**
  262. * Surface被销毁时回调函数。
  263. *
  264. * @param holder surface销毁时的保持器。
  265. */
  266. override fun surfaceDestroyed(holder: SurfaceHolder?) {
  267. Log.d(TAG, "surfaceDestroyed")
  268. paintThread!!.interrupt()
  269. paintThread = null
  270. isDrawing = false
  271. // shutDown()
  272. return
  273. } // Function surfaceDestroyed()
  274. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  275. // 坐标换算相关操作
  276. /**
  277. * 将场景中的xy坐标转换成视图坐标。
  278. *
  279. * @param x 场景中的横坐标
  280. * @param y 场景中的纵坐标
  281. *
  282. * @return 在item中的坐标
  283. */
  284. fun mapFromScene(x: Float, y: Float): PointF {
  285. return PointF(x * scale + pos.x, y * scale + pos.y)
  286. } // Function mapFromScene()
  287. /**
  288. * 将场景中的xy坐标转换成视图坐标。
  289. *
  290. * @param point 场景中的坐标
  291. * @return 在item中的坐标
  292. */
  293. fun mapFromScene(point: PointF): PointF {
  294. return mapFromScene(point.x, point.y)
  295. } // Function mapFromScene()
  296. /**
  297. * 将item中的xy坐标转换成场景坐标。
  298. *
  299. * @param x item中的横坐标
  300. * @param y item中的纵坐标
  301. * @return 在场景中的坐标
  302. */
  303. fun mapToScene(x: Float, y: Float): PointF {
  304. return PointF((x - pos.x) / scale, (y - pos.y) / scale)
  305. } // Function mapToScene()
  306. /**
  307. * 将item中的xy坐标转换成场景坐标。
  308. *
  309. * @param point item中的坐标
  310. * @return 在场景中的坐标
  311. */
  312. fun mapToScene(point: PointF): PointF {
  313. return mapToScene(point.x, point.y)
  314. } // Function mapToScene()
  315. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  316. // 手势相关操作
  317. /**
  318. * 用户对视图进行触摸操作时触发
  319. *
  320. * @param v 触摸的视图对象
  321. * @param event 保存触摸事件参数
  322. * @return 如果处理了该事件返回true, 否则返回false
  323. */
  324. override fun onTouch(v: View, event: MotionEvent): Boolean {
  325. try {
  326. return when (event.action and MotionEvent.ACTION_MASK) {
  327. MotionEvent.ACTION_POINTER_DOWN -> { // 多点触控
  328. if (canZoom) { // 如果可以缩放
  329. touchState = SGraphyViewTouchState.ZoomState
  330. beforeLength = getDistance(event) // 获取两点的距离
  331. }
  332. true
  333. }
  334. MotionEvent.ACTION_POINTER_UP -> { // 多点释放
  335. touchState = SGraphyViewTouchState.NoneState
  336. true
  337. }
  338. MotionEvent.ACTION_MOVE -> {
  339. scene?.onActionMove(event)
  340. if (SGraphyViewTouchState.ZoomState == touchState && canZoom) { // 两点绽放操作
  341. viewZoom(event)
  342. true
  343. } else {
  344. gesture.onTouchEvent(event)
  345. }
  346. }
  347. MotionEvent.ACTION_UP -> {
  348. scene?.onActionUp(event)
  349. gesture.onTouchEvent(event)
  350. }
  351. else -> {
  352. gesture.onTouchEvent(event)
  353. }
  354. }
  355. } catch (e: Exception) {
  356. return true
  357. }
  358. } // Function onTouch()
  359. /**
  360. * 用户点击屏幕时触发。
  361. *
  362. * @param e 触摸事件
  363. */
  364. override fun onShowPress(e: MotionEvent) {
  365. scene?.onShowPress(toSceneMotionEvent(e))
  366. return
  367. } // Function onShowPress()
  368. /**
  369. * 用户按下屏幕就会触发.
  370. *
  371. * @param e 按下手势事件。
  372. * @return 如果事件被处理返回 true , 否则返回 false 。
  373. */
  374. override fun onDown(e: MotionEvent): Boolean {
  375. scene?.onDown(toSceneMotionEvent(e))
  376. return true
  377. } // Function onDown()
  378. /**
  379. * 用户释放屏幕触发.
  380. *
  381. * @param e 释放手势事件。
  382. * @return 如果事件被处理返回 true , 否则返回 false 。
  383. */
  384. override fun onSingleTapUp(e: MotionEvent): Boolean {
  385. Log.e("手势view", e.toString())
  386. scene?.onSingleTapUp(toSceneMotionEvent(e))
  387. return true
  388. } // Function onSingleTapUp()
  389. /**
  390. * 长按触摸屏超过一定时间。
  391. *
  392. * @param e 长按手势事件。
  393. */
  394. override fun onLongPress(e: MotionEvent) {
  395. scene?.onLongPress(toSceneMotionEvent(e))
  396. return
  397. } // Function onLoagPress()
  398. /**
  399. * 用户按下触摸屏,并拖动。
  400. *
  401. * @param e1 第1个 ACTION_DOWN 手势事件
  402. * @param e2 最后一个 ACTION_MOVE 手势事件
  403. * @param distanceX X轴上的移动距离,单位:像素
  404. * @param distanceY Y轴上的移动距离,单位:像素
  405. * @return 如果事件被处理返回 true , 否则返回 false 。
  406. */
  407. override fun onScroll(
  408. e1: MotionEvent,
  409. e2: MotionEvent,
  410. distanceX: Float,
  411. distanceY: Float
  412. ): Boolean {
  413. if (scene == null) {
  414. return true
  415. }
  416. // 如果场景处理了该事件,则返回
  417. if (scene!!.onScroll(
  418. toSceneMotionEvent(e1),
  419. toSceneMotionEvent(e2),
  420. distanceX / scale,
  421. distanceY / scale
  422. )
  423. ) {
  424. return true
  425. }
  426. if (canMove) { // 如果可以移动场景
  427. // 移动场景
  428. pos.x = pos.x - distanceX
  429. pos.y = pos.y - distanceY
  430. Log.e("x", pos.x.toString())
  431. Log.e("y", pos.y.toString())
  432. EventBus.getDefault().post(SGraphyViewMoveEvent(this, pos.x, pos.y))
  433. }
  434. return true
  435. } // Function onScroll()
  436. /**
  437. * 用户按下触摸屏、快速移动后松开。即滑动操作。
  438. *
  439. * @param e1 第1个 ACTION_DOWN 手势事件
  440. * @param e2 最后一个 ACTION_MOVE 手势事件
  441. * @param velocityX X轴上的移动速度,像素/秒
  442. * @param velocityY Y轴上的移动速度,像素/秒
  443. * @return 如果事件被处理返回 true , 否则返回 false 。
  444. */
  445. override fun onFling(
  446. e1: MotionEvent,
  447. e2: MotionEvent,
  448. velocityX: Float,
  449. velocityY: Float
  450. ): Boolean {
  451. scene?.onFling(
  452. toSceneMotionEvent(e1),
  453. toSceneMotionEvent(e2),
  454. velocityX / scale,
  455. velocityY / scale
  456. )
  457. return true
  458. } // Function onFling()
  459. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  460. // 绘制相关操作
  461. /**
  462. * 重载线程run函数。
  463. */
  464. override fun run() {
  465. while (null != paintThread && !paintThread!!.isInterrupted) { // 循环控制绘制
  466. var canvas: Canvas? = null
  467. try {
  468. Thread.sleep(100)
  469. canvas = holder.lockCanvas()
  470. if (null == canvas) { // 如果canvas为空
  471. continue
  472. }
  473. synchronized(holder) {
  474. drawScene(canvas)
  475. }
  476. } catch (e: Exception) {
  477. e.printStackTrace()
  478. } finally {
  479. if (null != canvas) {
  480. holder.unlockCanvasAndPost(canvas)
  481. }
  482. }
  483. }
  484. return
  485. } // Function run()
  486. /**
  487. * 后台场景绘制线程
  488. *
  489. * @param canvas 画布
  490. */
  491. open fun drawScene(canvas: Canvas) {
  492. // 绘制背景
  493. canvas.save()
  494. scene?.drawBackground(canvas, RectF())
  495. canvas.restore()
  496. // 绘制场景
  497. canvas.save()
  498. canvas.translate(pos.x, pos.y)
  499. canvas.scale(scale, scale)
  500. scene?.drawScene(canvas, RectF())
  501. canvas.restore()
  502. // 绘制前景
  503. canvas.save()
  504. scene?.drawForeground(canvas, RectF())
  505. canvas.restore()
  506. return
  507. } // Function drawScene()
  508. /**
  509. * 缩放视图时计算视图的位置与缩放比例
  510. *
  511. * @param zoom 缩放比例
  512. * @param midPoint 缩放计算的中心点
  513. */
  514. fun scaleByPoint(zoom: Float, midPoint: PointF) {
  515. var z = zoom
  516. /**
  517. * 缩放比例在最小比例和最大比例范围内
  518. */
  519. when {
  520. scale * zoom >= maxScale -> {
  521. z = maxScale / scale
  522. scale = maxScale
  523. }
  524. scale * zoom <= minScale -> {
  525. z = minScale / scale
  526. scale = minScale
  527. }
  528. else -> {
  529. scale *= zoom
  530. }
  531. }
  532. pos.x = midPoint.x - (midPoint.x - pos.x) * z
  533. pos.y = midPoint.y - (midPoint.y - pos.y) * z
  534. EventBus.getDefault().post(SGraphyViewZoomEvent(this, scale))
  535. EventBus.getDefault().post(SGraphyViewMoveEvent(this, pos.x, pos.y))
  536. return
  537. } // Function scaleByPoint()
  538. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  539. // 初始化相关操作
  540. /**
  541. * 初始化视图控件
  542. */
  543. private fun initView() {
  544. holder.addCallback(this)
  545. // 设置支持透明色
  546. holder.setFormat(PixelFormat.TRANSPARENT)
  547. isFocusable = true
  548. isFocusableInTouchMode = true
  549. setOnTouchListener(this)
  550. return
  551. } // Function initView()
  552. /**
  553. * 缩放视图
  554. *
  555. * @param event 触摸事件
  556. */
  557. private fun viewZoom(event: MotionEvent): Boolean {
  558. if (touchState == SGraphyViewTouchState.ZoomState) {
  559. afterLength = getDistance(event)// 获取两点的距离
  560. val gapLenght = afterLength - beforeLength// 变化的长度
  561. if (Math.abs(gapLenght) > 5f && beforeLength != 0.0f) {
  562. val tempScale = afterLength / beforeLength// 求的缩放的比例
  563. val p = getMiddlePoint(event)
  564. scaleByPoint(tempScale, p) //重设置
  565. beforeLength = afterLength
  566. }
  567. }
  568. return true
  569. } // Function onTouchMove()
  570. /**
  571. * 获取两手指之间的距离
  572. *
  573. * @param event 触摸事件
  574. * @return 两手指之间的距离
  575. */
  576. private fun getDistance(event: MotionEvent): Float {
  577. val x = (event.getX(0) - event.getX(1)).toDouble()
  578. val y = (event.getY(0) - event.getY(1)).toDouble()
  579. return Math.sqrt(x * x + y * y).toFloat()
  580. } // Function getDistance()
  581. /**
  582. * 获得两个手指触摸点的中点坐标
  583. *
  584. * @param event
  585. * @return 得到视图的x坐标中点
  586. */
  587. private fun getMiddlePoint(event: MotionEvent): PointF {
  588. return PointF(
  589. (event.getX(1) + event.getX(0)) / 2f,
  590. (event.getY(1) + event.getY(0)) / 2f
  591. )
  592. } // Function getMiddlePoint()
  593. /**
  594. * MotionEvent转场景对象MotionEvent
  595. *
  596. * @param e MotionEvent
  597. * @return 子对象MotionEvent
  598. */
  599. private fun toSceneMotionEvent(e: MotionEvent): SMotionEvent {
  600. val src1 = kotlin.floatArrayOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f)
  601. val src2 = kotlin.floatArrayOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f)
  602. val se = SMotionEvent(e)
  603. // se.matrix.postTranslate(pos.x,pos.y)
  604. // se.matrix.postScale(this.scale, this.scale);
  605. // se.matrix.postRotate(this.rotate)
  606. se.matrix.preTranslate(pos.x, pos.y)
  607. se.matrix.preScale(this.scale, this.scale);
  608. se.matrix.preRotate(this.rotate)
  609. val matrixMat = Matrix()
  610. se.matrix.invert(matrixMat)
  611. se.matrix.getValues(src1)
  612. Log.e("src1= ", src1.toJson())
  613. matrixMat.getValues(src2)
  614. Log.e("src2= ", src2.toJson())
  615. val mp = MatrixUtil.matrixTransform(matrixMat, e.x, e.y)
  616. se.x = mp.x
  617. se.y = mp.y
  618. // Log.e("ex = ",e.x.toString())
  619. // Log.e("ey = ",e.y.toString())
  620. // Log.e("sex = ",se.x .toString())
  621. // Log.e("sey = ",se.y.toString())
  622. // se.setLocation((e.x - pos.x) / scale, (e.y - pos.y) / scale)
  623. return se
  624. } // Function toSceneMotionEvent()
  625. } // Class SGraphyView