Skocz do zawartości

B4x jak sprawdzić czy button wciśnięty


_LM_

Pomocna odpowiedź

Uczę się Basic for android. Poszukuję informacji czy button jest wciśnięty i przytrzymany, ewentualnie zdarzenia key_up (przechodzę z MIT AI2 i tam takie rzeczy były) Aplikacja testowa:

#Region  Project Attributes 
	#ApplicationLabel: B4A Example
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: true
	#IncludeTitle: false
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Private xui As XUI
	
	Private tmr As Timer
	
End Sub

Sub Globals
	'These global variables will be redeclared each time the activity is created.
	Private button1 As Button
	Private Label1 As Label
	Private Label2 As Label
	
	Dim w As Byte
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	
	tmr.Initialize("timer1", 100)
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

'*****************************************************************************

Private Sub Button1_Click
	w = w + 1
	Label1.Text = w
End Sub

Private Sub Button1_LongClick

w = w+1
tmr.Enabled  = True

End Sub


Sub timer1_Tick
	
' tutaj chcę obsługę po "podniesieniu" przycisku
	
'	If button1.text Then
'		
'		w = w + 1 
'		
'		Else
'			tmr.Enabled = False
'	End If
End Sub

 

Link do komentarza
Share on other sites

(edytowany)

Ok problem rozwiązany udało się za pomocą składnika "panel", i to jest jedyna droga za pomocą której udaje się rozwiązać zadanie. Nie wiem czemu w b4a nie zostało dodane zdarzenie od upuszczenia buttona no ale jak niema co się lubi to się lubi co się ma 😉 Wklejam kod programu, być może ktoś będzie kiedy szukał podobnego rozwiązania. Kod jest myślę wystarczająco okomentowany aby zrozumieć działanie. @Treker przydałoby się kolorowanie składni w VBA. 

#Region  Project Attributes 
	#ApplicationLabel: B4A Example
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: True
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Private xui As XUI
	
	Dim vbr As PhoneVibrate ' potrzebne do obslugi wibracji 
	Dim tmr As Timer
End Sub	


Sub Globals
	'These global variables will be redeclared each time the activity is created.
	Private btn1 As Button
	Private Label1 As Label  ' wyswietlanie stanu licznika
	Dim direction As Boolean ' kierunek zliczania 
	Dim Licznik As Int		 ' licznik testowy
	Private pnl1 As Panel    ' panel na ktorym sa umieszczone "buttony"
	Private bMinus As Label
	Private bPlus As Label
'	Private Label2 As B4XView
End Sub		


	
Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	Activity.Title = "Button test"
	tmr.Initialize("Btn_timer", 550)
	'pnl1.Initialize("pnl1")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Private Sub Btn_timer_Tick
	
	Dim interval As Int
	
	interval = tmr.Interval
	
	interval = interval - 50 ' przyspiesznie licznika przy przetrzymaniu
	If interval < 50 Then
		interval = 50
	End If
	tmr.Interval = interval		

	If direction Then 		' wybor kierunku zliczania  
		Licznik = Licznik+1
		Else
			Licznik = Licznik - 1
	End If	
	
	Label1.Text = Licznik ' wyswietlenie wartosci 
	vbr.Vibrate(5)		 
	
	
End Sub
	
	


Private Sub btn1_Click 'szybki reset

Licznik = 0
Label1.Text = Licznik	
	
End Sub

	
	

Private Sub pnl1_Touch (Action As Int, X As Float, Y As Float)

	If Action = Activity.ACTION_DOWN Then
		vbr.Vibrate(5)

		If X < pnl1.Width / 2    Then ' jesli palec w tym miejscu
			direction = False
			Licznik = Licznik - 1
		
		End If
			
		If X > pnl1.Width / 2 Then
			direction = True
			Licznik = Licznik + 1
			
		End If
		Label1.Text = Licznik
		tmr.Enabled = True
	End If		
		
If Action = Activity.ACTION_UP Then ' po opuszczeniu przycisku
	tmr.Interval = 550 				' przywroc czas interwalu
	tmr.Enabled = False 			' wylacz timer 
End If
End Sub

 

button3.zip

Edytowano przez _LM_
Link do komentarza
Share on other sites

Sprostowanie 🙂 Normalnie może już zostawiłbym ten temat ale widzę że około 30 osób pobrało plik testowy, więc być może ktoś też przerabiał mój problem. Także napisałem głupotę:

Dnia 12.05.2021 o 18:17, _LM_ napisał:

Ok problem rozwiązany udało się za pomocą składnika "panel", i to jest jedyna droga za pomocą której udaje się rozwiązać zadanie.

Bzdura! Jest to jedna z dróg a nie jedyna, poza tym zamiast użyć normalnego buttona składnik label nam go udaje. A więc, ponieważ wciąż poznaję b4a jak i b4j znalazłem rozwiązanie bardziej poprawne: jest nim wykorzystanie biblioteki JavaObject a później skorzystanie z "RunMethod" "setOnTouchListener"

	Dim e As Object = jo.CreateEvent("android.view.View.OnTouchListener","btnupp",False)
	jo.RunMethod("setOnTouchListener", Array As Object(e))

Jak zwykle nieocenioną pomocą okazała się dokumentacja b4a jak i forum b4x.com oraz stackoverflow. 

https://stackoverflow.com/questions/11779082/listener-for-pressing-and-releasing-a-button

https://www.b4x.com/guides/B4XJavaObject_NativeObject/?page=8

Dla zainteresowanych poprawiony kod i pliki źródłowe.

#Region  Project Attributes 
	#ApplicationLabel: Test przycisków
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: True
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Private xui As XUI
	
	Dim vbr As PhoneVibrate ' potrzebne do obslugi wibracji 
	Dim tmr As Timer
End Sub	


Sub Globals
	'These global variables will be redeclared each time the activity is created.
	Private btn1 As Button
	Private Label1 As Label  ' wyswietlanie stanu licznika
	Dim direction As Boolean ' kierunek zliczania 
	Dim Licznik As Int		 ' licznik testowy
	Private minus As Button
	Private plus As Button
	
	Private bt1,bt2 As Boolean
	
End Sub		


	
Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	Activity.Title = "Button test"
	tmr.Initialize("Btn_timer", 550)
	btn1.Text = "Reset Licznika"
	
	bt1 = FirstTime ' aby zadziałało za pierwszym razem
	bt2 = FirstTime

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Private Sub Btn_timer_Tick
	
	Dim interval As Int
	
	interval = tmr.Interval
	
	interval = interval - 50 ' przyspiesznie licznika przy przetrzymaniu
	If interval < 50 Then
		interval = 50
	End If
	tmr.Interval = interval		

	If direction Then 		' wybor kierunku zliczania  
		Licznik = Licznik + 1
		Else
			Licznik = Licznik - 1
	End If	
	wynik(Licznik)
	vbr.Vibrate(5)		 
End Sub	

Private Sub btn1_Click 'szybki reset
	Licznik = 0
	wynik(Licznik)
End Sub

Private Sub plus_Click
	If bt1 Then
		direction = True
		Licznik = Licznik - 1
		wynik(Licznik)
	bt1 = False
	End If

getBtn
End Sub

Private Sub minus_Click

	If bt2 Then
		direction = False
		Licznik = Licznik + 1
		wynik(Licznik)
	bt2 = False
	End If

	getBtn
End Sub


Sub getBtn()
'	Log("click")
	Dim b As Button = Sender

	Dim jo As JavaObject = b
	Dim e As Object = jo.CreateEvent("android.view.View.OnTouchListener","btnupp",False)
	jo.RunMethod("setOnTouchListener", Array As Object(e))
End Sub


'https://stackoverflow.com/questions/11779082/listener-for-pressing-and-releasing-a-button
'https://www.b4x.com/guides/B4XJavaObject_NativeObject/?page=8
Private Sub btnupp_Event (MethodName As String, Args() As Object) As Object
	
Dim b2 As Button = Sender
Log(b2.Tag)
	
	Dim motion As JavaObject = Args(1)
	Log(motion)
	Dim Action As Int = motion.RunMethod("getAction", Null)
	Log("Action = " & Action)
	
	Select Action
		Case 0:
			Log("Dwn")
			vbr.Vibrate(5)
				If 1 = b2.tag Then
				direction = False
				Licznik = Licznik - 1
				End If
				
			If 2 = b2.tag Then
				direction = True
				Licznik = Licznik + 1
			End If
			
			wynik(Licznik)
			tmr.Enabled = True
			
		Case 1:
			Log("up")
			tmr.Interval = 550 				' przywroc czas interwalu
			tmr.Enabled = False 			' wylacz timer
		Case 2:
			Log("move")
			
	End Select
	
	Return False
End Sub	
	
Sub wynik(l As Int)
	Label1.Text = l
End Sub

 button3.zip

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.