У меня есть приложение, когда мне нужно отобразить изображение в виде наложения, как в приложении XRecorder, и когда я нажимаю на него, показывает/скрывает определенное изображение, проблема в том, что когда приложение запускается и я начинаю перетаскивать, я нажимаю «Показать/ скрыть макет до тех пор, пока он не работает нормально, когда я снова пытаюсь перетащить, он не перетаскивается, и добавить, что когда я регистрирую x и y, они печатаются и показывают, что значения меняются, когда я перетаскиваю пальцем, но само изображение - нет перетаскивание, любое помощь будет оценена по достоинству, спасибо
class MainActivity : AppCompatActivity() {
private lateinit var cpuInfoContainer : LinearLayout
private lateinit var binding : ActivityMainBinding
private lateinit var windowManager: WindowManager
private lateinit var overlayView: View
private val handler = Handler(Looper.getMainLooper())
private lateinit var fpsMonitor: FPSMonitor
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
if (!Settings.canDrawOverlays(this)) {
val intent =
Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName"))
startActivityForResult(intent, 1005)
}
showMain()
}
@SuppressLint("ClickableViewAccessibility")
private fun showMain() {
windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
val inflater = LayoutInflater.from(this)
overlayView = inflater.inflate(R.layout.activity_main, null)
val overlayImage = overlayView.findViewById(R.id.overlayImage)
var isShown = false // Tracks if the secondary layout is shown
var isDragging = false // Tracks if the overlay is being dragged
var initialX = 0
var initialY = 0
var initialTouchX = 0f
var initialTouchY = 0f
val dragThreshold = 10 // Minimum drag threshold to be considered as drag
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
)
params.gravity = Gravity.TOP or Gravity.START
params.x = 0
params.y = 150
// Add the overlay view to the WindowManager if not already added
if (!overlayView.isAttachedToWindow) {
windowManager.addView(overlayView, params)
}
// Resetting the touch listener on the image view
overlayImage.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
// Record the initial positions of the overlay and touch
initialX = params.x
initialY = params.y
initialTouchX = event.rawX
initialTouchY = event.rawY
isDragging = false // Reset dragging state on new touch
true
}
MotionEvent.ACTION_MOVE -> {
// Calculate the change in position
val deltaX = (event.rawX - initialTouchX).toInt()
val deltaY = (event.rawY - initialTouchY).toInt()
// Check if the drag threshold is exceeded
if (Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) {
isDragging = true // Set dragging flag to true
params.x = initialX + deltaX
params.y = initialY + deltaY
// Update the overlay position in the window manager
if (overlayView.isAttachedToWindow) {
windowManager.updateViewLayout(overlayView, params)
}
}
true
}
MotionEvent.ACTION_UP -> {
// Handle click action only if it was not a drag
if (!isDragging) {
// Toggle overlay visibility
if (isShown) {
removeOverlayLayout() // Remove the layout completely
isShown = false
Toast.makeText(this, "Overlay Hidden", Toast.LENGTH_SHORT).show()
} else {
showOverlayLayout() // Add the layout back
displayCpuInfo()
isShown = true
Toast.makeText(this, "Overlay Shown", Toast.LENGTH_SHORT).show()
}
}
isDragging = false // Reset dragging state after touch release
true
}
MotionEvent.ACTION_CANCEL -> {
isDragging = false // Reset dragging if touch event is canceled
true
}
else -> false
}
}
}
private fun showOverlayLayout() {
// Inflate the layout for the overlay view
overlayView = LayoutInflater.from(this).inflate(R.layout.widget_layout, null)
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
else
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
)
params.gravity = Gravity.TOP or Gravity.START
windowManager.addView(overlayView, params)
fpsMonitor = FPSMonitor(1000)
fpsMonitor.startMonitoring()
updateOverlay()
}
private fun removeOverlayLayout() {
if (::overlayView.isInitialized && overlayView.isAttachedToWindow) {
windowManager.removeView(overlayView)
}
}
private fun updateOverlay() {
val cpuTempView = overlayView.findViewById(R.id.cpuTempValue)
val gpuTempView = overlayView.findViewById(R.id.gpuTempValue)
val gpuFanView = overlayView.findViewById(R.id.gpuFanValue)
val batteryView = overlayView.findViewById(R.id.batteryValue)
val batteryPercentage = overlayView.findViewById(R.id.batteryPercentage)
val fpsView = overlayView.findViewById(R.id.fpsValues)
val totalRam = overlayView.findViewById(R.id.totalRam)
val usedRam = overlayView.findViewById(R.id.ramUsed)
val availableRam = overlayView.findViewById(R.id.ramAvailable)
cpuInfoContainer = overlayView.findViewById(R.id.cpuInfoContainer)
handler.postDelayed(object : Runnable {
override fun run() {
cpuTempView.text = getCpuTemperature()
gpuTempView.text = getGpuTemperature()
gpuFanView.text = getGpuFanSpeed()
batteryView.text = getBatteryTemperature()
batteryPercentage.text = buildString {
append(getBatteryPercentage().toString())
append("%")
}
fpsView.text = buildString {
append(fpsMonitor.calculateFPS().toString())
append(" FPS")
}
totalRam.text = getTotalRam()
usedRam.text = getUsedRam()
availableRam.text = getAvailableRam()
handler.postDelayed(this, 1000)
}
}, 1000)
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... g-properly
Android OnTouchListener не работает должным образом ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение