Android OnTouchListener не работает должным образомJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Android OnTouchListener не работает должным образом

Сообщение Anonymous »

У меня есть приложение, когда мне нужно отобразить изображение в виде наложения, как в приложении 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»