Thanks. I didn't know about the implicit CSS -> properties mapping in FX.

And my point still holds: the capture zone doesn't seem to fit to CSS.

--
best regards,
Anthony

On 11/14/2013 10:08 AM, Richard Bair wrote:
All the things you can style from CSS resolve to properties in the code, so in 
any case there would be a property in code, it is just a question of whether 
you also want to be able to set the value from CSS.

On Nov 13, 2013, at 10:31 PM, Anthony Petrov <anthony.pet...@oracle.com> wrote:

I'm not sure if CSS is the best place to tag nodes with this attribute. CSS is supposed to describe 
styles (i.e. the way a node is represented on the screen, "the look"), while extending 
the capture zone doesn't affect the visual representation of a node, but instead is related to 
events handling (i.e. "the feel") and thus, IMO, should be handled in the code (e.g. as a 
property) rather than in CSS.

--
best regards,
Anthony

On 11/14/2013 01:09 AM, Daniel Blaukopf wrote:
Hi Seeon,

Summarizing our face to face talk today:

I see that the case described by Pavel is indeed a problem and agree with you 
that not every node needs to be a participant in the competition for which 
grabs touch input. However I’m not keen on the idea of changing behavior based 
on which nodes have listeners on them. CSS seems like the place to do this (as 
I think Pavel suggested earlier). In Pavel’s case, either:
  - the upper child node has the CSS tag saying “enable extended capture zone” 
and the lower child doesn’t: then the upper child’s capture zone will extend 
over the lower child
  - or both will have the CSS tag, in which case the upper child’s capture zone 
would be competing with the lower child’s capture zone. As in any other 
competition between capture zones the nearest node should win. The effect would 
be the same as if the regular matching rules were applied on the upper child. 
It would also be the same as if only the lower child had an extended capture 
zone. However, I’d consider this case to be bad UI programming.

We agreed that “in a competition between capture zones, pick the node whose 
border is nearest the touch point” was a reasonable way to resolve things.

Thanks,
Daniel

On Nov 13, 2013, at 12:31 PM, Seeon Birger <seeon.bir...@oracle.com> wrote:

Hi Pavel,

Your example of 'child over child' is an interesting case which raises some 
design aspects of the desired picking algorithm:
1. Which node to pick when one node has a 'strict containership' over the touch 
center and the other node only has a fuzzy containership (the position falls in 
the fuzzy area).
2. Accounting for z-order for extended capture zone area.
3. Accounting for parent-child relationship.

Referring to your 'child over child' example:
http://i.imgur.com/e92qEJA.jpg

The conflict would arise were touch point center position falls in the capture 
zone area of child2 but also clearly falls in the strict bounds of child1.
Generally, when two control nodes compete on same touch event (e.g. child1 & child2 in Daniel's 
diagram), it seems that we would like to give priority to "strict containership" over 
"fuzzy containership".
But in your case it's probably not the desired behavior.

Also note that in the general case there's almost always exists come 
container/background node that strictly contains the touch point, but it would 
probably be an ancestor of the child node, so the usual parent-child 
relationship order will give preference to the child.

One way out it is to honor the usual z-order for the extended area of child2, 
so when a touch center hits the fuzzy area of child2, then child2 would be 
picked.

But is not ideal for Daniel's example:
http://i.imgur.com/ELWamYp.png

where the 2 nodes don't strictly overlap, but their capture zones do. Preferring one 
child by z-order (which matches the order of children in the parent) is not natural here. 
And we might better choose the node which is "closer"
To the touch point.

So to summarize I suggest this rough picking algorithm:
1. Choose all uppermost nodes which are not transparent to mouse events and 
contain the touch point center either strictly or by their capture zone.
2. Remove all nodes that is strictly overlapped by another node and is below 
that node by z-order.
3. Out of those left choose the "closest" node. (the concept of "closet" should 
employ some calculation which might not be trivial in the general case).
4. Once a node has been picked, we follow the usual node chain list for event 
processing.

Care must be taken so we not break the current model for event processing. For 
example, if a node is picked by its capture zone, it means that the position 
does not fall in the boundaries of the node, so existing event handling code 
that relies on that would break. So I think the capture zone feature should be 
selectively enabled for certain type of nodes such buttons or other classic 
controls.

Regards,
Seeon





-----Original Message-----
From: Pavel Safrata
Sent: Tuesday, November 12, 2013 1:11 PM
To: Daniel Blaukopf
Cc: OpenJFX
Subject: Re: discussion about touch events

(Now my answer using external link)

Hello Daniel,
this is quite similar to my idea described earlier. The major difference is the 
"fair division of capture zones" among siblings. It's an interesting idea, 
let's explore it. What pops first is that children can also overlap. So I think it would 
behave like this (green capture zones
omitted):

Child in parent vs. Child over child: http://i.imgur.com/e92qEJA.jpg

..wouldn't it? From user's point of view this seems confusing, both cases look 
the same but behave differently. Note that in the case on the right, the parent 
may be still the same, developer only adds a fancy background as a new child 
and suddenly the red child can't be hit that easily. What do you think? Is it 
an issue? Or would it not behave this way?

Regards,
Pavel

On 12.11.2013 12:06, Daniel Blaukopf wrote:
(My original message didn't get through to openjfx-dev because I used
inline images. I've replaced those images with external links)

On Nov 11, 2013, at 11:30 PM, Pavel Safrata <pavel.safr...@oracle.com
<mailto:pavel.safr...@oracle.com>> wrote:

On 11.11.2013 17:49, Tomas Mikula wrote:
On Mon, Nov 11, 2013 at 1:28 PM, Philipp Dörfler
<phdoerf...@gmail.com <mailto:phdoerf...@gmail.com>> wrote:
I see the need to be aware of the area that is covered by fingers
rather than just considering that area's center point.
I'd guess that this adds a new layer of complexity, though. For
instance:
Say we have a button on some background and both the background and
the button do have an onClick listener attached. If you tap the
button in a way that the touched area's center point is outside of
the buttons boundaries - what event will be fired? Will both the
background and the button receive a click event? Or just either the
background or the button exclusively? Will there be a new event
type which gets fired in case of such area-based taps?

My suggestion would therefore be to have an additional area tap
event which gives precise information about diameter and center of
the tap. Besides that there should be some kind of "priority" for
choosing which node's onClick will be called.
What about picking the one that is closest to the center of the touch?

There is always something directly on the center of the touch
(possibly the scene background, but it can have event handlers too).
That's what we pick right now.
Pavel

What Seeon, Assaf and I discussed earlier was building some fuzziness
into the node picker so that instead of each node capturing only
events directly on top of it:

Non-fuzzy picker: http://i.imgur.com/uszql8V.png

..nodes at each level of the hierarchy would capture events beyond
their borders as well:

Fuzzy picker: http://i.imgur.com/ELWamYp.png

In the above, "Parent" would capture touch events within a certain
radius around it, as would its children "Child 1" and "Child 2". Since
"Child 1" and "Child 2" are peers, they would have a sharp division
between them, a watershed on either side of which events would go to
one child node or the other. This would also apply if the peer nodes
were further apart; they would divide the no-man's land between them.
Of course this no-man's land would be part of "Parent" and could could
be touch-sensitive - but we won't consider "Parent" as an event target
until we have ruled out using one of its children's extended capture
zones.

The capture radius could either be a styleable property on the nodes,
or could be determined by the X and Y size of a touch point as
reported by the touch screen. We'd still be reporting a touch point,
not a touch area. The touch target would be, as now, a single node.

This would get us more reliable touch capture at leaf nodes of the
node hierarchy at the expense of it being harder to tap the
background. This is likely to be a good trade-off.

Daniel




Tomas

Maybe the draw order / order in the scene graph / z buffer value
might be sufficient to model what would happen in the real,
physical world.
Am 11.11.2013 13:05 schrieb "Assaf Yavnai" <assaf.yav...@oracle.com
<mailto:assaf.yav...@oracle.com>>:

The ascii sketch looked fine on my screen before I sent the mail
:( I hope the idea is clear from the text (now in the reply dialog
its also look good)

Assaf
On 11/11/2013 12:51 PM, Assaf Yavnai wrote:

Hi Guys,

I hope that I'm right about this, but it seems that touch events
in glass are translated (and reported) as a single point events
(x & y) without an area, like pointer events.
AFAIK, the controls response for touch events same as mouse
events (using the same pickers) and as a result a button press,
for example, will only triggered if the x & y of the touch event
is within the control area.

This means that small controls, or even quite large controls
(like buttons with text) will often get missed because the 'strict'
node picking,
although from a UX point of view it is strange as the user
clearly pressed on a node (the finger was clearly above it) but
nothing happens...

With current implementation its hard to use small features in
controls, like scrollbars in lists, and it almost impossible to
implement something like 'screen navigator' (the series of small
dots in the bottom of a smart phones screen which allow you to
jump directly to a 'far away'
screen)

To illustrate it consider the bellow low resolution sketch, where
the "+"
is the actual x,y reported, the ellipse is the finger touch area
and the rectangle is the node.
With current implementation this type of tap will not trigger the
node handlers

                __
              /     \
             /       \
       ___/ __+_ \___    in this scenario the 'button' will not get
pressed
       |    \         /    |
       |___\ ___ / __ |
              \___/

If your smart phone support it, turn on the touch debugging
options in settings and see that each point translate to a quite
large circle and what ever fall in it, or reasonably close to it,
get picked.

I want to start a discussion to understand if my perspective is
accurate and to understand what can be done, if any, for the
coming release or the next one.

We might use recently opened RT-34136 <https://javafx-jira.kenai.
com/browse/RT-34136> for logging this, or open a new JIRA for it

Thanks,
Assaf

Reply via email to