Skip to content

Commit bf5a64c

Browse files
committed
feat(android): support for GLTextureView
1 parent ceb033a commit bf5a64c

File tree

3 files changed

+159
-2
lines changed

3 files changed

+159
-2
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package com.akylas.carto.additions;
2+
3+
import android.content.Context;
4+
import android.os.Handler;
5+
import android.util.Log;
6+
7+
import com.carto.ui.MapClickInfo;
8+
import com.carto.ui.MapEventListener;
9+
import com.carto.ui.TextureMapView;
10+
11+
import android.view.MotionEvent;
12+
13+
public class AKTextureMapView extends TextureMapView {
14+
static final String TAG = "AKTextureMapView";
15+
Handler mainHandler = null;
16+
public boolean userAction = false;
17+
private AKMapEventListener listener = null;
18+
19+
static public boolean RUN_ON_MAIN_THREAD = true;
20+
21+
static public void setRunOnMainThread(boolean value) {
22+
RUN_ON_MAIN_THREAD = value;
23+
}
24+
25+
public void setMapEventListener(AKMapEventListener listener) {
26+
this.listener = listener;
27+
if (listener != null) {
28+
super.setMapEventListener(mapEventListener);
29+
} else {
30+
super.setMapEventListener(null);
31+
}
32+
}
33+
34+
35+
public AKTextureMapView(Context context) {
36+
super(context);
37+
this.mainHandler = new Handler(context.getMainLooper());
38+
}
39+
40+
@Override
41+
public boolean onTouchEvent(MotionEvent event) {
42+
43+
boolean clickable = isClickable() || isLongClickable();
44+
if (!isEnabled() || !clickable) {
45+
return clickable;
46+
}
47+
48+
switch (event.getActionMasked()) {
49+
case MotionEvent.ACTION_POINTER_DOWN:
50+
case MotionEvent.ACTION_DOWN:
51+
this.userAction = false;
52+
break;
53+
case MotionEvent.ACTION_MOVE:
54+
this.userAction = true;
55+
break;
56+
case MotionEvent.ACTION_CANCEL:
57+
case MotionEvent.ACTION_UP:
58+
case MotionEvent.ACTION_POINTER_UP:
59+
// this.userAction = false;
60+
break;
61+
}
62+
return super.onTouchEvent(event);
63+
}
64+
65+
private final MapEventListener mapEventListener = new MapEventListener() {
66+
@Override
67+
public void onMapMoved() {
68+
if (AKTextureMapView.RUN_ON_MAIN_THREAD) {
69+
mainHandler.post(new Runnable() {
70+
@Override
71+
public void run() {
72+
if (AKTextureMapView.this.listener != null) {
73+
AKTextureMapView.this.listener.onMapMoved(userAction);
74+
}
75+
}
76+
});
77+
} else {
78+
if (AKTextureMapView.this.listener != null) {
79+
AKTextureMapView.this.listener.onMapMoved(userAction);
80+
}
81+
}
82+
}
83+
84+
@Override
85+
public void onMapIdle() {
86+
if (AKTextureMapView.RUN_ON_MAIN_THREAD) {
87+
mainHandler.post(new Runnable() {
88+
@Override
89+
public void run() {
90+
if (AKTextureMapView.this.listener != null) {
91+
AKTextureMapView.this.listener.onMapIdle();
92+
}
93+
}
94+
});
95+
} else {
96+
if (AKTextureMapView.this.listener != null) {
97+
AKTextureMapView.this.listener.onMapIdle();
98+
}
99+
}
100+
101+
}
102+
103+
@Override
104+
public void onMapStable() {
105+
if (AKTextureMapView.RUN_ON_MAIN_THREAD) {
106+
mainHandler.post(new Runnable() {
107+
@Override
108+
public void run() {
109+
if (AKTextureMapView.this.listener != null) {
110+
AKTextureMapView.this.listener.onMapStable(AKTextureMapView.this.userAction);
111+
}
112+
AKTextureMapView.this.userAction = false;
113+
}
114+
});
115+
} else {
116+
if (AKTextureMapView.this.listener != null) {
117+
AKTextureMapView.this.listener.onMapStable(AKTextureMapView.this.userAction);
118+
}
119+
AKTextureMapView.this.userAction = false;
120+
}
121+
}
122+
123+
@Override
124+
public void onMapClicked(final MapClickInfo mapClickInfo) {
125+
if (AKTextureMapView.RUN_ON_MAIN_THREAD) {
126+
mainHandler.post(new Runnable() {
127+
@Override
128+
public void run() {
129+
if (AKTextureMapView.this.listener != null) {
130+
AKTextureMapView.this.listener.onMapClicked(mapClickInfo);
131+
}
132+
}
133+
});
134+
} else {
135+
if (AKTextureMapView.this.listener != null) {
136+
AKTextureMapView.this.listener.onMapClicked(mapClickInfo);
137+
}
138+
}
139+
}
140+
};
141+
}

src/typings/ak.carto.android.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ declare namespace com {
368368
public sendAccessibilityEvent(param0: number): void;
369369
public onSurfaceChanged(param0: javax.microedition.khronos.opengles.GL10, param1: number, param2: number): void;
370370
}
371+
export class AKTextureMapView extends AKMapView {}
371372
}
372373
}
373374
}

src/ui/index.android.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { restrictedPanningProperty } from './cssproperties';
2020

2121
import { MapOptions } from '.';
2222
import { EPSG4326 } from '../projections/epsg4326';
23-
import { ImageSource } from '@nativescript/core';
23+
import { ImageSource, Property, booleanConverter } from '@nativescript/core';
2424
export { MapClickedEvent, MapIdleEvent, MapMovedEvent, MapReadyEvent, MapStableEvent, setLicenseKeyRegistered };
2525

2626
export const time = global.__time || Date.now;
@@ -81,6 +81,7 @@ export function getLicenseKey() {
8181
}
8282

8383
export class CartoMap<T = DefaultLatLonKeys> extends CartoViewBase {
84+
public useTextureView: boolean;
8485
public static setRunOnMainThread(value: boolean) {
8586
com.akylas.carto.additions.AKMapView.setRunOnMainThread(value);
8687
}
@@ -109,7 +110,14 @@ export class CartoMap<T = DefaultLatLonKeys> extends CartoViewBase {
109110
registerLicense(license);
110111
}
111112
}
112-
return new com.akylas.carto.additions.AKMapView(this._context);
113+
let view;
114+
if (this.useTextureView) {
115+
view = new com.akylas.carto.additions.AKTextureMapView(this._context);
116+
} else {
117+
view = new com.akylas.carto.additions.AKMapView(this._context);
118+
}
119+
// view.setLayerType(android.view.View.LAYER_TYPE_HARDWARE, null);
120+
return view;
113121
}
114122

115123
getOptions() {
@@ -299,3 +307,10 @@ export class CartoMap<T = DefaultLatLonKeys> extends CartoViewBase {
299307
});
300308
}
301309
}
310+
311+
export const useTextureViewProperty = new Property<CartoMap, boolean>({
312+
defaultValue: false,
313+
name: 'useTextureView',
314+
valueConverter: booleanConverter,
315+
});
316+
useTextureViewProperty.register(CartoMap);

0 commit comments

Comments
 (0)