扫码附件设备,链接设备动画
This commit is contained in:
@@ -2,6 +2,8 @@ package com.example.defenseapplication.home
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
@@ -12,10 +14,12 @@ import com.example.defenseapplication.adapter.Device
|
||||
import com.example.defenseapplication.databinding.AddDeviceActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
//添加设备页面
|
||||
class AddDeviceActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: AddDeviceActivityBinding
|
||||
|
||||
private lateinit var adapter: AddDeviceAdapter
|
||||
private val mainHandler = Handler(Looper.getMainLooper())
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = AddDeviceActivityBinding.inflate(layoutInflater)
|
||||
@@ -28,7 +32,31 @@ class AddDeviceActivity : AppCompatActivity() {
|
||||
finish()
|
||||
}
|
||||
|
||||
setupDeviceList()
|
||||
// 开始播放扫描动画,动画结束后再显示设备列表
|
||||
startScanAnimationThenShowList()
|
||||
}
|
||||
|
||||
private fun startScanAnimationThenShowList() {
|
||||
// 显示动画层
|
||||
binding.animationContainer.visibility = View.VISIBLE
|
||||
binding.rvDevices.visibility = View.GONE
|
||||
|
||||
// 设置帧动画并启动
|
||||
binding.ivScanAnimation.setImageResource(R.drawable.device_frame_animation)
|
||||
val scanDrawable = binding.ivScanAnimation.drawable
|
||||
if (scanDrawable is android.graphics.drawable.AnimationDrawable) {
|
||||
scanDrawable.start()
|
||||
}
|
||||
|
||||
// 模拟扫描过程
|
||||
mainHandler.postDelayed({
|
||||
// 停止动画
|
||||
(binding.ivScanAnimation.drawable as? android.graphics.drawable.AnimationDrawable)?.stop()
|
||||
// 隐藏动画层,显示列表
|
||||
binding.animationContainer.visibility = View.GONE
|
||||
binding.rvDevices.visibility = View.VISIBLE
|
||||
setupDeviceList() // 加载设备列表
|
||||
}, 3000) // 动画播放时长,可根据实际帧动画总时长调整
|
||||
}
|
||||
|
||||
private fun setupDeviceList() {
|
||||
@@ -38,20 +66,38 @@ class AddDeviceActivity : AppCompatActivity() {
|
||||
)
|
||||
|
||||
if (devices.isEmpty()) {
|
||||
binding.emptyState.visibility = View.VISIBLE
|
||||
|
||||
binding.rvDevices.visibility = View.GONE
|
||||
} else {
|
||||
binding.emptyState.visibility = View.GONE
|
||||
|
||||
binding.rvDevices.visibility = View.VISIBLE
|
||||
|
||||
binding.rvDevices.layoutManager = GridLayoutManager(this, 2)
|
||||
// 传入点击回调
|
||||
binding.rvDevices.adapter = AddDeviceAdapter(devices) { device ->
|
||||
// 跳转到 AddFamilyActivity(选择Wi-Fi页面)
|
||||
adapter = AddDeviceAdapter(devices) { device ->
|
||||
val intent = Intent(this, AddFamilyActivity::class.java)
|
||||
intent.putExtra("device_name", device.name)
|
||||
startActivity(intent)
|
||||
}
|
||||
binding.rvDevices.adapter = adapter
|
||||
}
|
||||
}
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
// 停止所有可见 item 的动画
|
||||
for (i in 0 until binding.rvDevices.childCount) {
|
||||
val child = binding.rvDevices.getChildAt(i)
|
||||
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
|
||||
holder?.stopAnimation()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
// 重新启动所有可见 item 的动画
|
||||
for (i in 0 until binding.rvDevices.childCount) {
|
||||
val child = binding.rvDevices.getChildAt(i)
|
||||
val holder = binding.rvDevices.getChildViewHolder(child) as? AddDeviceAdapter.ViewHolder
|
||||
holder?.startAnimation()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ import com.example.defenseapplication.databinding.AddFamilyActivityBinding
|
||||
import com.example.defenseapplication.databinding.DialogWifiListBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
//选择wifi页面
|
||||
class AddFamilyActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: AddFamilyActivityBinding
|
||||
@@ -67,7 +68,7 @@ class AddFamilyActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
binding.btnConfirm.setOnClickListener {
|
||||
val intent=Intent(this, SetNameActivity::class.java)
|
||||
val intent=Intent(this, ConnectDeviceActivity::class.java)
|
||||
startActivity( intent)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
package com.example.defenseapplication.home
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.drawable.AnimationDrawable
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.databinding.AddDeviceActivityBinding
|
||||
import com.example.defenseapplication.databinding.ConnectDeviceActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class ConnectDeviceActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: ConnectDeviceActivityBinding
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
// 每一帧对应的步骤文字和提示
|
||||
private val steps = listOf(
|
||||
StepData("请保持手机蓝牙开启并将手机尽量靠近设备", "向设备传输信息","设备连接网络"),
|
||||
StepData("请保持手机蓝牙开启并将手机尽量靠近设备", "设备连接网络请将设备尽量靠近路由器",""),
|
||||
StepData("请将设备尽量靠近路由器", "","")
|
||||
)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = ConnectDeviceActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
binding.ivBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
startFrameAnimation()
|
||||
}
|
||||
private fun startFrameAnimation() {
|
||||
// 设置动画资源
|
||||
binding.ivAnimation.setImageResource(R.drawable.device_wifi_animation)
|
||||
val animDrawable = binding.ivAnimation.drawable as AnimationDrawable
|
||||
|
||||
// 监听每一帧的切换(AnimationDrawable 没有直接的回调,通过 Handler 定时更新文字)
|
||||
var frameIndex = 0
|
||||
val totalFrames = steps.size
|
||||
|
||||
// 先显示第一帧对应的文字
|
||||
updateTextForFrame(0)
|
||||
|
||||
// 开始动画
|
||||
animDrawable.start()
|
||||
|
||||
// 每隔对应帧的时长来更新文字(必须与动画中每帧 duration 一致)
|
||||
val frameDurations = listOf(1500L, 1500L, 1500L) // 与 xml 中的 duration 对应
|
||||
val runnable = object : Runnable {
|
||||
override fun run() {
|
||||
frameIndex++
|
||||
if (frameIndex < totalFrames) {
|
||||
updateTextForFrame(frameIndex)
|
||||
handler.postDelayed(this, frameDurations[frameIndex])
|
||||
} else {
|
||||
// 动画播放完毕,进行下一步操作(比如跳转或显示设备列表)
|
||||
onAnimationComplete()
|
||||
}
|
||||
}
|
||||
}
|
||||
// 第一帧文字已经显示,所以延迟第一帧时长后再切换到第二帧
|
||||
handler.postDelayed(runnable, frameDurations[0])
|
||||
}
|
||||
|
||||
private fun updateTextForFrame(index: Int) {
|
||||
val step = steps[index]
|
||||
binding.tvStepText.text = step.text
|
||||
binding.tvHint.text = step.hint
|
||||
binding.tvDeviceName.text = step.deviceName
|
||||
}
|
||||
|
||||
private fun onAnimationComplete() {
|
||||
// 动画结束后的逻辑,显示“扫描完成”并跳转
|
||||
// 隐藏原来的动画相关视图
|
||||
binding.ivAnimation.visibility = View.GONE
|
||||
binding.tvStepText.visibility = View.GONE
|
||||
binding.tvHint.visibility = View.GONE
|
||||
binding.tvDeviceName.visibility = View.GONE
|
||||
// 显示图片 + 文字的布局
|
||||
val successLayout = binding.successLayout
|
||||
successLayout.visibility = View.VISIBLE
|
||||
|
||||
// 跳转到下一个界面或关闭当前页面
|
||||
// 使用 Handler 延迟跳转
|
||||
Handler(Looper.getMainLooper()).postDelayed({
|
||||
startActivity(Intent(this, SetNameActivity::class.java))
|
||||
finish()
|
||||
}, 1000) // 1秒后跳转
|
||||
}
|
||||
|
||||
data class StepData(val text: String, val hint: String, val deviceName: String)
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
handler.removeCallbacksAndMessages(null)
|
||||
(binding.ivAnimation.drawable as? AnimationDrawable)?.stop()
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.databinding.HomeActivityBinding
|
||||
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class HomeActivity : AppCompatActivity() {
|
||||
// ViewBinding 核心对象
|
||||
@@ -23,7 +24,6 @@ class HomeActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// 初始化 ViewBinding
|
||||
binding = HomeActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.example.defenseapplication.adapter.FamilyAdapter
|
||||
import com.example.defenseapplication.databinding.HomeMenuFragmentBinding
|
||||
import com.example.defenseapplication.view.DefenseDialogs
|
||||
import com.example.defenseapplication.view.showDefenseDialog
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class HomeMenuFragment : Fragment() {
|
||||
// ViewBinding
|
||||
@@ -63,6 +64,10 @@ class HomeMenuFragment : Fragment() {
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
_binding = HomeMenuFragmentBinding.inflate(inflater, container, false)
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.main)
|
||||
.init()
|
||||
initView()
|
||||
return binding.root
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import com.example.defenseapplication.adapter.MessageListAdapter
|
||||
import com.example.defenseapplication.adapter.MessageListItem
|
||||
import com.example.defenseapplication.databinding.MessageActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
//消息通知页面
|
||||
class MessageActivity : AppCompatActivity() {
|
||||
private lateinit var binding: MessageActivityBinding
|
||||
private val messageAdapter by lazy { MessageListAdapter() }
|
||||
|
||||
@@ -24,13 +24,11 @@ class PersonalFragment : Fragment() {
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
|
||||
_binding = PersonalFragmentBinding.inflate(inflater, container, false)
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.headerLayout)
|
||||
.init()
|
||||
|
||||
_binding = PersonalFragmentBinding.inflate(inflater, container, false)
|
||||
Glide.with(this)
|
||||
.load(R.drawable.img)
|
||||
.circleCrop()
|
||||
|
||||
@@ -28,7 +28,7 @@ import com.google.zxing.*
|
||||
import com.google.zxing.common.HybridBinarizer
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
import java.util.*
|
||||
|
||||
//扫一扫页面
|
||||
class ScanActivity : AppCompatActivity(), SurfaceHolder.Callback {
|
||||
|
||||
private lateinit var binding: ScanActivityBinding
|
||||
|
||||
@@ -4,7 +4,7 @@ import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.example.defenseapplication.databinding.SetNameActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
//设置名字页面
|
||||
class SetNameActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: SetNameActivityBinding
|
||||
|
||||
Reference in New Issue
Block a user