重构测量工具代码,修改代码逻辑和展现形式。

增加面积,角度测量
修改地图渲染面会崩溃的问题
This commit is contained in:
squallzhjch
2023-08-10 11:18:14 +08:00
parent 8578ea0afd
commit 4baa137ad6
14 changed files with 679 additions and 284 deletions

View File

@@ -9,6 +9,7 @@ import android.util.Log
import android.view.MotionEvent
import android.view.View
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
@@ -20,7 +21,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.NIMapOptions
import com.navinfo.collect.library.map.handler.MeasureLayerHandler
import com.navinfo.omqs.Constant
import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig
@@ -397,9 +398,124 @@ class MainActivity : BaseActivity() {
supportFragmentManager.beginTransaction()
.add(R.id.console_fragment_layout, ConsoleFragment()).commit()
}
initMeasuringTool()
}
//根据输入的经纬度跳转坐标
/**
*初始化测量工具栏的点击事件
*/
private fun initMeasuringTool() {
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_select_point)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_close)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_backspace)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_reset)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_distance)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_area)
.setOnClickListener(measuringToolClickListener)
root.findViewById<View>(R.id.measuring_tool_angle)
.setOnClickListener(measuringToolClickListener)
}
/**
* 测量工具点击事件
*/
private val measuringToolClickListener = View.OnClickListener {
when (it.id) {
//选点
R.id.measuring_tool_select_point -> {
viewModel.addPointForMeasuringTool()
}
//关闭
R.id.measuring_tool_close -> {
measuringToolOff()
}
//上一步
R.id.measuring_tool_backspace -> {
viewModel.backPointForMeasuringTool()
}
//重绘
R.id.measuring_tool_reset -> {
viewModel.resetMeasuringTool()
}
//测距
R.id.measuring_tool_distance -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测面积
R.id.measuring_tool_area -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.AREA)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
//测角度
R.id.measuring_tool_angle -> {
it.isSelected = true
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.ANGLE)
val root = binding.mainActivityMeasuringTool.root
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = false
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
}
}
}
/**
* 开始测量
*/
private fun measuringToolOn() {
val root = binding.mainActivityMeasuringTool.root
val valueView = root.findViewById<TextView>(R.id.measuring_tool_value)
val unitView = root.findViewById<TextView>(R.id.measuring_tool_value_unit)
val centerTextView = binding.mainActivityHomeCenterText
//监听测距值
mapController.measureLayerHandler.measureValueLiveData.observe(this) {
valueView.text = it.valueString
unitView.text = it.unit
}
mapController.measureLayerHandler.tempMeasureValueLiveData.observe(this)
{
centerTextView.text = "${it.valueString}${it.unit}"
}
viewModel.setMeasuringToolEnable(true)
binding.mainActivityHomeCenter.visibility = View.VISIBLE
binding.mainActivityHomeCenterText.visibility = View.VISIBLE
viewModel.setMeasuringToolType(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
root.visibility = View.VISIBLE
root.findViewById<View>(R.id.measuring_tool_distance).isSelected = true
root.findViewById<View>(R.id.measuring_tool_area).isSelected = false
root.findViewById<View>(R.id.measuring_tool_angle).isSelected = false
}
/**
* 结束测量
*/
private fun measuringToolOff() {
//监听测距值
mapController.measureLayerHandler.measureValueLiveData.removeObservers(this)
mapController.measureLayerHandler.tempMeasureValueLiveData.removeObservers(this)
viewModel.setMeasuringToolEnable(false)
binding.mainActivityHomeCenter.visibility = View.GONE
binding.mainActivityHomeCenterText.visibility = View.GONE
binding.mainActivityMeasuringTool.root.visibility = View.GONE
}
/**
* 根据输入的经纬度跳转坐标
*/
fun jumpPosition() {
val view = this.layoutInflater.inflate(R.layout.dialog_view_edittext, null)
val inputDialog = MaterialAlertDialogBuilder(
@@ -488,10 +604,10 @@ class MainActivity : BaseActivity() {
}
/**
* 点击计算
* 点击测速
*/
fun onClickCalcDisance() {
fun onClickCalcDistance() {
measuringToolOn()
}
/**
@@ -825,7 +941,7 @@ class MainActivity : BaseActivity() {
}
}
private fun showMainActivityBottomSheetGroup(){
private fun showMainActivityBottomSheetGroup() {
binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE
mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65)
mapController.mMapView.vtmMap.animator().animateTo(
@@ -836,7 +952,7 @@ class MainActivity : BaseActivity() {
)
}
private fun hideMainActivityBottomSheetGroup(){
private fun hideMainActivityBottomSheetGroup() {
binding.mainActivityBottomSheetGroup.visibility = View.GONE
mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5)
mapController.mMapView.vtmMap.animator().animateTo(

View File

@@ -22,16 +22,12 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.findNavController
import com.blankj.utilcode.util.ToastUtils
import com.blankj.utilcode.util.ViewUtils.runOnUiThread
import com.navinfo.collect.library.data.dao.impl.TraceDataBase
import com.navinfo.collect.library.data.entity.*
import com.navinfo.collect.library.garminvirbxe.HostBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.OnGeoPointClickListener
import com.navinfo.collect.library.map.handler.ONNoteItemClickListener
import com.navinfo.collect.library.map.handler.OnNiLocationItemListener
import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener
import com.navinfo.collect.library.map.handler.*
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant
@@ -59,10 +55,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.locationtech.jts.geom.Point
import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition
import org.oscim.layers.marker.MarkerItem
import org.oscim.map.Map
import org.videolan.libvlc.LibVlcUtil
import java.io.File
@@ -174,6 +168,17 @@ class MainViewModel @Inject constructor(
*/
private var bSelectPauseTrace = false
/**
* 是不是开启测距
*/
private var bMeasuringTool = false
/**
* 测量类型
*/
var measuringType: MeasureLayerHandler.MEASURE_TYPE =
MeasureLayerHandler.MEASURE_TYPE.DISTANCE
var linkIdCache = ""
private var lastNiLocaion: NiLocation? = null
@@ -219,12 +224,16 @@ class MainViewModel @Inject constructor(
object : OnGeoPointClickListener {
override fun onMapClick(tag: String, point: GeoPoint) {
if (tag == TAG) {
viewModelScope.launch(Dispatchers.IO) {
//线选择状态
if (bSelectRoad) {
captureLink(point)
} else {
captureItem(point)
if (bMeasuringTool) {
mapController.measureLayerHandler.addPoint(measuringType, point)
} else {
viewModelScope.launch(Dispatchers.IO) {
//线选择状态
if (bSelectRoad) {
captureLink(point)
} else {
captureItem(point)
}
}
}
}
@@ -1028,12 +1037,12 @@ class MainViewModel @Inject constructor(
val nextNiLocation =
mapController.markerHandle.getNILocation(currentIndexNiLocation + 1)
if (nextNiLocation != null && niLocation != null) {
var nilocationDisTime =
var niLocationDisTime =
nextNiLocation.timeStamp.toLong() - niLocation.timeStamp.toLong()
disTime = if (nilocationDisTime < 1000) {
disTime = if (niLocationDisTime < 1000) {
1000
} else {
nilocationDisTime
niLocationDisTime
}
showMarker(mapController.mMapView.context, nextNiLocation)
currentIndexNiLocation += 1
@@ -1053,5 +1062,45 @@ class MainViewModel @Inject constructor(
fun cancelTrace() {
timer?.cancel()
}
/**
* 开启测量工具
*/
fun setMeasuringToolEnable(b: Boolean) {
bMeasuringTool = b
mapController.measureLayerHandler.clear()
}
/**
* 测量打点
*/
fun addPointForMeasuringTool() {
mapController.measureLayerHandler.addPoint(measuringType)
}
/**
* 测距回退点
*/
fun backPointForMeasuringTool() {
mapController.measureLayerHandler.backspacePoint()
}
/**
* 重绘
*/
fun resetMeasuringTool() {
mapController.measureLayerHandler.clear()
}
/**
* 设置测量类型 0距离 2面积 3角度
*/
fun setMeasuringToolType(type: MeasureLayerHandler.MEASURE_TYPE) {
if(measuringType != type) {
measuringType = type
mapController.measureLayerHandler.clear()
}
}
}

View File

@@ -1,6 +1,5 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -38,7 +37,7 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
arguments?.let {
val id = it.getString("TaskLinkId")
if (id != null && id.isNotEmpty()){
if (id != null && id.isNotEmpty()) {
viewModel.initData(id)
}
}
@@ -97,11 +96,11 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
/**
* 线长度
*/
mapController.measureLayerHandler.lineLengthLiveData.observe(viewLifecycleOwner) {
mapController.measureLayerHandler.measureValueLiveData.observe(viewLifecycleOwner) {
binding.taskLinkLength.text = "${it}"
}
mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) {
(activity as MainActivity).setHomeCenterText(it)
mapController.measureLayerHandler.tempMeasureValueLiveData.observe(viewLifecycleOwner) {
(activity as MainActivity).setHomeCenterText("${it.valueString}${it.unit}")
}
}
@@ -159,7 +158,7 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
binding.taskLinkClear -> {
viewModel.clearLink()
}
binding.taskLinkBarDelete ->{
binding.taskLinkBarDelete -> {
viewModel.deleteData(requireContext())
}
}

View File

@@ -1,10 +1,7 @@
package com.navinfo.omqs.ui.fragment.tasklink
import android.app.Dialog
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@@ -13,18 +10,15 @@ import com.navinfo.collect.library.data.entity.LinkInfoBean
import com.navinfo.collect.library.data.entity.QsRecordBean
import com.navinfo.collect.library.data.entity.TaskBean
import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.MeasureLayerHandler
import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.omqs.Constant
import com.navinfo.omqs.ui.dialog.FirstDialog
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.Realm
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.bson.codecs.UuidCodec
import org.bson.internal.UuidHelper
import org.oscim.core.GeoPoint
import java.util.UUID
import javax.inject.Inject
@@ -136,7 +130,7 @@ class TaskLinkViewModel @Inject constructor(
* 编辑点
*/
fun addPoint() {
mapController.measureLayerHandler.drawLineOrPolygon(false)
mapController.measureLayerHandler.addPoint(MeasureLayerHandler.MEASURE_TYPE.DISTANCE)
}
/**
@@ -198,7 +192,7 @@ class TaskLinkViewModel @Inject constructor(
if (hadLinkDvoBean != null) {
hadLinkDvoBean!!.taskId = liveDataTaskBean.value!!.id
hadLinkDvoBean!!.length =
mapController.measureLayerHandler.lineLengthLiveData.value!!
mapController.measureLayerHandler.measureValueLiveData.value!!.value
hadLinkDvoBean!!.geometry =
GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points)
hadLinkDvoBean!!.linkInfo = LinkInfoBean(
@@ -218,7 +212,7 @@ class TaskLinkViewModel @Inject constructor(
taskId = liveDataTaskBean.value!!.id,
linkPid = UUID.randomUUID().toString(),
linkStatus = 3,
length = mapController.measureLayerHandler.lineLengthLiveData.value!!,
length = mapController.measureLayerHandler.measureValueLiveData.value!!.value,
geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
linkInfo = LinkInfoBean(
kind = liveDataSelectKind.value!!.type,
@@ -256,7 +250,7 @@ class TaskLinkViewModel @Inject constructor(
* 绘制线的时候回退点
*/
fun removeLinkLastPoint() {
mapController.measureLayerHandler.drawLineBackspace()
mapController.measureLayerHandler.backspacePoint()
}
/**

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 B

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_rect_white_press_6dp_bg" android:state_selected="true"></item>
<item android:drawable="@drawable/shape_rect_white_press_6dp_bg" android:state_pressed="true"></item>
<item android:drawable="@drawable/shape_rect_white_6dp_bg" />
</selector>

View File

@@ -7,7 +7,7 @@
android:bottomRightRadius="6dp"
android:topLeftRadius="6dp"
android:topRightRadius="6dp" />
<stroke android:width="1dp" android:color="@color/blue"/>
<solid android:color="#2632335e" />
</shape>

View File

@@ -101,7 +101,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/top_right_drawer_btns_mr"
app:constraint_referenced_ids="main_activity_note,main_activity_task_line,main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_calc_disance,main_activity_menu"
app:constraint_referenced_ids="main_activity_note,main_activity_task_line,main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_calc_distance,main_activity_menu"
app:flow_horizontalGap="6dp"
app:flow_wrapMode="aligned"
app:layout_constraintRight_toLeftOf="@id/main_activity_right_fragment"
@@ -112,7 +112,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_note,main_activity_task_line,main_activity_calc_disance" />
app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_note,main_activity_task_line,main_activity_calc_distance" />
<ImageButton
android:id="@+id/main_activity_serach"
@@ -139,9 +139,9 @@
android:src="@drawable/icon_trace" />
<ImageButton
android:id="@+id/main_activity_calc_disance"
android:id="@+id/main_activity_calc_distance"
style="@style/top_right_drawer_btns_style"
android:onClick="@{()->mainActivity.onClickCalcDisance()}"
android:onClick="@{()->mainActivity.onClickCalcDistance()}"
android:src="@drawable/icon_calc_disance" />
<ImageButton
@@ -164,6 +164,15 @@
android:elevation="2dp"
android:onClick="@{()->mainActivity.onClickMenu()}" />
<include
android:id="@+id/main_activity_measuring_tool"
layout="@layout/main_measuring_tool"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:visibility="gone"
app:layout_constraintRight_toRightOf="@id/main_activity_calc_distance"
app:layout_constraintTop_toBottomOf="@id/main_activity_flow" />
<androidx.constraintlayout.widget.Barrier
android:layout_width="wrap_content"
@@ -333,12 +342,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/five"
app:constraint_referenced_ids="main_activity_snapshot_finish,main_activity_trace_snapshot_points,main_activity_snapshot_media_flag,main_activity_snapshot_rewind,main_activity_snapshot_pause,main_activity_snapshot_next,main_activity_menu_indoor_group"
app:constraint_referenced_ids="main_activity_snapshot_finish,main_activity_trace_snapshot_points,main_activity_snapshot_rewind,main_activity_snapshot_pause,main_activity_snapshot_next,main_activity_menu_indoor_group"
app:flow_horizontalGap="6dp"
app:flow_wrapMode="aligned"
app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet" />
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.Group
android:id="@+id/main_activity_menu_indoor_group"
@@ -359,12 +368,12 @@
android:onClick="@{()->mainActivity.tracePointsOnclick()}"
android:src="@drawable/map_trace_select_point" />
<!-- <ImageButton
android:id="@+id/main_activity_snapshot_media_flag"
style="@style/top_right_drawer_btns_style"
android:visibility="gone"
android:onClick="@{()->mainActivity.mediaFlagOnclick()}"
android:src="@drawable/map_trace_mediaflag" />-->
<!-- <ImageButton
android:id="@+id/main_activity_snapshot_media_flag"
style="@style/top_right_drawer_btns_style"
android:visibility="gone"
android:onClick="@{()->mainActivity.mediaFlagOnclick()}"
android:src="@drawable/map_trace_mediaflag" />-->
<ImageButton
android:id="@+id/main_activity_snapshot_rewind"

View File

@@ -3,31 +3,48 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_rect_white_6dp_bg"
android:clickable="true"
android:gravity="center"
android:orientation="horizontal">
android:orientation="horizontal"
android:padding="5dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/measuring_tool_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="24dp"
android:background="@drawable/shape_bg_blue_bg_4_radius"
android:textColor="@color/white" />
android:gravity="center"
android:minWidth="65dp"
android:text="0"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/measuring_tool_value_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/blue" />
android:text="米"
android:textColor="@color/blue"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/measuring_tool_select_point"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:gravity="center"
android:orientation="vertical">
android:orientation="vertical"
android:paddingLeft="6dp"
android:paddingRight="6dp">
<ImageView
android:layout_width="24dp"
@@ -43,10 +60,16 @@
</LinearLayout>
<LinearLayout
android:id="@+id/measuring_tool_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/selector_default_button_white_bg"
android:gravity="center"
android:orientation="vertical">
android:orientation="vertical"
android:paddingLeft="6dp"
android:paddingRight="6dp">
<ImageView
android:layout_width="24dp"
@@ -62,8 +85,12 @@
</LinearLayout>
<LinearLayout
android:id="@+id/measuring_tool_area"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/selector_default_button_white_bg"
android:gravity="center"
android:orientation="vertical">
@@ -81,8 +108,12 @@
</LinearLayout>
<LinearLayout
android:id="@+id/measuring_tool_angle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/selector_default_button_white_bg"
android:gravity="center"
android:orientation="vertical">
@@ -100,20 +131,36 @@
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/measuring_tool_backspace"
android:layout_width="80dp"
android:layout_height="32dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/shape_rect_transparent_blue_6dp_bg"
android:drawableLeft="@drawable/baseline_arrow_left_24"
android:drawablePadding="-15dp"
android:gravity="center"
android:text="上一步"
android:textColor="@color/blue"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/baseline_arrow_left_24"
android:id="@+id/measuring_tool_reset"
android:layout_width="80dp"
android:layout_height="32dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/shape_rect_transparent_blue_6dp_bg"
android:gravity="center"
android:text="重"
android:text="重"
android:textColor="@color/blue"
android:textSize="12sp" />
<ImageView
android:id="@+id/measuring_tool_close"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/measuring_tool_close" />
</LinearLayout>