Update Android app login, home, and face verification flows.
Sync current local UI and activity changes to remote repository. Made-with: Cursor
This commit is contained in:
@@ -48,7 +48,14 @@ dependencies {
|
|||||||
testImplementation(libs.junit)
|
testImplementation(libs.junit)
|
||||||
androidTestImplementation(libs.androidx.junit)
|
androidTestImplementation(libs.androidx.junit)
|
||||||
androidTestImplementation(libs.androidx.espresso.core)
|
androidTestImplementation(libs.androidx.espresso.core)
|
||||||
implementation("com.squareup.okhttp3:okhttp:4.12.0")
|
|
||||||
// 可选:协程扩展支持
|
|
||||||
implementation("com.squareup.okhttp3:okhttp-coroutines:4.12.0")
|
// CameraX 用于相机预览
|
||||||
|
implementation("androidx.camera:camera-camera2:1.3.0")
|
||||||
|
implementation("androidx.camera:camera-lifecycle:1.3.0")
|
||||||
|
implementation("androidx.camera:camera-view:1.3.0")
|
||||||
|
// Google ML Kit 人脸检测
|
||||||
|
implementation("com.google.mlkit:face-detection:16.1.5")
|
||||||
|
// 图形绘制库(绘制人脸框)
|
||||||
|
implementation("com.github.bumptech.glide:glide:4.15.1")
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,12 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.camera"
|
||||||
|
android:required="true" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
@@ -12,13 +18,7 @@
|
|||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.DefenseApplication">
|
android:theme="@style/Theme.DefenseApplication">
|
||||||
<activity
|
<activity
|
||||||
android:name=".login.ForgetPasswordActivity"
|
android:name=".home.HomeActivity"
|
||||||
android:exported="false" />
|
|
||||||
<activity
|
|
||||||
android:name=".login.RegisterActivity"
|
|
||||||
android:exported="false" />
|
|
||||||
<activity
|
|
||||||
android:name=".login.LoginActivity"
|
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@@ -26,6 +26,25 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".login.RegisterSuccessActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".login.FaceVerificationActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".login.FaceLoginActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".login.ForgetPasswordActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".login.RegisterActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".login.LoginActivity"
|
||||||
|
android:exported="false"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -5,17 +5,75 @@ import androidx.activity.enableEdgeToEdge
|
|||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.databinding.HomeActivityBinding
|
||||||
|
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
|
||||||
|
|
||||||
class HomeActivity : AppCompatActivity() {
|
class HomeActivity : AppCompatActivity() {
|
||||||
|
// ViewBinding 核心对象
|
||||||
|
private lateinit var binding: HomeActivityBinding
|
||||||
|
|
||||||
|
// 定义两个 Fragment
|
||||||
|
private val homeMenuFragment = HomeMenuFragment()
|
||||||
|
private val personalFragment = PersonalFragment()
|
||||||
|
|
||||||
|
// 当前显示的 Fragment
|
||||||
|
private var currentFragment: Fragment = homeMenuFragment
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
|
||||||
setContentView(R.layout.home_activity)
|
// 初始化 ViewBinding
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
binding = HomeActivityBinding.inflate(layoutInflater)
|
||||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
setContentView(binding.root)
|
||||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
// 默认显示首页
|
||||||
insets
|
switchFragment(homeMenuFragment)
|
||||||
|
// 第一次加载,只 add 首页
|
||||||
|
supportFragmentManager.beginTransaction()
|
||||||
|
.add(R.id.fragment_container, homeMenuFragment)
|
||||||
|
.commit()
|
||||||
|
// ========== 首页点击 ==========
|
||||||
|
binding.tabHome.setOnClickListener {
|
||||||
|
switchFragment(homeMenuFragment)
|
||||||
|
// 切换图标 + 文字颜色
|
||||||
|
binding.ivHome.setImageResource(R.drawable.home_checked)
|
||||||
|
binding.tvHome.setTextColor(resources.getColor(R.color.ic_selected))
|
||||||
|
|
||||||
|
binding.ivProfile.setImageResource(R.drawable.profile)
|
||||||
|
binding.tvProfile.setTextColor(resources.getColor(R.color.ic_normal))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ========== 个人点击 ==========
|
||||||
|
binding.tabProfile.setOnClickListener {
|
||||||
|
switchFragment(personalFragment)
|
||||||
|
// 切换图标 + 文字颜色
|
||||||
|
binding.ivHome.setImageResource(R.drawable.home)
|
||||||
|
binding.tvHome.setTextColor(resources.getColor(R.color.ic_normal))
|
||||||
|
|
||||||
|
binding.ivProfile.setImageResource(R.drawable.profile_checked)
|
||||||
|
binding.tvProfile.setTextColor(resources.getColor(R.color.ic_selected))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 切换 Fragment 的方法
|
||||||
|
*/
|
||||||
|
private fun switchFragment(fragment: Fragment) {
|
||||||
|
if (currentFragment == fragment) return
|
||||||
|
|
||||||
|
val transaction = supportFragmentManager.beginTransaction()
|
||||||
|
|
||||||
|
// 如果没添加过,才 add
|
||||||
|
if (!fragment.isAdded) {
|
||||||
|
transaction.add(R.id.fragment_container, fragment)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 隐藏当前,显示目标
|
||||||
|
transaction.hide(currentFragment)
|
||||||
|
transaction.show(fragment)
|
||||||
|
transaction.commit()
|
||||||
|
|
||||||
|
currentFragment = fragment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,55 +6,24 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
|
||||||
|
|
||||||
// TODO: Rename parameter arguments, choose names that match
|
|
||||||
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
|
||||||
private const val ARG_PARAM1 = "param1"
|
|
||||||
private const val ARG_PARAM2 = "param2"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple [Fragment] subclass.
|
|
||||||
* Use the [HomeMenuFragment.newInstance] factory method to
|
|
||||||
* create an instance of this fragment.
|
|
||||||
*/
|
|
||||||
class HomeMenuFragment : Fragment() {
|
class HomeMenuFragment : Fragment() {
|
||||||
// TODO: Rename and change types of parameters
|
// ViewBinding
|
||||||
private var param1: String? = null
|
private var _binding: HomeMenuFragmentBinding? = null
|
||||||
private var param2: String? = null
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
arguments?.let {
|
|
||||||
param1 = it.getString(ARG_PARAM1)
|
|
||||||
param2 = it.getString(ARG_PARAM2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View? {
|
): View {
|
||||||
// Inflate the layout for this fragment
|
_binding = HomeMenuFragmentBinding.inflate(inflater, container, false)
|
||||||
return inflater.inflate(R.layout.home_menu_fragment, container, false)
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
override fun onDestroyView() {
|
||||||
/**
|
super.onDestroyView()
|
||||||
* Use this factory method to create a new instance of
|
_binding = null // 避免内存泄漏
|
||||||
* this fragment using the provided parameters.
|
|
||||||
*
|
|
||||||
* @param param1 Parameter 1.
|
|
||||||
* @param param2 Parameter 2.
|
|
||||||
* @return A new instance of fragment HomeMenuFragment.
|
|
||||||
*/
|
|
||||||
// TODO: Rename and change types and number of parameters
|
|
||||||
@JvmStatic
|
|
||||||
fun newInstance(param1: String, param2: String) =
|
|
||||||
HomeMenuFragment().apply {
|
|
||||||
arguments = Bundle().apply {
|
|
||||||
putString(ARG_PARAM1, param1)
|
|
||||||
putString(ARG_PARAM2, param2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,55 +6,24 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.databinding.PersonalFragmentBinding
|
||||||
|
|
||||||
// TODO: Rename parameter arguments, choose names that match
|
|
||||||
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
|
||||||
private const val ARG_PARAM1 = "param1"
|
|
||||||
private const val ARG_PARAM2 = "param2"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple [Fragment] subclass.
|
|
||||||
* Use the [PersonalFragment.newInstance] factory method to
|
|
||||||
* create an instance of this fragment.
|
|
||||||
*/
|
|
||||||
class PersonalFragment : Fragment() {
|
class PersonalFragment : Fragment() {
|
||||||
// TODO: Rename and change types of parameters
|
// ViewBinding
|
||||||
private var param1: String? = null
|
private var _binding: PersonalFragmentBinding? = null
|
||||||
private var param2: String? = null
|
private val binding get() = _binding!!
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
arguments?.let {
|
|
||||||
param1 = it.getString(ARG_PARAM1)
|
|
||||||
param2 = it.getString(ARG_PARAM2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View? {
|
): View {
|
||||||
// Inflate the layout for this fragment
|
_binding = PersonalFragmentBinding.inflate(inflater, container, false)
|
||||||
return inflater.inflate(R.layout.personal_fragment, container, false)
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
override fun onDestroyView() {
|
||||||
/**
|
super.onDestroyView()
|
||||||
* Use this factory method to create a new instance of
|
_binding = null // 避免内存泄漏
|
||||||
* this fragment using the provided parameters.
|
|
||||||
*
|
|
||||||
* @param param1 Parameter 1.
|
|
||||||
* @param param2 Parameter 2.
|
|
||||||
* @return A new instance of fragment PersonalFragment.
|
|
||||||
*/
|
|
||||||
// TODO: Rename and change types and number of parameters
|
|
||||||
@JvmStatic
|
|
||||||
fun newInstance(param1: String, param2: String) =
|
|
||||||
PersonalFragment().apply {
|
|
||||||
arguments = Bundle().apply {
|
|
||||||
putString(ARG_PARAM1, param1)
|
|
||||||
putString(ARG_PARAM2, param2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,21 +1,39 @@
|
|||||||
package com.example.defenseapplication.login
|
package com.example.defenseapplication.login
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.databinding.FaceLoginActivityBinding
|
||||||
|
|
||||||
class FaceLoginActivity : AppCompatActivity() {
|
class FaceLoginActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var binding: FaceLoginActivityBinding
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
binding = FaceLoginActivityBinding.inflate(layoutInflater)
|
||||||
setContentView(R.layout.face_login_activity)
|
setContentView(binding.root)
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
|
||||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
setupListeners()
|
||||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
}
|
||||||
insets
|
|
||||||
|
private fun setupListeners() {
|
||||||
|
// 返回按钮
|
||||||
|
binding.backIcon.setOnClickListener {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 继续按钮
|
||||||
|
binding.btnStartVerification.setOnClickListener {
|
||||||
|
val intent= Intent(this, FaceVerificationActivity::class.java)
|
||||||
|
startActivity(intent)
|
||||||
|
Toast.makeText(this, "跳转到人脸识别页面", Toast.LENGTH_SHORT).show()
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,21 +1,110 @@
|
|||||||
package com.example.defenseapplication.login
|
package com.example.defenseapplication.login
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.enableEdgeToEdge
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.camera.core.CameraSelector
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.camera.core.ImageAnalysis
|
||||||
import com.example.defenseapplication.R
|
import androidx.camera.core.Preview
|
||||||
|
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import com.example.defenseapplication.databinding.FaceVerificationActivityBinding
|
||||||
|
import com.example.defenseapplication.view.FaceAnalyzer
|
||||||
|
import com.google.mlkit.vision.face.FaceDetection
|
||||||
|
import com.google.mlkit.vision.face.FaceDetectorOptions
|
||||||
|
import java.util.concurrent.ExecutorService
|
||||||
|
import java.util.concurrent.Executors
|
||||||
|
|
||||||
class FaceVerificationActivity : AppCompatActivity() {
|
class FaceVerificationActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var binding: FaceVerificationActivityBinding
|
||||||
|
private lateinit var cameraExecutor: ExecutorService
|
||||||
|
private var faceDetector: com.google.mlkit.vision.face.FaceDetector? = null
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val REQUEST_CAMERA_PERMISSION = 100
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
// 使用标准 ViewBinding
|
||||||
setContentView(R.layout.face_verification_activity)
|
binding = FaceVerificationActivityBinding.inflate(layoutInflater)
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
setContentView(binding.root)
|
||||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
||||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
// 初始化人脸检测器(选项可自行调整)
|
||||||
insets
|
val options = FaceDetectorOptions.Builder()
|
||||||
|
.setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_FAST)
|
||||||
|
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_NONE)
|
||||||
|
.setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_NONE)
|
||||||
|
.build()
|
||||||
|
faceDetector = FaceDetection.getClient(options)
|
||||||
|
|
||||||
|
cameraExecutor = Executors.newSingleThreadExecutor()
|
||||||
|
|
||||||
|
// 检查并请求权限
|
||||||
|
checkCameraPermissionAndStart()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkCameraPermissionAndStart() {
|
||||||
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
|
||||||
|
== PackageManager.PERMISSION_GRANTED) {
|
||||||
|
startCamera()
|
||||||
|
} else {
|
||||||
|
ActivityCompat.requestPermissions(
|
||||||
|
this,
|
||||||
|
arrayOf(Manifest.permission.CAMERA),
|
||||||
|
REQUEST_CAMERA_PERMISSION
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startCamera() {
|
||||||
|
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
|
||||||
|
cameraProviderFuture.addListener({
|
||||||
|
val cameraProvider = cameraProviderFuture.get()
|
||||||
|
|
||||||
|
// 预览用例
|
||||||
|
val preview = Preview.Builder().build().also {
|
||||||
|
it.setSurfaceProvider(binding.previewView.surfaceProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分析用例(人脸检测)
|
||||||
|
val imageAnalysis = ImageAnalysis.Builder()
|
||||||
|
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
|
||||||
|
.build()
|
||||||
|
imageAnalysis.setAnalyzer(cameraExecutor, FaceAnalyzer(faceDetector, binding.overlay))
|
||||||
|
|
||||||
|
// 选择后置摄像头
|
||||||
|
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
|
||||||
|
|
||||||
|
// 绑定到生命周期
|
||||||
|
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
|
||||||
|
|
||||||
|
}, ContextCompat.getMainExecutor(this))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRequestPermissionsResult(
|
||||||
|
requestCode: Int,
|
||||||
|
permissions: Array<out String>,
|
||||||
|
grantResults: IntArray
|
||||||
|
) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||||
|
if (requestCode == REQUEST_CAMERA_PERMISSION) {
|
||||||
|
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
startCamera()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, "需要相机权限才能进行人脸验证", Toast.LENGTH_SHORT).show()
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
cameraExecutor.shutdown()
|
||||||
|
faceDetector?.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,6 @@ import androidx.core.view.ViewCompat
|
|||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
import com.example.defenseapplication.databinding.ForgetPasswordActivityBinding
|
import com.example.defenseapplication.databinding.ForgetPasswordActivityBinding
|
||||||
import com.example.defenseapplication.okhttp.OkHttpClientManager
|
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
@@ -79,20 +78,6 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
isSendingCode = true
|
isSendingCode = true
|
||||||
binding.sendCodeBtn.isEnabled = false
|
binding.sendCodeBtn.isEnabled = false
|
||||||
|
|
||||||
OkHttpClientManager.postForm(
|
|
||||||
url = "https://httpbin.org/post",
|
|
||||||
params = mapOf("phone" to phoneNumber)
|
|
||||||
) { result ->
|
|
||||||
result.onSuccess {
|
|
||||||
verifyCode = (100000 + Random.nextInt(900000)).toString()
|
|
||||||
startCountDown()
|
|
||||||
Toast.makeText(this, "验证码已发送(演示码:$verifyCode)", Toast.LENGTH_SHORT).show()
|
|
||||||
}.onFailure {
|
|
||||||
Toast.makeText(this@ForgetPasswordActivity, "发送失败,请重试", Toast.LENGTH_SHORT).show()
|
|
||||||
resetSendButton()
|
|
||||||
}
|
|
||||||
isSendingCode = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -181,20 +166,7 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
OkHttpClientManager.postJson(
|
|
||||||
url = "https://httpbin.org/post",
|
|
||||||
json = requestJson
|
|
||||||
) { result ->
|
|
||||||
result.onSuccess {
|
|
||||||
Toast.makeText(this, "密码重置成功,请重新登录", Toast.LENGTH_LONG).show()
|
|
||||||
finish()
|
|
||||||
}.onFailure {
|
|
||||||
Toast.makeText(this, "网络异常,请重试", Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.btnNext.isEnabled = true
|
|
||||||
binding.btnNext.text = "确定"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.example.defenseapplication.login
|
package com.example.defenseapplication.login
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.example.defenseapplication.databinding.RegisterActivityBinding
|
import com.example.defenseapplication.databinding.RegisterActivityBinding
|
||||||
|
|
||||||
@@ -31,6 +33,9 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
// 下一步按钮
|
// 下一步按钮
|
||||||
binding.btnNext.setOnClickListener {
|
binding.btnNext.setOnClickListener {
|
||||||
if (!isLoading) {
|
if (!isLoading) {
|
||||||
|
val intent= Intent(this, FaceLoginActivity::class.java)
|
||||||
|
startActivity(intent)
|
||||||
|
Toast.makeText(this, "跳转到人脸页面", Toast.LENGTH_SHORT).show()
|
||||||
//performRegistration()
|
//performRegistration()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,63 @@
|
|||||||
package com.example.defenseapplication.login
|
package com.example.defenseapplication.login
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.os.CountDownTimer
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import com.example.defenseapplication.R
|
import com.example.defenseapplication.R
|
||||||
|
import com.example.defenseapplication.databinding.RegisterSuccessActivityBinding
|
||||||
|
import com.example.defenseapplication.home.HomeActivity
|
||||||
|
|
||||||
class RegisterSuccessActivity : AppCompatActivity() {
|
class RegisterSuccessActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private lateinit var binding: RegisterSuccessActivityBinding
|
||||||
|
private var countDownTimer: CountDownTimer? = null
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
binding = RegisterSuccessActivityBinding.inflate(layoutInflater)
|
||||||
setContentView(R.layout.register_success_activity)
|
setContentView(binding.root)
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
// 返回按钮
|
||||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
binding.backIcon.setOnClickListener {
|
||||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
finish()
|
||||||
insets
|
|
||||||
}
|
}
|
||||||
|
// 点击按钮:取消倒计时并立即跳转
|
||||||
|
binding.btnEnter.setOnClickListener {
|
||||||
|
cancelTimer()
|
||||||
|
jumpToPlatform()
|
||||||
|
}
|
||||||
|
// 启动3秒倒计时,自动跳转
|
||||||
|
startAutoJumpTimer()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startAutoJumpTimer() {
|
||||||
|
countDownTimer = object : CountDownTimer(3000L, 1000L) {
|
||||||
|
override fun onTick(millisUntilFinished: Long) {
|
||||||
|
val seconds = (millisUntilFinished / 1000).toInt()
|
||||||
|
binding.btnEnter.text = "进入平台(${seconds}S)"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFinish() {
|
||||||
|
binding.btnEnter.text = "进入平台(0S)"
|
||||||
|
jumpToPlatform()
|
||||||
|
}
|
||||||
|
}.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun cancelTimer() {
|
||||||
|
countDownTimer?.cancel()
|
||||||
|
countDownTimer = null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun jumpToPlatform() {
|
||||||
|
startActivity(Intent(this, HomeActivity::class.java))
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
cancelTimer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,44 @@
|
|||||||
package com.example.defenseapplication.view
|
package com.example.defenseapplication.view
|
||||||
|
|
||||||
class FaceAnalyzer {
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.camera.core.ExperimentalGetImage
|
||||||
|
import androidx.camera.core.ImageAnalysis
|
||||||
|
import androidx.camera.core.ImageProxy
|
||||||
|
import com.google.mlkit.vision.common.InputImage
|
||||||
|
import com.google.mlkit.vision.face.FaceDetector
|
||||||
|
/*
|
||||||
|
* 人脸分析器
|
||||||
|
* */
|
||||||
|
@ExperimentalGetImage
|
||||||
|
class FaceAnalyzer(
|
||||||
|
private val detector: FaceDetector?,
|
||||||
|
private val overlayView: FaceOverlayView
|
||||||
|
) : ImageAnalysis.Analyzer {
|
||||||
|
|
||||||
|
override fun analyze(imageProxy: ImageProxy) {
|
||||||
|
if (detector == null) {
|
||||||
|
imageProxy.close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val mediaImage = imageProxy.image ?: run {
|
||||||
|
imageProxy.close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
|
||||||
|
|
||||||
|
detector.process(image)
|
||||||
|
.addOnSuccessListener { faces ->
|
||||||
|
Handler(Looper.getMainLooper()).post {
|
||||||
|
overlayView.setFaces(faces)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.addOnFailureListener { e ->
|
||||||
|
Log.e("FaceAnalyzer", "人脸检测失败", e)
|
||||||
|
}
|
||||||
|
.addOnCompleteListener {
|
||||||
|
imageProxy.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,2 +1,36 @@
|
|||||||
package com.example.defenseapplication.view
|
package com.example.defenseapplication.view
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.Paint
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.View
|
||||||
|
import com.google.mlkit.vision.face.Face
|
||||||
|
|
||||||
|
class FaceOverlayView(context: Context, attrs: AttributeSet?) : View(context, attrs) {
|
||||||
|
private val paint = Paint().apply {
|
||||||
|
color = Color.GREEN
|
||||||
|
style = Paint.Style.STROKE
|
||||||
|
strokeWidth = 4f
|
||||||
|
}
|
||||||
|
private val textPaint = Paint().apply {
|
||||||
|
color = Color.YELLOW
|
||||||
|
textSize = 40f
|
||||||
|
}
|
||||||
|
private var faces = mutableListOf<Face>()
|
||||||
|
|
||||||
|
fun setFaces(faces: List<Face>) {
|
||||||
|
this.faces = faces.toMutableList()
|
||||||
|
invalidate() // 触发 onDraw
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDraw(canvas: Canvas) {
|
||||||
|
super.onDraw(canvas)
|
||||||
|
for (face in faces) {
|
||||||
|
val rect = face.boundingBox
|
||||||
|
canvas.drawRect(rect, paint)
|
||||||
|
canvas.drawText("Face", rect.left.toFloat(), rect.top - 10f, textPaint)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:shape="rectangle">
|
android:shape="rectangle">
|
||||||
<solid android:color="@color/green"/>
|
<solid android:color="@color/face"/>
|
||||||
<corners android:radius="16dp"/>
|
<corners android:radius="28dp"/>
|
||||||
</shape>
|
</shape>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="智能防御机"
|
android:text="智能防御机"
|
||||||
android:textSize="28sp"
|
android:textSize="26dp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
app:layout_constraintTop_toBottomOf="@id/logoFrame"
|
app:layout_constraintTop_toBottomOf="@id/logoFrame"
|
||||||
@@ -86,8 +86,8 @@
|
|||||||
android:paddingEnd="16dp">
|
android:paddingEnd="16dp">
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPhoneIcon"
|
android:id="@+id/ivPhoneIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/lg"
|
android:src="@mipmap/lg"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -129,8 +129,8 @@
|
|||||||
<!-- 左侧图标 -->
|
<!-- 左侧图标 -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivSmsIcon"
|
android:id="@+id/ivSmsIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/vc"
|
android:src="@mipmap/vc"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -188,8 +188,8 @@
|
|||||||
<!-- 左侧图标 -->
|
<!-- 左侧图标 -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPasswordIcon"
|
android:id="@+id/ivPasswordIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/ma"
|
android:src="@mipmap/ma"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
|||||||
@@ -2,9 +2,293 @@
|
|||||||
<androidx.constraintlayout.widget.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:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:background="@color/login_background"
|
||||||
android:id="@+id/main"
|
android:id="@+id/main"
|
||||||
|
android:padding="16dp"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".login.FaceLoginActivity">
|
tools:context=".login.FaceLoginActivity">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/topContainer"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingEnd="16dp">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/backIcon"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@mipmap/back"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
<!-- 标题:注册 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="人脸识别"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/backIcon"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/backIcon" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
<!-- 副标题:注册用户 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvRegisterSubtitle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="人脸验证"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="20dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/topContainer" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/topSubContainer"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tvRegisterSubtitle"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingEnd="16dp">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/safeIcon"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/safe"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
<!-- 标题:注册 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvSubTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="仅用于创建防御机制和防窃取,保障您的安全"
|
||||||
|
android:textColor="@color/green"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/safeIcon"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/safeIcon" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
<!-- 人脸图标占位符(模拟人脸识别形象) -->
|
||||||
|
<ImageView
|
||||||
|
android:paddingTop="50dp"
|
||||||
|
android:id="@+id/cardFaceIcon"
|
||||||
|
android:layout_width="150dp"
|
||||||
|
android:layout_height="150dp"
|
||||||
|
android:src="@drawable/face_verification"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/topSubContainer" />
|
||||||
|
<!-- 提示信息 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvInstruction"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_marginTop="11dp"
|
||||||
|
android:text="请根据指示完成人脸验证"
|
||||||
|
android:textColor="@color/icon_face"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/cardFaceIcon" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:id="@+id/cbLowLight"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tvInstruction"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingTop="48dp"
|
||||||
|
android:paddingEnd="16dp">
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<LinearLayout
|
||||||
|
android:background="@drawable/face_login_gray_bg"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="59dp"
|
||||||
|
android:layout_height="59dp"
|
||||||
|
android:src="@drawable/mask_group"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:src="@drawable/common_icons_miniprogram2"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="标准拍摄"
|
||||||
|
android:textColor="@color/icon_face"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:textStyle="bold"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<LinearLayout
|
||||||
|
android:background="@drawable/face_login_gray_bg"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="59dp"
|
||||||
|
android:layout_height="59dp"
|
||||||
|
android:src="@drawable/standard_capture"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:src="@drawable/common_icons_miniprogram1"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="标准拍摄"
|
||||||
|
android:textColor="@color/icon_face"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:textStyle="bold"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<LinearLayout
|
||||||
|
android:background="@drawable/face_login_gray_bg"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="59dp"
|
||||||
|
android:layout_height="59dp"
|
||||||
|
android:src="@drawable/cropped_shot"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:src="@drawable/common_icons_miniprogram1"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="拍摄不全"
|
||||||
|
android:textColor="@color/icon_face"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:textStyle="bold"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<LinearLayout
|
||||||
|
android:background="@drawable/face_login_gray_bg"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="59dp"
|
||||||
|
android:layout_height="59dp"
|
||||||
|
android:src="@drawable/low_light"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:src="@drawable/common_icons_miniprogram1"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="光线不足"
|
||||||
|
android:textColor="@color/icon_face"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:textStyle="bold"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 开始验证按钮 -->
|
||||||
|
<android.widget.Button
|
||||||
|
android:id="@+id/btnStartVerification"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginTop="40dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginStart="25dp"
|
||||||
|
android:layout_marginEnd="25dp"
|
||||||
|
android:text="开始验证"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="14dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:background="@drawable/rounded_blue_bg"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/cbLowLight" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -7,4 +7,14 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".login.FaceVerificationActivity">
|
tools:context=".login.FaceVerificationActivity">
|
||||||
|
|
||||||
|
<androidx.camera.view.PreviewView
|
||||||
|
android:id="@+id/previewView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<com.example.defenseapplication.view.FaceOverlayView
|
||||||
|
android:id="@+id/overlay"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
android:paddingEnd="16dp">
|
android:paddingEnd="16dp">
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/backIcon"
|
android:id="@+id/backIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/back"
|
android:src="@mipmap/back"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -71,8 +71,8 @@
|
|||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPhoneIcon"
|
android:id="@+id/ivPhoneIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/lg"
|
android:src="@mipmap/lg"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
@@ -115,8 +115,8 @@
|
|||||||
<!-- 左侧图标 -->
|
<!-- 左侧图标 -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivSmsIcon"
|
android:id="@+id/ivSmsIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/vc"
|
android:src="@mipmap/vc"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -173,8 +173,8 @@
|
|||||||
<!-- 左侧图标 -->
|
<!-- 左侧图标 -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPasswordIcon"
|
android:id="@+id/ivPasswordIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintBottom_toBottomOf="parent" />
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
@@ -214,8 +214,8 @@
|
|||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivInviteIcon"
|
android:id="@+id/ivInviteIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|||||||
@@ -7,4 +7,73 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".home.HomeActivity">
|
tools:context=".home.HomeActivity">
|
||||||
|
|
||||||
|
<!-- Fragment 容器 -->
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/fragment_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/bottom_layout"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"/>
|
||||||
|
|
||||||
|
<!-- 自定义底部导航(LinearLayout)-->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/bottom_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="70dp"
|
||||||
|
android:background="#F9F9F9"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent">
|
||||||
|
|
||||||
|
<!-- 首页 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/tab_home"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:clickable="true">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/iv_home"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/home_checked"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_home"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="首页"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textColor="@color/black"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- 个人 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/tab_profile"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:clickable="true">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/iv_profile"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@drawable/profile"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_profile"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="个人"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textColor="@color/gray"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout 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"
|
||||||
tools:context=".home.HomeMenuFragment">
|
tools:context=".home.HomeMenuFragment">
|
||||||
|
|
||||||
<!-- TODO: Update blank fragment layout -->
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/hello_blank_fragment" />
|
android:text="首页 Fragment"
|
||||||
|
android:textSize="20sp"/>
|
||||||
</FrameLayout>
|
</LinearLayout>
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout 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"
|
||||||
tools:context=".home.PersonalFragment">
|
tools:context=".home.PersonalFragment">
|
||||||
|
|
||||||
<!-- TODO: Update blank fragment layout -->
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/hello_blank_fragment" />
|
android:text="个人 Fragment"
|
||||||
|
android:textSize="20sp"/>
|
||||||
|
|
||||||
</FrameLayout>
|
</LinearLayout>
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
android:paddingEnd="16dp">
|
android:paddingEnd="16dp">
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/backIcon"
|
android:id="@+id/backIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/back"
|
android:src="@mipmap/back"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -33,12 +33,13 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="注册"
|
android:text="注册"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
android:textSize="32sp"
|
android:textSize="16dp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintBottom_toBottomOf="@id/backIcon"
|
app:layout_constraintBottom_toBottomOf="@id/backIcon"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@id/backIcon" />
|
app:layout_constraintTop_toTopOf="@id/backIcon"
|
||||||
|
app:layout_constraintVertical_bias="0.518" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="注册用户"
|
android:text="注册用户"
|
||||||
android:textColor="@color/black"
|
android:textColor="@color/black"
|
||||||
android:textSize="20dp"
|
android:textSize="24dp"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
@@ -71,8 +72,8 @@
|
|||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPhoneIcon"
|
android:id="@+id/ivPhoneIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/lg"
|
android:src="@mipmap/lg"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
@@ -113,8 +114,8 @@
|
|||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivIdIcon"
|
android:id="@+id/ivIdIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/id_card"
|
android:src="@mipmap/id_card"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
@@ -156,8 +157,8 @@
|
|||||||
<!-- 左侧图标 -->
|
<!-- 左侧图标 -->
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivPasswordIcon"
|
android:id="@+id/ivPasswordIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/ma"
|
android:src="@mipmap/ma"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@@ -198,8 +199,8 @@
|
|||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/ivInviteIcon"
|
android:id="@+id/ivInviteIcon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="24dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="24dp"
|
||||||
android:src="@mipmap/ic"
|
android:src="@mipmap/ic"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
|||||||
@@ -1,10 +1,91 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.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:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/main"
|
android:background="@color/login_background"
|
||||||
android:layout_width="match_parent"
|
android:id="@+id/main"
|
||||||
android:layout_height="match_parent"
|
android:padding="16dp"
|
||||||
tools:context=".login.RegisterSuccessActivity">
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".login.RegisterSuccessActivity">
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/topContainer"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingEnd="16dp">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/backIcon"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:src="@mipmap/back"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
<!-- 标题:注册 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="注册"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/backIcon"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/backIcon" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
<!-- 副标题:注册用户 -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvRegisterSubtitle"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="注册用户"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="20dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/topContainer" />
|
||||||
|
|
||||||
|
<!--图标 -->
|
||||||
|
<ImageView
|
||||||
|
android:layout_marginTop="175dp"
|
||||||
|
android:id="@+id/cardFaceIcon"
|
||||||
|
android:layout_width="110dp"
|
||||||
|
android:layout_height="110dp"
|
||||||
|
android:src="@drawable/success"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tvRegisterSubtitle" />
|
||||||
|
|
||||||
|
<!-- 进入平台(3S) -->
|
||||||
|
<android.widget.Button
|
||||||
|
android:id="@+id/btnEnter"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_marginTop="140dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginStart="25dp"
|
||||||
|
android:layout_marginEnd="25dp"
|
||||||
|
android:text="进入平台(3S)"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="14dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:background="@drawable/rounded_blue_bg"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/cardFaceIcon" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -6,5 +6,9 @@
|
|||||||
<color name="gray">#999999</color>
|
<color name="gray">#999999</color>
|
||||||
<color name="login_background">#EDF4FF</color>
|
<color name="login_background">#EDF4FF</color>
|
||||||
<color name="red">#E34D59</color>
|
<color name="red">#E34D59</color>
|
||||||
|
<color name="icon_face">#666666</color>
|
||||||
|
<color name="face">#F0F0F0</color>
|
||||||
|
<color name="ic_selected">#000000 </color>
|
||||||
|
<color name="ic_normal">#999999 </color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">DefenseApplication</string>
|
<string name="app_name">DefenseApplication</string>
|
||||||
|
<!-- TODO: Remove or change this placeholder text -->
|
||||||
|
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user