Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
SuZhouAvp
Commits
bb95327c
Commit
bb95327c
authored
Sep 12, 2025
by
罗小雨
Browse files
本地模拟感知物数据实现变红、清除感知物
parent
36c48341
Changes
11
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/bean/PerTargetTest.kt
0 → 100644
View file @
bb95327c
package
com.sd.cavphmi.bean
/**
* 感知目标物实体
****/
class
PerTargetTest
:
ArrayList
<
PerTargetTestItem
>()
data class
PerTargetTestItem
(
val
id
:
String
,
val
accessTime
:
Long
,
val
deviceId
:
String
,
val
deviceCode
:
String
,
val
intersectionCode
:
String
,
val
participants
:
List
<
ParticipantTest
>,
val
receiveTime
:
Long
,
val
reportTime
:
Long
,
// val statistic: Statistic
)
data class
ParticipantTest
(
val
color
:
Int
,
val
gear
:
Int
,
val
heading
:
Double
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
ptcId
:
String
,
val
ptcType
:
String
,
val
speed
:
Double
,
var
aniTime
:
Long
,
var
isFlash
:
Boolean
,
var
isRed
:
Boolean
)
data class
StatisticTest
(
val
ambulance
:
Int
,
val
bike
:
Int
,
val
bus
:
Int
,
val
car
:
Int
,
val
coach
:
Int
,
val
concrete_mixer
:
Int
,
val
conical_barrel
:
Int
,
val
electric_bicycle
:
Int
,
val
engine_emergency
:
Int
,
val
fire_truck
:
Int
,
val
heavy_truck
:
Int
,
val
large_truck
:
Int
,
val
micro_truck
:
Int
,
val
midibus
:
Int
,
val
minibus
:
Int
,
val
motorcycle
:
Int
,
val
mpv
:
Int
,
val
pedestrian
:
Int
,
val
pickup
:
Int
,
val
police_car
:
Int
,
val
small_truck
:
Int
,
val
spillage
:
Int
,
val
suv
:
Int
,
val
tank_truck
:
Int
,
val
tricycle
:
Int
,
val
truck
:
Int
,
val
unknown
:
Int
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/highmap/HighMapApi.kt
View file @
bb95327c
package
com.sd.cavphmi.highmap
package
com.sd.cavphmi.highmap
import
com.google.gson.Gson
import
com.google.gson.Gson
import
com.ltzw.adasdriver.highmap.TileJsonBean
import
com.unity3d.player.UnityPlayer
import
com.unity3d.player.UnityPlayer
...
...
app/src/main/java/com/sd/cavphmi/highmap/PtcData.kt
View file @
bb95327c
package
com.sd.cavphmi.highmap
package
com.sd.cavphmi.highmap
import
com.ltzw.adasdriver.utils.MyContants
/**
/**
* 感知物数据
* 感知物数据
...
...
app/src/main/java/com/sd/cavphmi/highmap/TileJsonBean.kt
View file @
bb95327c
package
com.sd.cavphmi.highmap
package
com.sd.cavphmi.highmap
import
com.ltzw.adasdriver.utils.MyContants
import
com.sd.cavphmi.utils.MyContants
/**
/**
* 给unity 初始化json
* 给unity 初始化json
...
...
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
bb95327c
package
com.sd.cavphmi.ui
package
com.sd.cavphmi.ui
import
android.os.Handler
import
android.util.Log
import
android.view.KeyEvent
import
android.view.KeyEvent
import
android.widget.RelativeLayout
import
android.widget.RelativeLayout
import
android.widget.Toast
import
android.widget.Toast
...
@@ -10,6 +12,8 @@ import com.sd.cavphmi.R
...
@@ -10,6 +12,8 @@ import com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseActivity
import
com.sd.cavphmi.base.BaseActivity
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.highmap.HighMapApi
import
com.sd.cavphmi.highmap.UnityPtc
import
com.sd.cavphmi.intfaces.OnConCan
import
com.sd.cavphmi.intfaces.OnConCan
import
com.sd.cavphmi.ui.fragment.CarPanelFragment
import
com.sd.cavphmi.ui.fragment.CarPanelFragment
import
com.sd.cavphmi.ui.fragment.ExoPlayFragment
import
com.sd.cavphmi.ui.fragment.ExoPlayFragment
...
@@ -59,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
...
@@ -59,7 +63,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
//exo播放器
//exo播放器
private
val
exoPlayFragment
by
lazy
{
ExoPlayFragment
.
newInstance
()
}
private
val
exoPlayFragment
by
lazy
{
ExoPlayFragment
.
newInstance
()
}
override
fun
initView
()
{
override
fun
initView
()
{
mainVm
.
mockVM
=
mockVM
mainVm
.
mockVM
=
mockVM
//车辆仪表
//车辆仪表
...
@@ -102,15 +105,45 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
...
@@ -102,15 +105,45 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>(),
}
}
//感知目标物
//感知目标物
binding
.
btTarget
.
setOnClickListener
{
binding
.
btTarget
.
setOnClickListener
{
mainVm
.
subTarget
()
mainVm
.
subTarget
().
observe
(
this
)
{
if
(
it
.
size
==
0
){
HighMapApi
.
clearPtcData
()
return
@observe
}
it
.
forEachIndexed
{
index
,
perTargetTestItem
->
var
list
=
perTargetTestItem
.
participants
val
ptcList
:
MutableList
<
UnityPtc
>
=
ArrayList
(
list
.
size
)
list
.
forEachIndexed
{
index
,
item
->
var
unityPtc
=
UnityPtc
()
unityPtc
.
lat
=
item
.
latitude
unityPtc
.
lon
=
item
.
longitude
unityPtc
.
ptcid
=
item
.
ptcId
unityPtc
.
heading
=
item
.
heading
// unityPtc.aniTime=ptc.aniTime
unityPtc
.
aniTime
=
1
if
(
item
.
ptcType
==
"car"
)
{
unityPtc
.
pType
=
1
}
else
{
unityPtc
.
pType
=
2
}
// unityPtc.isFlash=ptc.isFlash
// unityPtc.isRed=ptc.isRed
unityPtc
.
isFlash
=
true
unityPtc
.
isRed
=
true
ptcList
.
add
(
unityPtc
)
}
HighMapApi
.
setPtcData
(
ptcList
)
}
}
}
}
//v2x 预警
//v2x 预警
binding
.
btV2x
.
setOnClickListener
{
binding
.
btV2x
.
setOnClickListener
{
mainVm
.
subStartV2x
()
mainVm
.
subStartV2x
()
}
}
//模拟选择车辆
//模拟选择车辆
binding
.
btSetcar
.
setOnClickListener
{
binding
.
btSetcar
.
setOnClickListener
{
var
list
=
listOf
(
"skywell.1ggvlp16.car10"
,
"skywell.1ggvlp16.car8"
)
var
list
=
listOf
(
"skywell.1ggvlp16.car10"
,
"skywell.1ggvlp16.car8"
)
val
dialog
=
CustomListDialog
(
this
,
"选择车辆"
,
list
)
val
dialog
=
CustomListDialog
(
this
,
"选择车辆"
,
list
)
dialog
.
setOnItemClickListener
(
this
)
dialog
.
setOnItemClickListener
(
this
)
dialog
.
show
()
dialog
.
show
()
...
...
app/src/main/java/com/sd/cavphmi/ui/fragment/CarPanelFragment.kt
View file @
bb95327c
...
@@ -117,11 +117,11 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() {
...
@@ -117,11 +117,11 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() {
override
fun
initListener
()
{
override
fun
initListener
()
{
mainVm
.
carVehicle
.
observe
(
this
)
{
mainVm
.
carVehicle
.
observe
(
this
)
{
//更新车辆仪表,这里模拟只取第一个
viewModel
.
setCarPanelBean
(
it
)
viewModel
.
setCarPanelBean
(
it
)
for
(
item
in
it
){
for
(
item
in
it
){
Log
.
e
(
"Car"
,
"------车辆位姿数据----$item"
)
Log
.
e
(
"Car"
,
"------车辆位姿数据----$item"
)
HighMapApi
.
setCarPosition
(
20.80189f
,
item
.
heading
,
item
.
latitude
,
item
.
longitude
)
HighMapApi
.
setCarPosition
(
item
.
heading
,
item
.
latitude
,
item
.
longitude
,
item
.
elevation
.
toDouble
())
// HighMapApi.setCarPosition(item.heading,item.latitude,item.longitude,20.80189)
}
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/utils/MyContants.kt
View file @
bb95327c
...
@@ -6,7 +6,8 @@ object MyContants {
...
@@ -6,7 +6,8 @@ object MyContants {
// var HOST = "https://itg-dev.cu-sc.com:19443/"
// var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动
//开发环境切勿动
var
HOST
=
"https://itg-yz.cu-sc.com:13443"
var
HOST
=
"https://itg-yz.cu-sc.com:13443"
//智网生产环境地址用于拼接3dtile.json
var
HOST_HTTP_3
=
"https://itg-yz.cu-sc.com:13443"
/***测试环境socket token***/
/***测试环境socket token***/
private
val
WSTOKEN
=
private
val
WSTOKEN
=
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
...
@@ -19,12 +20,13 @@ object MyContants {
...
@@ -19,12 +20,13 @@ object MyContants {
// private val reType = "51world"
// private val reType = "51world"
//跟踪车辆的ID 267(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8
//跟踪车辆的ID 267(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8
private
val
VEHICLEID
=
"skywell.1ggvlp16.car8"
private
val
VEHICLEID
=
"skywell.1ggvlp16.car8"
//
var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&vehicleId=${VEHICLEID}&"
var
WSHOST
=
"wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&vehicleId=${VEHICLEID}&"
var
WSHOST
=
"wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&vehicleId=7&"
//
var WSHOST = "wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&vehicleId=7&"
// var PORT = if (IS_DEBUG) "123" else "34534"
// var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物 &intersectionCode=17 停车场 不传就是整个园区***/
/***感知目标物 &intersectionCode=17 停车场 不传就是整个园区***/
var
WS_FEEL_TARGET
=
"${WSHOST}msgType=1&intersectionCode=17"
// var WS_FEEL_TARGET = "${WSHOST}msgType=1&intersectionCode=17"
var
WS_FEEL_TARGET
=
"wss://172.24.124.130:19443/wsplus/socket?token=121&reType=freedo&&msgType=1&intersectionCode=17"
/***网联车辆位姿 &vehicleId=***/
/***网联车辆位姿 &vehicleId=***/
// var WS_VEH_LOC = "${WSHOST}msgType=2"
// var WS_VEH_LOC = "${WSHOST}msgType=2"
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
bb95327c
...
@@ -9,6 +9,7 @@ import com.sd.cavphmi.base.MyBaseViewModel
...
@@ -9,6 +9,7 @@ import com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.AvpStatuBean
import
com.sd.cavphmi.bean.AvpStatuBean
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTargetTest
import
com.sd.cavphmi.bean.SpaceInfoBean
import
com.sd.cavphmi.bean.SpaceInfoBean
import
com.sd.cavphmi.bean.V2xStartBean
import
com.sd.cavphmi.bean.V2xStartBean
import
com.sd.cavphmi.bean.VToXImgBean
import
com.sd.cavphmi.bean.VToXImgBean
...
@@ -71,7 +72,7 @@ class MainVm @Inject constructor(
...
@@ -71,7 +72,7 @@ class MainVm @Inject constructor(
lateinit
var
mockVM
:
MockVM
lateinit
var
mockVM
:
MockVM
//是否需要模拟
//是否需要模拟
var
isMock
=
fals
e
var
isMock
=
tru
e
//车辆位姿数据
//车辆位姿数据
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
...
@@ -80,7 +81,7 @@ class MainVm @Inject constructor(
...
@@ -80,7 +81,7 @@ class MainVm @Inject constructor(
var
vehDetail
=
MutableLiveData
<
VehDetailBean
>()
var
vehDetail
=
MutableLiveData
<
VehDetailBean
>()
//感知目标物
//感知目标物
var
targetPre
=
MutableLiveData
<
PerTarget
>()
var
targetPre
=
MutableLiveData
<
PerTarget
Test
>()
//v2x 预警
//v2x 预警
var
v2xStartBean
=
MutableLiveData
<
V2xStartBean
>()
var
v2xStartBean
=
MutableLiveData
<
V2xStartBean
>()
...
@@ -212,7 +213,7 @@ class MainVm @Inject constructor(
...
@@ -212,7 +213,7 @@ class MainVm @Inject constructor(
/**感知目标物数据
/**感知目标物数据
*传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据
*传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据
*/
*/
fun
subTarget
():
LiveData
<
PerTarget
>
{
fun
subTarget
():
LiveData
<
PerTarget
Test
>
{
if
(
isMock
)
{
if
(
isMock
)
{
mockVM
.
onSubTargetMock
(
targetPre
)
mockVM
.
onSubTargetMock
(
targetPre
)
}
else
{
}
else
{
...
@@ -221,7 +222,7 @@ class MainVm @Inject constructor(
...
@@ -221,7 +222,7 @@ class MainVm @Inject constructor(
override
fun
onMsg
(
str
:
String
)
{
override
fun
onMsg
(
str
:
String
)
{
viewModelScope
.
launch
{
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"PerTarget.txt"
)
FileIoUtils
.
writeToFile
(
str
,
"PerTarget.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
::
class
.
java
)
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
Test
::
class
.
java
)
targetPre
.
postValue
(
bean
)
targetPre
.
postValue
(
bean
)
}
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
View file @
bb95327c
...
@@ -10,6 +10,7 @@ import com.sd.cavphmi.bean.CarPanelBean
...
@@ -10,6 +10,7 @@ import com.sd.cavphmi.bean.CarPanelBean
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicleItem
import
com.sd.cavphmi.bean.CarVehicleItem
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTargetTest
import
com.sd.cavphmi.bean.V2xStartBean
import
com.sd.cavphmi.bean.V2xStartBean
import
com.sd.cavphmi.utils.FileIoUtils
import
com.sd.cavphmi.utils.FileIoUtils
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.lifecycle.HiltViewModel
...
@@ -58,13 +59,13 @@ class MockVM @Inject constructor(
...
@@ -58,13 +59,13 @@ class MockVM @Inject constructor(
//感知目标物
//感知目标物
fun
onSubTargetMock
(
targetPre
:
MutableLiveData
<
PerTarget
>)
{
fun
onSubTargetMock
(
targetPre
:
MutableLiveData
<
PerTarget
Test
>)
{
viewModelScope
.
launch
{
viewModelScope
.
launch
{
val
parts
=
mutableListOf
<
String
>()
val
parts
=
mutableListOf
<
String
>()
FileIoUtils
.
getAssetMock
(
context
,
"mock/PerTarget.txt"
,
parts
)
FileIoUtils
.
getAssetMock
(
context
,
"mock/PerTarget.txt"
,
parts
)
parts
.
forEach
{
str
->
parts
.
forEach
{
str
->
delay
(
1000
)
delay
(
1000
)
var
bean
=
parseDataBean
(
str
,
PerTarget
::
class
.
java
)
var
bean
=
parseDataBean
(
str
,
PerTarget
Test
::
class
.
java
)
// println("------模拟感知目标物数据 = ${bean}")
// println("------模拟感知目标物数据 = ${bean}")
// println("------模拟感知目标物typeName = ${bean.typeName}")
// println("------模拟感知目标物typeName = ${bean.typeName}")
// println("------模拟感知目标物type = ${bean.type}")
// println("------模拟感知目标物type = ${bean.type}")
...
...
app/src/main/java/com/sd/cavphmi/websockets/FeelTargetWSClient.kt
View file @
bb95327c
...
@@ -3,15 +3,27 @@ package com.sd.cavphmi.websockets
...
@@ -3,15 +3,27 @@ package com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
org.java_websocket.handshake.ServerHandshake
import
java.net.Socket
import
java.net.URI
import
java.net.URI
import
java.nio.ByteBuffer
import
java.nio.ByteBuffer
import
java.security.SecureRandom
import
java.security.cert.X509Certificate
import
javax.net.ssl.SSLContext
import
javax.net.ssl.SSLEngine
import
javax.net.ssl.SSLSocketFactory
import
javax.net.ssl.TrustManager
import
javax.net.ssl.X509ExtendedTrustManager
/*****感知目标物**/
/*****感知目标物**/
class
FeelTargetWSClient
:
WebSocketClient
{
class
FeelTargetWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----FeelTargetWSClient"
private
val
TAG
=
"-----FeelTargetWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
){
if
(
serverUri
.
toString
().
contains
(
"wss://"
)){
trustAllHosts
()
}
}
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
...
@@ -55,5 +67,63 @@ class FeelTargetWSClient : WebSocketClient {
...
@@ -55,5 +67,63 @@ class FeelTargetWSClient : WebSocketClient {
fun
onMsg
(
str
:
String
)
fun
onMsg
(
str
:
String
)
}
}
private
fun
trustAllHosts
()
{
val
trustAllCerts
=
arrayOf
<
TrustManager
>(
object
:
X509ExtendedTrustManager
()
{
override
fun
checkClientTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?,
socket
:
Socket
?
)
{
}
override
fun
checkServerTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?,
socket
:
Socket
?
)
{
}
override
fun
checkClientTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?,
engine
:
SSLEngine
?
)
{
}
override
fun
checkServerTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?,
engine
:
SSLEngine
?
)
{
}
override
fun
checkClientTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?
)
{
}
override
fun
checkServerTrusted
(
chain
:
Array
<
out
X509Certificate
?
>?,
authType
:
String
?
)
{
}
override
fun
getAcceptedIssuers
():
Array
<
out
X509Certificate
?
>?
{
return
null
}
})
try
{
val
ssl
=
SSLContext
.
getInstance
(
"SSL"
)
ssl
.
init
(
null
,
trustAllCerts
,
SecureRandom
())
val
socketFactory
:
SSLSocketFactory
?
=
ssl
.
getSocketFactory
()
this
.
setSocketFactory
(
socketFactory
)
}
catch
(
e
:
java
.
lang
.
Exception
)
{
e
.
printStackTrace
()
}
}
}
}
\ No newline at end of file
app/src/main/res/layout/activity_login.xml
View file @
bb95327c
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<
LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<
ScrollView
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
...
@@ -8,22 +8,26 @@
...
@@ -8,22 +8,26 @@
android:orientation=
"vertical"
android:orientation=
"vertical"
tools:context=
".ui.LoginActivity"
>
tools:context=
".ui.LoginActivity"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<RelativeLayout
<RelativeLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"?attr/actionBarSize"
android:layout_height=
"?attr/actionBarSize"
android:background=
"@color/white"
>
android:background=
"@color/white"
>
<TextView
<TextView
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_centerInParent=
"true"
android:layout_centerInParent=
"true"
android:text=
"登录"
android:text=
"登录"
android:textColor=
"#3D3D3D"
android:textColor=
"#3D3D3D"
android:textSize=
"16sp"
/>
android:textSize=
"16sp"
/>
</RelativeLayout>
</RelativeLayout>
<ImageView
<ImageView
...
@@ -139,5 +143,8 @@
...
@@ -139,5 +143,8 @@
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
\ No newline at end of file
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment