Új hozzászólás Aktív témák

  • thon73
    tag

    View-ban otthon lévő szakértőtől szeretnék segítséget kérni.

    Van egy custom view, custom onTouchEvent(MotionEvent event) metódussal.

    A MotionEvent.ACTION_DOWN ág meghív egy requestLayout()-ot, mivel a kép mérete az érintésnél változik. Az odáig tiszta, hogy a kép újraméretezése később kerül meghívásra.

    A kérdésem az, hogy MIKOR, merthogy van egy MotionEvent.ACTION_MOVE ág, ami már egy következő onTouchEvent() hívásban aktiválódik, de ebben még nem fut le a requestLayout (pontosabban az onMeasure()) és emiatt nem tudok a képmérettel dolgozni.

    Valahogy ez történik: ÉRINTÉS - ekkor megváltozik a view - HÚZÁS - ez meg még nem tud az új mérettel kalkulálni. Szerintetek honnan lehet megtudni, hogy lehet-e már az új mérettel dolgozni?

    Előre is köszönöm. Nekem csak nagyon kacifántos ötleteim vannak, pl. egy trigger az onMeasure-be (akár a méret), de nem létezik, hogy ez ilyen macerás legyen.

    ((Az egész View felvázolása meglehetősen összetett, persze csak az egyik rész érintése váltja ki a méretváltozást. De ez a rész működik is.))

    Hosszas próbálkozás után sem tudtam tökéletesen megoldani.
    Ha valaki egyszer ilyesmibe fut bele:

    A requestLayout() nem fut le azonnal, sőt elég sokáig nem fut le.
    Ha az onTouchEvent() rész alatt bárminek szüksége van az új kép adataira (méreteire), az ebben az időben még a korábbi (invalid) értéket fogja tartalmazni.
    Az új érték csak az onMeasure() (bizonyos esetekben egyszerűbb lehet az onSizeChanged) lefutása UTÁN érhető el - ami amúgy logikus.
    Ezen idő alatt skippelni kell (lehet) az érkező MotionEvent-eket.
    DE! a kihagyott eventek miatt nem bizonyos, hogy az UP/POINTER_UP eventeket elkapjuk.

    Nekem szerencsére nem kellett sem az UP, sem a DOWN részben a méret, és úgy találtam (próbálgatással), hogy valamiért a POINTER_DOWN rész sem következik be onMeasure() lezajlása előtt. (Ezt nem tudom, miért van így; lehet, hogy így sincs.) Viszont: A MOVE eseményekből 40-50 elemet is rendszeresen "skippel" a program.

    Így végül eléggé a lassú emberi reakciókra építek, de - végső soron - ez működik.

    ((Még olvastam egy listenerről, ami a layout lerendezése után értesít, de a logikán ez sem változtat.))

Új hozzászólás Aktív témák