Kaynağa Gözat

feat 项目改造

lihao1 3 yıl önce
ebeveyn
işleme
fe40c58687
33 değiştirilmiş dosya ile 517 ekleme ve 350 silme
  1. 1 0
      build.gradle
  2. 1 3
      cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt
  3. 19 4
      cadengine/src/main/java/cn/sagacloud/android/cadengine/Opt.kt
  4. 10 4
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/EquipItem.kt
  5. 1 0
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/GridItem.kt
  6. 10 4
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/QrcodeItem.kt
  7. 1 1
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt
  8. 6 3
      cadengine/src/main/java/cn/sagacloud/android/cadengine/items/TunableSpaceItem.kt
  9. 5 0
      demo/build.gradle
  10. 22 65
      demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt
  11. 1 3
      demo/src/main/java/com/sybotan/android/demo/activities/PocActivity.kt
  12. 0 1
      demo/src/main/java/com/sybotan/android/demo/activities/WebViewActivity.kt
  13. 6 0
      demo/src/main/java/com/sybotan/android/demo/activities/poc/SpaceActivity.kt
  14. 114 0
      demo/src/main/java/com/sybotan/android/demo/graphy/GraphyHelper.kt
  15. 2 0
      demo/src/main/java/com/sybotan/android/demo/viewmodel/BaseViewModel.java
  16. 4 4
      demo/src/main/res/layout/activity_device_type.xml
  17. 4 4
      demo/src/main/res/layout/activity_record_info.xml
  18. 6 6
      demo/src/main/res/layout/activity_relation.xml
  19. 4 4
      demo/src/main/res/layout/activity_space.xml
  20. 2 2
      demo/src/main/res/layout/child_expand_space.xml
  21. 2 2
      demo/src/main/res/layout/group_expand_space.xml
  22. 2 2
      demo/src/main/res/layout/item_device.xml
  23. 2 2
      demo/src/main/res/layout/item_relation.xml
  24. 2 2
      demo/src/main/res/layout/item_tree.xml
  25. 34 34
      sybotan-android-base/build.gradle
  26. 1 1
      sybotan-android-base/src/main/java/com/sybotan/android/base/activities/SBaseActivity.kt
  27. 34 34
      sybotan-android-database/build.gradle
  28. 34 34
      sybotan-android-devices/build.gradle
  29. 34 34
      sybotan-android-graphy/build.gradle
  30. 1 0
      sybotan-android-graphy/src/main/java/com/sybotan/android/graphy/SGraphyScene.kt
  31. 84 29
      sybotan-android-graphy/src/main/java/com/sybotan/android/graphy/SGraphyView.kt
  32. 34 34
      sybotan-android-views/build.gradle
  33. 34 34
      sybotan-android-works/build.gradle

+ 1 - 0
build.gradle

@@ -64,6 +64,7 @@ allprojects {
         jcenter()
         google()
         maven {
+            allowInsecureProtocol = true
             url 'http://nexus.arashivision.com:9999/repository/maven-public/'
             credentials {
                 username = 'deployment'

+ 1 - 3
cadengine/src/main/java/cn/sagacloud/android/cadengine/FloorScene.kt

@@ -606,9 +606,7 @@ open class FloorScene : SGraphyScene() {
             addItem(eqItem!!)
         }
 
-        if (topUp != null) {
-            topUp.onSingUp(e.x, e.y)
-        }
+        topUp.onSingUp(e.x, e.y)
         return super.onSingleTapUp(e)
     }
 

+ 19 - 4
cadengine/src/main/java/cn/sagacloud/android/cadengine/Opt.kt

@@ -17,6 +17,25 @@ class Opt {
         val virtualWallColor = Color.rgb(0xff,0x00,0xff)
         /** 默认空间颜色 */
         val spaceColor = Color.rgb(0xf1, 0xf3, 0xf7)
+        /** 门颜色 */
+        val doorColor = Color.rgb(0xcc, 0xcc, 0xcc)
+        /** 窗户颜色 */
+        val windowColor = Color.rgb(0xba, 0xe0, 0xfd)
+
+//        /** 墙颜色 */
+//        val wallColor = Color.rgb(0x55, 0x57, 0x67)
+//        /** 柱子颜色 */
+//        val columnColor = Color.rgb(0x19, 0x1b, 0x26)
+//        /** 虚拟墙颜色 */
+//        val virtualWallColor = Color.rgb(0x6c, 0x6d, 0x70)
+//        /** 门颜色 */
+//        val doorColor = Color.rgb(0x6c, 0x6d, 0x70)
+//        /** 窗户颜色 */
+//        val windowColor = Color.rgb(0x98, 0x9b, 0xa9)
+//        /** 默认空间颜色 */
+//        val spaceColor = Color.rgb(0x38, 0x3a, 0x4a)
+
+
         /** 空间-梯颜色 */
         val ladderSpaceColor = Color.rgb(225, 242, 255)
         /** 空间-井颜色 */
@@ -25,10 +44,6 @@ class Opt {
         val engineRoomSpaceColor = Color.rgb(254, 233, 210)
         /** 被选中的空间颜色 */
         val spaceChoseColor = Color.rgb(0xe6, 0xfa, 0xff)
-        /** 门颜色 */
-        val doorColor = Color.rgb(0xcc, 0xcc, 0xcc)
-        /** 窗户颜色 */
-        val windowColor = Color.rgb(0xba, 0xe0, 0xfd)
         /** 文字颜色 */
         val textColor = Color.rgb(0x44, 0x71, 0xa3)
 

+ 10 - 4
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/EquipItem.kt

@@ -19,15 +19,17 @@ import java.util.*
  * Created by lihao.
  * Date: 2021/6/4
  */
-class EquipItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Float) :
-        SGraphyItem(parent) {
+class EquipItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Float? = null) :
+    SGraphyItem(parent) {
     /** 新建 画笔 */
     val mPaint_inner = Paint()
     val mPaint_center = Paint()
     var mDefaultScale = 0f
 
     init {
-        mDefaultScale = defaultScale;
+        if (defaultScale != null) {
+            mDefaultScale = defaultScale
+        }
 
         /** 新建 */
         //内圈
@@ -38,7 +40,11 @@ class EquipItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Floa
         mPaint_center.color = Color.parseColor("#ff00ff")
         mPaint_center.isAntiAlias = true
         mPaint_center.style = Paint.Style.FILL
-        flags = EnumSet.of(SGraphyItemFlag.ItemIsMovable, SGraphyItemFlag.ItemIsSelectable, SGraphyItemFlag.ItemIsFocusable)
+        flags = EnumSet.of(
+            SGraphyItemFlag.ItemIsMovable,
+            SGraphyItemFlag.ItemIsSelectable,
+            SGraphyItemFlag.ItemIsFocusable
+        )
     }
 
     override fun onSingleTapUp(e: SMotionEvent): Boolean {

+ 1 - 0
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/GridItem.kt

@@ -109,6 +109,7 @@ class GridItem(private val data: Grid, parent: SGraphyItem? = null, view: SGraph
      */
     @SuppressLint("DrawAllocation")
     override fun onDraw(canvas: Canvas) {
+        paint.color = Opt.engineRoomSpaceColor
         paint.style = Paint.Style.STROKE
         paint.strokeJoin = Paint.Join.ROUND
         paint.isAntiAlias = true

+ 10 - 4
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/QrcodeItem.kt

@@ -14,8 +14,8 @@ import java.util.*
  * Created by lihao.
  * Date: 2021/6/4
  */
-class QrcodeItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Float) :
-        SGraphyItem(parent) {
+class QrcodeItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Float? = null) :
+    SGraphyItem(parent) {
     /** 新建 画笔 */
     val mPaint_inner = Paint()
     val mPaint_center = Paint()
@@ -37,8 +37,14 @@ class QrcodeItem(val data: Point, parent: SGraphyItem? = null, defaultScale: Flo
     //var mScale = 1f
 
     init {
-        mDefaultScale = defaultScale;
-        flags = EnumSet.of(SGraphyItemFlag.ItemIsMovable, SGraphyItemFlag.ItemIsSelectable, SGraphyItemFlag.ItemIsFocusable)
+        if (defaultScale != null) {
+            mDefaultScale = defaultScale
+        }
+        flags = EnumSet.of(
+            SGraphyItemFlag.ItemIsMovable,
+            SGraphyItemFlag.ItemIsSelectable,
+            SGraphyItemFlag.ItemIsFocusable
+        )
         /** 按时 */
         not_overTime_inner.color = Color.parseColor("#ffffff")
         not_overTime_inner.isAntiAlias = true

+ 1 - 1
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/SpaceItem.kt

@@ -104,7 +104,7 @@ class SpaceItem(private val data: Space, parent: SGraphyItem? = null) : SGraphyI
             canvas.drawPath(spacePath!!, paint)
 
 
-            canvas.drawPath(spacePath!!, outPaint)
+//            canvas.drawPath(spacePath!!, outPaint)
         }
     } // Function onDraw()
 

+ 6 - 3
cadengine/src/main/java/cn/sagacloud/android/cadengine/items/TunableSpaceItem.kt

@@ -204,11 +204,14 @@ class TunableSpaceItem(val data: TunableSpace, parent: SGraphyItem? = null) : SG
                 paint.color = Opt.spaceChoseColor
             } else {
                 if (data.jobStatus.equals("01") || data.jobStatus.equals("04")) {
-                    paint.color = Color.parseColor("#FFFF78")
+                    //黄
+                    paint.color = Color.parseColor("#D0D1BE")
                 } else if (data.jobStatus.equals("02")) {
-                    paint.color = Color.parseColor("#FF6B6B")
+                    //红
+                    paint.color = Color.parseColor("#745764")
                 } else if (data.jobStatus.equals("03") || data.jobStatus.equals("05")) {
-                    paint.color = Color.parseColor("#99FF99")
+                    //绿
+                    paint.color = Color.parseColor("#3F6C5E")
                 }
             }
             outPaint.color = Color.parseColor("#7E96FF")

+ 5 - 0
demo/build.gradle

@@ -187,5 +187,10 @@ dependencies {
     //implementation 'org.kodein.di:kodein-di-framework-android-x-viewmodel:7.8.0'
     implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.0-RC'
 
+    implementation 'com.arashivision.sdk:sdkcamera:1.3.10'
+    implementation 'com.arashivision.sdk:sdkmedia:1.3.10'
+    implementation 'com.lzy.net:okgo:3.0.4'
+    implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
+
 
 }

+ 22 - 65
demo/src/main/java/com/sybotan/android/demo/activities/GraphyActivity.kt

@@ -29,8 +29,6 @@ import android.graphics.Color
 import android.graphics.PointF
 import android.os.Bundle
 import android.os.Environment
-import android.support.v7.widget.GridLayoutManager
-import android.support.v7.widget.LinearLayoutManager
 import android.util.Log
 import android.view.Gravity
 import android.view.MotionEvent
@@ -49,6 +47,7 @@ import cn.sagacloud.android.cadengine.Lasso
 import cn.sagacloud.android.cadengine.Opt
 import cn.sagacloud.android.cadengine.items.*
 import cn.sagacloud.android.cadengine.types.*
+import cn.sagacloud.android.cadengine.types.Space
 import cn.sagacloud.cadengine.HttpDownloadMap
 import com.afollestad.materialdialogs.MaterialDialog
 import com.arashivision.sdkcamera.camera.InstaCameraManager
@@ -63,6 +62,7 @@ import com.sybotan.android.demo.activities.poc.DeviceActivity
 import com.sybotan.android.demo.activities.poc.RelationActivity
 import com.sybotan.android.demo.adapter.PipeAdapter
 import com.sybotan.android.demo.bean.result.*
+import com.sybotan.android.demo.graphy.GraphyHelper
 import com.sybotan.android.demo.retrofit.BaseViewModelInterface
 import com.sybotan.android.demo.tools.DensityUtils
 import com.sybotan.android.demo.tools.WordWrapView
@@ -166,7 +166,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     private lateinit var qrcodeNext: TextView
     private lateinit var pipeNext: TextView
     private lateinit var pipeEdit: EditText
-    private lateinit var drawEquip: EditText
+    private lateinit var drawEquip: TextView
     private lateinit var drawPipe: TextView
     private lateinit var piprRv: RecyclerView
     private lateinit var equipCancel: TextView
@@ -188,6 +188,8 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
     private lateinit var quesTv: TextView
     private lateinit var quesSubmit: TextView
     private lateinit var qrcodeEdit: EditText
+    private lateinit var webview: WebView
+    private lateinit var quesIma: ImageView
 
     /**
      * 创建Activity时的回调函数
@@ -206,16 +208,12 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         InstaCameraManager.getInstance().registerCameraChangedCallback(this)
         graphyView.scene = scene
 
-        val rect1 = scene.addRectItem(10f, 10f, 400f, 300f)
-        rect1.moveTo(53587.82f, 28717.135f)
-        rect1.zOrder = 1000009f
 
         /** 开启异步 */
         doAsync {
             val downloadGZIPMap = HttpDownloadMap.downloadGZIPMap(floorMap)
             downloadGZIPMap?.let {
                 scene.loadData(it)
-                eagleView.scene = scene
             }
             /** 主线程处理ui */
             uiThread {
@@ -232,7 +230,6 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 //                    scene.addItem(mapItem)
                     mapItem = BaseMapItem(this@GraphyActivity, null)
                 }
-                eagleView.fitSceneToView()
 
                 Log.e("viewH", graphyView.measuredHeight.toString())
             }
@@ -357,6 +354,8 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         quesTv = findViewById(R.id.quesTv)
         quesSubmit = findViewById(R.id.quesSubmit)
         qrcodeEdit = findViewById(R.id.qrcodeEdit)
+        webview = findViewById(R.id.webview)
+        quesIma = findViewById(R.id.quesIma)
 
     }
 
@@ -780,10 +779,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 
                 /** 查询空间核查问题 */
                 GraphyVM.GET_PROBLEM -> {
-                    for (item in scene.pointItemList) {
-                        scene.removeItem(item)
-                    }
-                    scene.pointItemList.clear()
+                    graphyHelper.removeAllPoint()
                     var list = params as ArrayList<ProblemsModel>
                     val mPoints = ArrayList<PointF>()
                     val point1 = PointF()
@@ -810,14 +806,9 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                             point.mX = position.x.toFloat()
                             point.mY = position.y.toFloat()
                             point.id = model.id
-                            var item = PointItem(point, null, scene.defaultPointScale)
-                            item.isVisible = true
-                            item.zOrder = 10000001f
-                            scene.pointItemList.add(item)
-                            scene.addItem(item)
-                            item.setOnActionMove(object : PointItem.ActionMove {
+                            val addPoint = graphyHelper.addPoint(point)
+                            addPoint.setOnActionMove(object : PointItem.ActionMove {
                                 override fun onActionMove(event: MotionEvent) {
-                                    eagleView.setCenterPoint(PointF(event.x, event.y), graphyView.scale * 10f)
                                 }
 
                             })
@@ -854,11 +845,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                         point.mX = position.x.toFloat()
                         point.mY = position.y.toFloat()
 
-                        var item = QrcodeItem(point, null, scene.defaultPointScale)
-                        item.isVisible = true
-                        item.zOrder = 100000f
-                        scene.qrcodeItemList.add(item)
-                        scene.addItem(item)
+                        graphyHelper.addQrcode(point)
                     }
                 }
 
@@ -987,15 +974,12 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
         }, this, buildingId, floorId)
         graphyVM.getSpaceJob(from)
     }
-
+    val graphyHelper : GraphyHelper = GraphyHelper(scene)
     /**
      * 刷新地图上管线
      */
     private fun refreshPipe(spacePipeModel: ArrayList<SpacePipeModel>) {
-        for (item in scene.pipeItemList) {
-            scene.removeItem(item)
-        }
-        scene.pipeItemList.clear()
+        graphyHelper.removeAllPipeline()
         this.spacePipeModel = spacePipeModel
         for (model in this.spacePipeModel) {
             if (!model.children.isEmpty() && !model.isCheck) {
@@ -1004,18 +988,11 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
 
                     pipe.points!!.addAll(child.position)
 
-                    val pipeItem = PipeLineItem(pipe, null)
-                    pipeItem.isVisible = true
-                    pipeItem.zOrder = 100000f
-                    scene.pipeItemList.add(pipeItem)
-                    scene.addItem(pipeItem)
+                    graphyHelper.addPipeline(pipe)
 
                     for (point in child.position) {
-                        val pipeNodeItem = PipeNodeItem(point, null)
-                        pipeNodeItem.isVisible = true
-                        pipeNodeItem.zOrder = 100000f
-                        scene.addItem(pipeNodeItem)
-                        scene.pipeNodeList.add(pipeNodeItem)
+
+                        val pipeNodeItem = graphyHelper.addPipeNode(point)
                         pipeNodeItem.setOnScrollListener(object : PipeNodeItem.OnScroll {
                             override fun onScroll(x: Float, y: Float) {
                                 for (item in scene.pipeItemList) {
@@ -1029,11 +1006,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                                     po.y = node.y
                                     newData.points!!.add(po)
                                 }
-                                val pipeItem2 = PipeLineItem(newData, null)
-                                pipeItem2.isVisible = true
-                                pipeItem2.zOrder = 100000f
-                                scene.pipeItemList.add(pipeItem2)
-                                scene.addItem(pipeItem2)
+                                graphyHelper.addPipeline(newData)
 
 //                                for (pointItem1 in scene.pipeItemList) {
 //                                    for (pointList1 in pointItem1.data.points!!) {
@@ -1090,10 +1063,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
      * 刷新地图上设备
      */
     private fun refreshEquip(list: List<SpaceEqModel>) {
-        for (item in scene.equipList) {
-            scene.removeItem(item)
-        }
-        scene.equipList.clear()
+        graphyHelper.removeAllEquip()
         for (model in list) {
             if (!model.children.isEmpty() && !model.isCheck) {
                 for (child in model.children) {
@@ -1105,11 +1075,7 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
                     point.type = model.type
                     point.position = child.position
 
-                    var item = EquipItem(point, null, scene.defaultPointScale)
-                    item.isVisible = true
-                    item.zOrder = 10000012f
-                    scene.equipList.add(item)
-                    scene.addItem(item)
+                    graphyHelper.addEquip(point)
                 }
             }
         }
@@ -1119,25 +1085,16 @@ class GraphyActivity : BaseActivity(), ICaptureStatusListener, ICameraChangedCal
      * 重置空间界面
      */
     private fun refreshAll() {
-        for (item in scene.pointItemList) {
-            scene.removeItem(item)
-        }
-        scene.pointItemList.clear()
+        graphyHelper.removeAllPoint()
 
         for (item in scene.tunableSpaceList) {
             scene.removeItem(item)
         }
         scene.tunableSpaceList.clear()
 
-        for (item in scene.qrcodeItemList) {
-            scene.removeItem(item)
-        }
-        scene.qrcodeItemList.clear()
+        graphyHelper.removeAllQrcode()
+        graphyHelper.removeAllEquip()
 
-        for (item in scene.equipList) {
-            scene.removeItem(item)
-        }
-        scene.equipList.clear()
 
         spaceStructure.visibility = View.GONE
         quesDetail.visibility = View.GONE

+ 1 - 3
demo/src/main/java/com/sybotan/android/demo/activities/PocActivity.kt

@@ -2,11 +2,9 @@ package com.sybotan.android.demo.activities
 
 import android.Manifest
 import android.os.Bundle
-import android.support.constraint.ConstraintLayout
-import android.support.v4.app.ActivityCompat
-import android.support.v7.app.AppCompatActivity
 import androidx.appcompat.app.AppCompatActivity
 import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.app.ActivityCompat
 import com.sybotan.android.demo.R
 import com.sybotan.android.demo.activities.poc.SceneActivity
 import com.sybotan.android.demo.activities.poc.SpaceActivity

+ 0 - 1
demo/src/main/java/com/sybotan/android/demo/activities/WebViewActivity.kt

@@ -24,7 +24,6 @@
 package com.sybotan.android.demo.activities
 
 import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
 import com.sybotan.android.demo.R
 
 //import com.sybotan.android.devices.printer.SLPrinter

+ 6 - 0
demo/src/main/java/com/sybotan/android/demo/activities/poc/SpaceActivity.kt

@@ -2,7 +2,9 @@ package com.sybotan.android.demo.activities.poc
 
 import android.content.Intent
 import android.os.Bundle
+import android.text.TextUtils
 import android.widget.ExpandableListView
+import android.widget.Toast
 import android.widget.ImageView
 import com.sybotan.android.demo.R
 import com.sybotan.android.demo.activities.BaseActivity
@@ -25,6 +27,10 @@ class SpaceActivity : BaseActivity() {
 
         expandLv.setOnChildClickListener { parent, v, groupPosition, childPosition, id ->
             val floor = mBuilds[groupPosition].floor[childPosition]
+            if (floor == null || floor.infos == null || TextUtils.isEmpty(floor.infos.floorMap)) {
+                Toast.makeText(this@SpaceActivity, "该楼层没有平面图", Toast.LENGTH_LONG).show()
+                return@setOnChildClickListener true
+            }
             val intent = Intent(this, GraphyActivity::class.java)
             val bundle = Bundle()
             bundle.putString("buildingId", floor.buildingId)

+ 114 - 0
demo/src/main/java/com/sybotan/android/demo/graphy/GraphyHelper.kt

@@ -0,0 +1,114 @@
+package com.sybotan.android.demo.graphy
+
+import android.graphics.PointF
+import cn.sagacloud.android.cadengine.FloorScene
+import cn.sagacloud.android.cadengine.items.*
+import cn.sagacloud.android.cadengine.types.PipeLine
+import cn.sagacloud.android.cadengine.types.Point
+import java.util.ArrayList
+
+/**
+ * Created by lihao.
+ * Date: 2021/9/22
+ */
+class GraphyHelper(var scene: FloorScene) {
+
+    /**
+     * 绘制新设备
+     */
+    fun addEquip(point: Point): EquipItem {
+        val item = EquipItem(point)
+        item.isVisible = true
+        item.zOrder = 100000f
+        scene.equipList.add(item)
+        scene.addItem(item)
+        return item
+    }
+
+    /**
+     * 删除所有设备
+     */
+    fun removeAllEquip() {
+        for (item in scene.equipList) {
+            scene.removeItem(item)
+        }
+        scene.equipList.clear()
+    }
+
+    /**
+     * 绘制管线
+     */
+    fun addPipeline(pipe: PipeLine): PipeLineItem {
+        val pipeItem = PipeLineItem(pipe, null)
+        pipeItem.isVisible = true
+        pipeItem.zOrder = 100000f
+        scene.pipeItemList.add(pipeItem)
+        scene.addItem(pipeItem)
+        return pipeItem
+    }
+
+    /**
+     * 删除所有管线
+     */
+    fun removeAllPipeline() {
+        for (item in scene.pipeItemList) {
+            scene.removeItem(item)
+        }
+        scene.pipeItemList.clear()
+    }
+
+    /**
+     * 增加管道节点
+     */
+    fun addPipeNode(point: PointF): PipeNodeItem {
+        val pipeNodeItem = PipeNodeItem(point, null)
+        pipeNodeItem.isVisible = true
+        pipeNodeItem.zOrder = 100000f
+        scene.addItem(pipeNodeItem)
+        scene.pipeNodeList.add(pipeNodeItem)
+        return pipeNodeItem
+    }
+
+    /**
+     * 添加问题点
+     */
+    fun addPoint(point: Point): PointItem {
+        val item = PointItem(point, null, scene.defaultPointScale)
+        item.isVisible = true
+        item.zOrder = 100000f
+        scene.pointItemList.add(item)
+        scene.addItem(item)
+        return item
+    }
+
+    /**
+     * 删除所有问题点
+     */
+    fun removeAllPoint() {
+        for (item in scene.pointItemList) {
+            scene.removeItem(item)
+        }
+        scene.pointItemList.clear()
+    }
+
+    /**
+     * 绘制二维码
+     */
+    fun addQrcode(point: Point) {
+        val item = QrcodeItem(point)
+        item.isVisible = true
+        item.zOrder = 100000f
+        scene.qrcodeItemList.add(item)
+        scene.addItem(item)
+    }
+
+    /**
+     * 删除所有二维码
+     */
+    fun removeAllQrcode() {
+        for (item in scene.qrcodeItemList) {
+            scene.removeItem(item)
+        }
+        scene.qrcodeItemList.clear()
+    }
+}

+ 2 - 0
demo/src/main/java/com/sybotan/android/demo/viewmodel/BaseViewModel.java

@@ -1,6 +1,8 @@
 package com.sybotan.android.demo.viewmodel;
 
 
+
+
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;

+ 4 - 4
demo/src/main/res/layout/activity_device_type.xml

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".activities.poc.DeviceTypeActivity">
 
-    <androidx.constraintlayout.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/topBarCl"
         android:layout_width="match_parent"
         android:layout_height="48dp"
@@ -38,7 +38,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-    </androidx.constraintlayout.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
     <ListView
         android:id="@+id/typeLv"
@@ -63,4 +63,4 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/typeLv" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 4
demo/src/main/res/layout/activity_record_info.xml

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".activities.poc.RecordInfoActivity">
 
-    <androidx.constraintlayout.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/topBarCl"
         android:layout_width="match_parent"
         android:layout_height="48dp"
@@ -38,7 +38,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-    </androidx.constraintlayout.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
     <androidx.appcompat.widget.AppCompatEditText
         android:id="@+id/recordEt"
@@ -68,4 +68,4 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 6
demo/src/main/res/layout/activity_relation.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout
+<androidx.constraintlayout.widget.ConstraintLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -7,7 +7,7 @@
         android:layout_height="match_parent"
         tools:context=".activities.poc.RelationActivity">
 
-    <androidx.constraintlayout.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/topBarTv"
             android:layout_width="match_parent"
             android:layout_height="48dp"
@@ -39,9 +39,9 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toTopOf="parent"/>
 
-    </androidx.constraintlayout.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
-    <androidx.constraintlayout.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/relationCl"
             android:layout_width="match_parent"
             android:layout_height="0dp"
@@ -104,7 +104,7 @@
                 app:layout_constraintBottom_toBottomOf="parent"
                 tools:listitem="@layout/item_relation"
         />
-    </androidx.constraintlayout.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
     <Button
             android:id="@+id/addBtn"
@@ -122,4 +122,4 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
     />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 4
demo/src/main/res/layout/activity_space.xml

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".activities.poc.SpaceActivity">
 
-    <androidx.constraintlayout.ConstraintLayout
+    <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/topBarTv"
         android:layout_width="match_parent"
         android:layout_height="48dp"
@@ -37,7 +37,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-    </androidx.constraintlayout.ConstraintLayout>
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
     <ExpandableListView
         android:id="@+id/expandLv"
@@ -48,4 +48,4 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/topBarTv" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
demo/src/main/res/layout/child_expand_space.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="48dp">
@@ -40,4 +40,4 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
demo/src/main/res/layout/group_expand_space.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="wrap_content"
     android:layout_height="56dp">
@@ -17,4 +17,4 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
demo/src/main/res/layout/item_device.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="48dp">
@@ -15,4 +15,4 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
demo/src/main/res/layout/item_relation.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                              android:layout_width="match_parent"
                                              android:layout_height="wrap_content"
                                              xmlns:app="http://schemas.android.com/apk/res-auto">
@@ -23,4 +23,4 @@
           app:layout_constraintEnd_toEndOf="parent"
           android:layout_marginEnd="16dp"
     />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 2 - 2
demo/src/main/res/layout/item_tree.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="48dp">
@@ -15,4 +15,4 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
-</androidx.constraintlayout.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 34 - 34
sybotan-android-base/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 sourceCompatibility = JVM_TARGET
 
@@ -153,36 +153,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android核心支持库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android核心支持库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}

+ 1 - 1
sybotan-android-base/src/main/java/com/sybotan/android/base/activities/SBaseActivity.kt

@@ -23,7 +23,7 @@
 
 package com.sybotan.android.base.activities
 
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import org.jetbrains.anko.toast
 import pub.devrel.easypermissions.AppSettingsDialog
 import pub.devrel.easypermissions.EasyPermissions

+ 34 - 34
sybotan-android-database/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 android {
     compileSdkVersion ANDROID_SDK_VERSION.toInteger()
@@ -134,36 +134,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android database库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android database库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}

+ 34 - 34
sybotan-android-devices/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 android {
     compileSdkVersion ANDROID_SDK_VERSION.toInteger()
@@ -127,36 +127,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android 设备支持库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android 设备支持库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}

+ 34 - 34
sybotan-android-graphy/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 android {
     compileSdkVersion ANDROID_SDK_VERSION.toInteger()
@@ -126,36 +126,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android Graphy框架库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android Graphy框架库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}

+ 1 - 0
sybotan-android-graphy/src/main/java/com/sybotan/android/graphy/SGraphyScene.kt

@@ -80,6 +80,7 @@ open class SGraphyScene {
      */
     open fun drawBackground(canvas: Canvas, rect: RectF) {
         canvas.drawColor(Color.WHITE)
+//        canvas.drawColor(Color.parseColor("#191B26"))
         return
     } // Function drawBackground()
 

+ 84 - 29
sybotan-android-graphy/src/main/java/com/sybotan/android/graphy/SGraphyView.kt

@@ -34,6 +34,8 @@ import com.sybotan.android.graphy.events.SGraphyViewZoomEvent
 import com.sybotan.android.graphy.utils.MatrixUtil
 import com.sybotan.base.extensions.toJson
 import org.greenrobot.eventbus.EventBus
+import java.util.concurrent.ExecutorService
+import java.util.concurrent.Executors
 import kotlin.math.max
 import kotlin.math.min
 
@@ -43,7 +45,7 @@ import kotlin.math.min
  * @author  庞利祥(sybotan@126.com)
  */
 open class SGraphyView(context: Context, attrs: AttributeSet? = null)
-    : SurfaceView(context, attrs), SurfaceHolder.Callback, View.OnTouchListener, GestureDetector.OnGestureListener, Runnable {
+    : SurfaceView(context, attrs), SurfaceHolder.Callback, View.OnTouchListener, GestureDetector.OnGestureListener {
 
     /**
      * 类对象
@@ -117,6 +119,56 @@ open class SGraphyView(context: Context, attrs: AttributeSet? = null)
     private var afterLength = 0.0f
     /** 后台绘制线程 */
     private var paintThread: Thread? = null
+    private var canvas: Canvas? = null
+
+    /** 线程池*/
+    private var executorService: ExecutorService? = null
+    private var runable = Runnable {
+        run {
+            while (true) {
+                if (Thread.interrupted()) {
+                    Log.e("sajkskjd", "线程终止了")
+                    break
+                }
+                if (isDrawing) {
+                    try {
+//                    Thread.sleep(100)
+                        canvas = holder.lockCanvas()
+                        if (null == canvas) {   // 如果canvas为空
+                            continue
+                        }
+                        drawScene(canvas!!)
+                        /*synchronized(holder) {
+                            drawScene(canvas!!)
+                        }*/
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                    } finally {
+                        try {
+                            if (null != canvas && null != holder) {
+                                holder.unlockCanvasAndPost(canvas)
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    fun runableTask() {
+        executorService = Executors.newSingleThreadExecutor()
+        executorService!!.execute(runable)
+    }
+
+    fun shutDown() {
+        if (null != executorService) {
+            executorService!!.shutdown()
+            executorService!!.shutdownNow()
+        }
+    }
+
 
     /** 默认构造函数 */
     init {
@@ -205,8 +257,9 @@ open class SGraphyView(context: Context, attrs: AttributeSet? = null)
 
         isDrawing = true
         // 启动后台绘制线程
-        paintThread = Thread(this)
-        paintThread!!.start()
+//        paintThread = Thread(this)
+//        paintThread!!.start()
+        runableTask()
         return
     } // Function surfaceCreated()
 
@@ -232,8 +285,10 @@ open class SGraphyView(context: Context, attrs: AttributeSet? = null)
     override fun surfaceDestroyed(holder: SurfaceHolder?) {
         Log.d(TAG, "surfaceDestroyed")
 
-        paintThread!!.interrupt()
-        paintThread = null
+//        paintThread!!.interrupt()
+//        paintThread = null
+        isDrawing = false
+        shutDown()
         return
     } // Function surfaceDestroyed()
 
@@ -420,30 +475,30 @@ open class SGraphyView(context: Context, attrs: AttributeSet? = null)
     /**
      * 重载线程run函数。
      */
-    override fun run() {
-        while(null != paintThread && !paintThread!!.isInterrupted) {      // 循环控制绘制
-            var canvas: Canvas? = null
-            try {
-                Thread.sleep(100)
-                canvas = holder.lockCanvas()
-                if (null == canvas) {   // 如果canvas为空
-                    continue
-                }
-                synchronized(holder) {
-                    drawScene(canvas)
-                }
-            } catch (e: Exception) {
-                e.printStackTrace()
-
-            } finally {
-                if (null != canvas) {
-                    holder.unlockCanvasAndPost(canvas)
-                }
-            }
-        }
-
-        return
-    } // Function run()
+//    override fun run() {
+//        while(null != paintThread && !paintThread!!.isInterrupted) {      // 循环控制绘制
+//            var canvas: Canvas? = null
+//            try {
+//                Thread.sleep(100)
+//                canvas = holder.lockCanvas()
+//                if (null == canvas) {   // 如果canvas为空
+//                    continue
+//                }
+//                synchronized(holder) {
+//                    drawScene(canvas)
+//                }
+//            } catch (e: Exception) {
+//                e.printStackTrace()
+//
+//            } finally {
+//                if (null != canvas) {
+//                    holder.unlockCanvasAndPost(canvas)
+//                }
+//            }
+//        }
+//
+//        return
+//    } // Function run()
 
     /**
      * 后台场景绘制线程

+ 34 - 34
sybotan-android-views/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 android {
     compileSdkVersion ANDROID_SDK_VERSION.toInteger()
@@ -141,36 +141,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android view组件库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android view组件库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}

+ 34 - 34
sybotan-android-works/build.gradle

@@ -29,7 +29,7 @@ apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 
 apply plugin: 'org.jetbrains.dokka-android'
-apply plugin: 'maven'
+//apply plugin: 'maven'
 
 android {
     compileSdkVersion ANDROID_SDK_VERSION.toInteger()
@@ -141,36 +141,36 @@ artifacts {
     // archives javadocJar
 }
 
-uploadArchives {
-    repositories {
-        mavenDeployer {
-            pom.groupId = project.group
-            pom.version = project.version
-            pom.artifactId = project.name
-            pom.project {
-                name project.name
-                packaging 'jar'
-                url SAGA_URL
-                description '斯伯坦机器人世界 android works组件库。'
-                licenses {
-                    license {
-                        name 'The Apache Software License, Version 2.0'
-                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-                    }
-                }
-                developers {
-                    developer {
-                        id DEVELOPER_ID
-                        name DEVELOPER_NAME
-                    }
-                }
-            }
-            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-            repository(url: MAVEN_REPO_RELEASE_URL) {
-                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
-            }
-        }
-    }
-}
+//uploadArchives {
+//    repositories {
+//        mavenDeployer {
+//            pom.groupId = project.group
+//            pom.version = project.version
+//            pom.artifactId = project.name
+//            pom.project {
+//                name project.name
+//                packaging 'jar'
+//                url SAGA_URL
+//                description '斯伯坦机器人世界 android works组件库。'
+//                licenses {
+//                    license {
+//                        name 'The Apache Software License, Version 2.0'
+//                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+//                    }
+//                }
+//                developers {
+//                    developer {
+//                        id DEVELOPER_ID
+//                        name DEVELOPER_NAME
+//                    }
+//                }
+//            }
+//            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//            repository(url: MAVEN_REPO_RELEASE_URL) {
+//                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
+//            }
+//        }
+//    }
+//}