Italian Multi Touch [Risolto]

Star-Dust

Expert
Licensed User
Longtime User
Hi,

Sto cercando di catturare i tocchi in una pannello. Però mi serve conoscere non solo il singolo tocco (Panel_Touch) ma almeno i primi 2. So che esiste la libreria Gesture... ma vorrei evitare di usarla, anché perché mi serve qualcosa di meno sosfisticato.

Ho trovato questi riferimenti: https://developer.android.com/training/gestures/multi.html

Vorrei trasformarlo con la Libreria Reflection (o JavaObject) in B4A... ma non saprei come...
 

Star-Dust

Expert
Licensed User
Longtime User
Risolto ...

B4X:
Dim obj As Reflector
obj.Target = MyPanel
obj.SetOnTouchListener("MyPanel_Touch")

B4X:
Sub MyPanel_Touch(viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean

    Dim jo As JavaObject = motionevent
    Dim pc As Int = jo.RunMethod("getPointerCount", Null)
  
    For p=0 To pc-1
        Dim PointerID As Int = jo.RunMethod("getPointerId", Array As Object(p))
        Log(jo.RunMethod("getX", Array As Object(p)))
        Log(jo.RunMethod("getY", Array As Object(p)))
    Next

    Return True
End Sub
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Nota bene:

Quando si verifica ACTION_DOWN sui punti successivi al primo (quindi il punto 0) action sarà valore 261
Quando si muove (ACTION_MOVE) un punto secondario il valore di action é 2 (come per il primo punto)
Quando si verifica ACTION_UP dei punti successivi al primo il valore di action darà 262

Se per qualche ragione si interrompe il movimento...chessò tocca un altro oggetto in cu é intercettato il tocco... allora Action assumerà il valore di 6
 
Last edited:

MarcoRome

Expert
Licensed User
Longtime User
Risolto ...

B4X:
Dim obj As Reflector
obj.Target = MyPanel
obj.SetOnTouchListener("MyPanel_Touch")

B4X:
Sub MyPanel_Touch(viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean

    Dim jo As JavaObject = motionevent
    Dim pc As Int = jo.RunMethod("getPointerCount", Null)
 
    For p=0 To pc-1
        Dim PointerID As Int = jo.RunMethod("getPointerId", Array As Object(p))
        Log(jo.RunMethod("getX", Array As Object(p)))
        Log(jo.RunMethod("getY", Array As Object(p)))
    Next

    Return True
End Sub

E bravo Star
 

Star-Dust

Expert
Licensed User
Longtime User
Grazie. Sto cercando di fare uno Zoom con SetScaleX e SetScaleY di una view... un PinchToZoom, e mi serve conoscere almeno due punti.
Ma non voglio usare una libreria perché sto realizzando proprio una libreria.

Trovo antipatico che una libreria funzioni solo se ne carichi un altra, quindi volevo evitare Gesture e GestureDetect

Adesso speriamo che funziona :p:p
 

Star-Dust

Expert
Licensed User
Longtime User
A me è successo il contrario.
In una mia libreria ho inserito una classe di un'altra libreria. Quando ho distribuito un utente mi ha segnalato che alla compilazione gli richiedeva l'altra libreria...che lui non aveva
 

Star-Dust

Expert
Licensed User
Longtime User
Questo è quello che volevo ottenere
Fare il Pinch To Zoom di una View che appena lasci ritorna lo zoom a 100%
B4X:
private Sub ScrollGrid_Touch (viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean
    Dim XX,YY As Int

    ListRight.RemoveView
    Select action
        Case 0   ' ACTION_DOWN
            Sx=X
            Sy=y
        Case 1   ' ACTION_UP
          
        Case 2   ' ACTION_MOVE
            YY=ScrollGrid.top+y-Sy
            XX=ScrollGrid.Left+x-Sx
          
        Case Else
            'Log("interrupt") ' 3,6
    End Select
  
    Dim jo As JavaObject = motionevent
    Dim pc As Int = jo.RunMethod("getPointerCount", Null)
  
    If pc>1 Then
        'Log(jo.RunMethod("action", Array As Object(1)))
        '261 ACTION_DOWN
        '  2 ACTION_MOVE
        '262 ACTION_UP
        '  6 CLOSE
        Select action
            Case 261 ' ACTION_DOWN
                Zx=jo.RunMethod("getX", Array As Object(1))
                Zy=jo.RunMethod("getY", Array As Object(1))
            Case 6,262 ' ACTION_UP
                ScaleView(ScrollGrid,1)
            Case 2 ' ACTION_MOVE
                XX=jo.RunMethod("getX", Array As Object(1))
                YY=jo.RunMethod("getY", Array As Object(1))
              
                Dim Zi As Float = Sqrt(Power(Abs(Sy-Zy),2)+Power(Abs(Sx-Zx),2))
                Dim Zm As Float = Sqrt(Power(Abs(Sy-YY),2)+Power(Abs(Sy-XX),2))
                'Log(Floor((Zm/Zi)*100))
          
                ScaleView(ScrollGrid,Zm/Zi)
            Case Else
                ' Interrupt 3, 6
                'Log(action)
        End Select

    End If
  
    Return True
End Sub

Private Sub ScaleView(v As View, Scale As Float)
    Dim jo As JavaObject = v

    jo.RunMethod("setScaleX", Array(Scale))
    jo.RunMethod("setScaleY", Array(Scale))
End Sub
 
Top