1717public class CanvasView extends View implements SharedPreferences .OnSharedPreferenceChangeListener {
1818 private static final String TAG = "GfxTablet.CanvasView" ;
1919
20+ private enum InRangeStatus {
21+ OutOfRange ,
22+ InRange ,
23+ FakeInRange
24+ }
25+
2026 final SharedPreferences settings ;
2127 NetworkClient netClient ;
2228 boolean acceptStylusOnly ;
2329 int maxX , maxY ;
30+ InRangeStatus inRangeStatus ;
2431
2532
2633 // setup
@@ -35,6 +42,7 @@ public CanvasView(Context context, AttributeSet attributeSet) {
3542 settings .registerOnSharedPreferenceChangeListener (this );
3643 setBackground ();
3744 setInputMethods ();
45+ inRangeStatus = InRangeStatus .OutOfRange ;
3846 }
3947
4048 public void setNetworkClient (NetworkClient networkClient ) {
@@ -83,13 +91,23 @@ public boolean onGenericMotionEvent(MotionEvent event) {
8391 if (isEnabled ()) {
8492 for (int ptr = 0 ; ptr < event .getPointerCount (); ptr ++)
8593 if (!acceptStylusOnly || (event .getToolType (ptr ) == MotionEvent .TOOL_TYPE_STYLUS )) {
94+ short nx = normalizeX (event .getX (ptr )),
95+ ny = normalizeY (event .getY (ptr )),
96+ npressure = normalizePressure (event .getPressure (ptr ));
8697 Log .v (TAG , String .format ("Generic motion event logged: %f|%f, pressure %f" , event .getX (ptr ), event .getY (ptr ), event .getPressure (ptr )));
87- if (event .getActionMasked () == MotionEvent .ACTION_HOVER_MOVE )
88- netClient .getQueue ().add (new NetEvent (Type .TYPE_MOTION ,
89- normalizeX (event .getX (ptr )),
90- normalizeY (event .getY (ptr )),
91- normalizePressure (event .getPressure (ptr ))
92- ));
98+ switch (event .getActionMasked ()) {
99+ case MotionEvent .ACTION_HOVER_MOVE :
100+ netClient .getQueue ().add (new NetEvent (Type .TYPE_MOTION , nx , ny , npressure ));
101+ break ;
102+ case MotionEvent .ACTION_HOVER_ENTER :
103+ inRangeStatus = InRangeStatus .InRange ;
104+ netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , npressure , -1 , true ));
105+ break ;
106+ case MotionEvent .ACTION_HOVER_EXIT :
107+ inRangeStatus = InRangeStatus .OutOfRange ;
108+ netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , npressure , -1 , false ));
109+ break ;
110+ }
93111 }
94112 return true ;
95113 }
@@ -110,11 +128,19 @@ public boolean onTouchEvent(@NonNull MotionEvent event) {
110128 netClient .getQueue ().add (new NetEvent (Type .TYPE_MOTION , nx , ny , npressure ));
111129 break ;
112130 case MotionEvent .ACTION_DOWN :
131+ if (inRangeStatus == inRangeStatus .OutOfRange ) {
132+ inRangeStatus = inRangeStatus .FakeInRange ;
133+ netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , (short )0 , -1 , true ));
134+ }
113135 netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , npressure , 0 , true ));
114136 break ;
115137 case MotionEvent .ACTION_UP :
116138 case MotionEvent .ACTION_CANCEL :
117139 netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , npressure , 0 , false ));
140+ if (inRangeStatus == inRangeStatus .FakeInRange ) {
141+ inRangeStatus = inRangeStatus .OutOfRange ;
142+ netClient .getQueue ().add (new NetEvent (Type .TYPE_BUTTON , nx , ny , (short )0 , -1 , false ));
143+ }
118144 break ;
119145 }
120146
0 commit comments