anchorNodeList = new ArrayList<>();
65 | private Integer numberOfAnchors = 0;
66 | private AnchorNode currentSelectedAnchorNode = null;
67 | private Node nodeForLine;
68 |
69 |
70 | @Override
71 | @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"})
72 | // CompletableFuture requires api level 24
73 | // FutureReturnValueIgnored is not valid
74 | protected void onCreate(Bundle savedInstanceState) {
75 | super.onCreate(savedInstanceState);
76 |
77 | if (!checkIsSupportedDeviceOrFinish(this)) {
78 | return;
79 | }
80 |
81 | setContentView(R.layout.activity_ux);
82 | arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
83 |
84 | // When you build a Renderable, Sceneform loads its resources in the background while returning
85 | // a CompletableFuture. Call thenAccept(), handle(), or check isDone() before calling get().
86 | ModelRenderable.builder()
87 | .setSource(this, R.raw.andy)
88 | .build()
89 | .thenAccept(renderable -> andyRenderable = renderable)
90 | .exceptionally(
91 | throwable -> {
92 | Toast toast =
93 | Toast.makeText(this, "Unable to load andy renderable", Toast.LENGTH_LONG);
94 | toast.setGravity(Gravity.CENTER, 0, 0);
95 | toast.show();
96 | return null;
97 | });
98 |
99 | ModelRenderable.builder()
100 | .setSource(this, R.raw.arcticfox_posed)
101 | .build()
102 | .thenAccept(renderable -> foxRenderable = renderable)
103 | .exceptionally(
104 | throwable -> {
105 | Toast toast =
106 | Toast.makeText(this, "Unable to load fox renderable", Toast.LENGTH_LONG);
107 | toast.setGravity(Gravity.CENTER, 0, 0);
108 | toast.show();
109 | return null;
110 | });
111 |
112 | arFragment.setOnTapArPlaneListener(
113 | (HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
114 | // Do nothng on plane taps for now
115 |
116 | });
117 |
118 | arFragment.getArSceneView().getScene().setOnPeekTouchListener(this::handleOnTouch);
119 |
120 | //Add a listener for the back button
121 | FloatingActionButton backButtom = findViewById(R.id.back_buttom);
122 | backButtom.setOnClickListener(new View.OnClickListener() {
123 | @Override
124 | public void onClick(View view) {
125 | //Move the anchor back
126 | Log.d(TAG,"Moving anchor back");
127 | if (currentSelectedAnchorNode != null) {
128 | //Get the current Pose and transform it then set a new anchor at the new pose
129 | Session session = arFragment.getArSceneView().getSession();
130 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
131 | Pose oldPose = currentAnchor.getPose();
132 | Pose newPose = oldPose.compose(Pose.makeTranslation(0,0,-0.05f));
133 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
134 | }
135 | }
136 | });
137 |
138 | //Add a listener for the forward button
139 | FloatingActionButton forwardButtom = findViewById(R.id.forward_buttom);
140 | forwardButtom.setOnClickListener(new View.OnClickListener() {
141 | @Override
142 | public void onClick(View view) {
143 | //Move the anchor forward
144 | Log.d(TAG,"Moving anchor forward");
145 | if (currentSelectedAnchorNode != null) {
146 | //Get the current Pose and transform it then set a new anchor at the new pose
147 | Session session = arFragment.getArSceneView().getSession();
148 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
149 | Pose oldPose = currentAnchor.getPose();
150 | Pose newPose = oldPose.compose(Pose.makeTranslation(0,0,0.05f));
151 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
152 | }
153 | }
154 | });
155 |
156 | //Add a listener for the left button
157 | FloatingActionButton leftButtom = findViewById(R.id.left_button);
158 | leftButtom.setOnClickListener(new View.OnClickListener() {
159 | @Override
160 | public void onClick(View view) {
161 | //Move the anchor left
162 | Log.d(TAG,"Moving anchor left");
163 | if (currentSelectedAnchorNode != null) {
164 | //Get the current Pose and transform it then set a new anchor at the new pose
165 | Session session = arFragment.getArSceneView().getSession();
166 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
167 | Pose oldPose = currentAnchor.getPose();
168 | Pose newPose = oldPose.compose(Pose.makeTranslation(-0.05f,0,0));
169 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
170 | }
171 | }
172 | });
173 |
174 | //Add a listener for the right button
175 | FloatingActionButton rightButtom = findViewById(R.id.right_button);
176 | rightButtom.setOnClickListener(new View.OnClickListener() {
177 | @Override
178 | public void onClick(View view) {
179 | //Move the anchor right
180 | Log.d(TAG,"Moving anchor Right");
181 | if (currentSelectedAnchorNode != null) {
182 | //Get the current Pose and transform it then set a new anchor at the new pose
183 | Session session = arFragment.getArSceneView().getSession();
184 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
185 | Pose oldPose = currentAnchor.getPose();
186 | Pose newPose = oldPose.compose(Pose.makeTranslation(0.05f,0,0));
187 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
188 | }
189 | }
190 | });
191 |
192 | //Add a listener for the up button
193 | FloatingActionButton upButtom = findViewById(R.id.up_button);
194 | upButtom.setOnClickListener(new View.OnClickListener() {
195 | @Override
196 | public void onClick(View view) {
197 | //Move the anchor up
198 | Log.d(TAG,"Moving anchor Up");
199 | if (currentSelectedAnchorNode != null) {
200 | //Get the current Pose and transform it then set a new anchor at the new pose
201 | Session session = arFragment.getArSceneView().getSession();
202 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
203 | Pose oldPose = currentAnchor.getPose();
204 | Pose newPose = oldPose.compose(Pose.makeTranslation(0,0.05f,0));
205 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
206 | }
207 | }
208 | });
209 |
210 | //Add a listener for the down button
211 | FloatingActionButton downButtom = findViewById(R.id.down_button);
212 | downButtom.setOnClickListener(new View.OnClickListener() {
213 | @Override
214 | public void onClick(View view) {
215 | //Move the anchor down
216 | Log.d(TAG,"Moving anchor Down");
217 | if (currentSelectedAnchorNode != null) {
218 | //Get the current Pose and transform it then set a new anchor at the new pose
219 | Session session = arFragment.getArSceneView().getSession();
220 | Anchor currentAnchor = currentSelectedAnchorNode.getAnchor();
221 | Pose oldPose = currentAnchor.getPose();
222 | Pose newPose = oldPose.compose(Pose.makeTranslation(0,-0.05f,0));
223 | currentSelectedAnchorNode = moveRenderable(currentSelectedAnchorNode, newPose);
224 | }
225 | }
226 | });
227 |
228 | //Add a listener for the drawline button
229 | FloatingActionButton drawLineButton = findViewById(R.id.draw_buttom);
230 | drawLineButton.setOnClickListener(new View.OnClickListener() {
231 | @Override
232 |
233 | public void onClick(View view) {
234 | //draw a line bteween the two Anchors, if there are exactly two anchros
235 | Log.d(TAG,"drawing line");
236 | if (numberOfAnchors == 2 ) {
237 | drawLine(anchorNodeList.get(0), anchorNodeList.get(1));
238 | }
239 | }
240 | });
241 |
242 | //Add a listener for the delete button
243 | FloatingActionButton deleteButton = findViewById(R.id.delete_buttom);
244 | deleteButton.setOnClickListener(new View.OnClickListener() {
245 | @Override
246 |
247 | public void onClick(View view) {
248 | //Delete the Anchor if it exists
249 | Log.d(TAG,"Deleteing anchor");
250 | int currentAnchorIndex;
251 | if (numberOfAnchors < 1 ) {
252 | Toast.makeText(LineViewMainActivity.this, "All nodes deleted", Toast.LENGTH_SHORT).show();
253 | return;
254 | }
255 | removeAnchorNode(currentSelectedAnchorNode);
256 | currentSelectedAnchorNode = null;
257 |
258 | //Remove the line if it exists also
259 | removeLine(nodeForLine);
260 | }
261 | });
262 | }
263 |
264 | private void handleOnTouch(HitTestResult hitTestResult, MotionEvent motionEvent) {
265 | Log.d(TAG,"handleOnTouch");
266 | // First call ArFragment's listener to handle TransformableNodes.
267 | arFragment.onPeekTouch(hitTestResult, motionEvent);
268 |
269 | //We are only interested in the ACTION_UP events - anything else just return
270 | if (motionEvent.getAction() != MotionEvent.ACTION_UP) {
271 | return;
272 | }
273 |
274 | // Check for touching a Sceneform node
275 | if (hitTestResult.getNode() != null) {
276 | Log.d(TAG,"handleOnTouch hitTestResult.getNode() != null");
277 | //Toast.makeText(LineViewMainActivity.this, "hitTestResult is not null: ", Toast.LENGTH_SHORT).show();
278 | Node hitNode = hitTestResult.getNode();
279 |
280 | if (hitNode.getRenderable() == andyRenderable) {
281 | //Toast.makeText(LineViewMainActivity.this, "We've hit Andy!!", Toast.LENGTH_SHORT).show();
282 | //First make the current (soon to be not current) selected node not highlighted
283 | if (currentSelectedAnchorNode != null) {
284 | currentSelectedAnchorNode.setRenderable(andyRenderable);
285 | }
286 | //Now highlight the new current selected node
287 | ModelRenderable highlightedAndyRenderable = andyRenderable.makeCopy();
288 | highlightedAndyRenderable.getMaterial().setFloat3("baseColorTint", new Color(android.graphics.Color.rgb(255,0,0)));
289 | hitNode.setRenderable(highlightedAndyRenderable);
290 | currentSelectedAnchorNode = (AnchorNode) hitNode;
291 | }
292 | return;
293 | } else{
294 | // Place the anchor 1m in front of the camera. Make sure we are not at maximum anchor first.
295 | Log.d(TAG,"adding Andy in fornt of camera");
296 | if (numberOfAnchors < MAX_ANCHORS) {
297 | Frame frame = arFragment.getArSceneView().getArFrame();
298 | int currentAnchorIndex = numberOfAnchors;
299 | Session session = arFragment.getArSceneView().getSession();
300 | Anchor newMarkAnchor = session.createAnchor(
301 | frame.getCamera().getPose()
302 | .compose(Pose.makeTranslation(0, 0, -1f))
303 | .extractTranslation());
304 | AnchorNode addedAnchorNode = new AnchorNode(newMarkAnchor);
305 | addedAnchorNode.setRenderable(andyRenderable);
306 | addAnchorNode(addedAnchorNode);
307 | currentSelectedAnchorNode = addedAnchorNode;
308 | } else {
309 | Log.d(TAG,"MAX_ANCHORS exceeded");
310 | }
311 | }
312 |
313 | }
314 |
315 | /**
316 | * Returns false and displays an error message if Sceneform can not run, true if Sceneform can run
317 | * on this device.
318 | *
319 | * Sceneform requires Android N on the device as well as OpenGL 3.0 capabilities.
320 | *
321 | *
Finishes the activity if Sceneform can not run
322 | */
323 | public static boolean checkIsSupportedDeviceOrFinish(final Activity activity) {
324 | if (Build.VERSION.SDK_INT < VERSION_CODES.N) {
325 | Log.e(TAG, "Sceneform requires Android N or later");
326 | Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show();
327 | activity.finish();
328 | return false;
329 | }
330 | String openGlVersionString =
331 | ((ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE))
332 | .getDeviceConfigurationInfo()
333 | .getGlEsVersion();
334 | if (Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) {
335 | Log.e(TAG, "Sceneform requires OpenGL ES 3.0 later");
336 | Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG)
337 | .show();
338 | activity.finish();
339 | return false;
340 | }
341 | return true;
342 | }
343 |
344 | private void removeAnchorNode(AnchorNode nodeToremove) {
345 | //Remove an anchor node
346 | if (nodeToremove != null) {
347 | arFragment.getArSceneView().getScene().removeChild(nodeToremove);
348 | anchorNodeList.remove(nodeToremove);
349 | nodeToremove.getAnchor().detach();
350 | nodeToremove.setParent(null);
351 | nodeToremove = null;
352 | numberOfAnchors--;
353 | //Toast.makeText(LineViewMainActivity.this, "Test Delete - markAnchorNode removed", Toast.LENGTH_SHORT).show();
354 | } else {
355 | Toast.makeText(LineViewMainActivity.this, "Delete - no node selected! Touch a node to select it.", Toast.LENGTH_SHORT).show();
356 | }
357 | }
358 |
359 | private void removeLine(Node lineToRemove) {
360 | //remove the line
361 | Log.e(TAG, "removeLine");
362 | if (lineToRemove != null) {
363 | Log.e(TAG, "removeLine lineToRemove is not mull");
364 | arFragment.getArSceneView().getScene().removeChild(lineToRemove);
365 | lineToRemove.setParent(null);
366 | lineToRemove = null;
367 | }
368 | }
369 |
370 | private void addAnchorNode(AnchorNode nodeToAdd) {
371 | //Add an anchor node
372 | nodeToAdd.setParent(arFragment.getArSceneView().getScene());
373 | anchorNodeList.add(nodeToAdd);
374 | numberOfAnchors++;
375 | }
376 |
377 | private AnchorNode moveRenderable(AnchorNode markAnchorNodeToMove, Pose newPoseToMoveTo) {
378 | //Move a renderable to a new pose
379 | if (markAnchorNodeToMove != null) {
380 | arFragment.getArSceneView().getScene().removeChild(markAnchorNodeToMove);
381 | anchorNodeList.remove(markAnchorNodeToMove);
382 | } else {
383 | Log.d(TAG,"moveRenderable - markAnchorNode was null, the little £$%^...");
384 | return null;
385 | }
386 | Frame frame = arFragment.getArSceneView().getArFrame();
387 | Session session = arFragment.getArSceneView().getSession();
388 | Anchor markAnchor = session.createAnchor(newPoseToMoveTo.extractTranslation());
389 | AnchorNode newMarkAnchorNode = new AnchorNode(markAnchor);
390 | newMarkAnchorNode.setRenderable(andyRenderable);
391 | newMarkAnchorNode.setParent(arFragment.getArSceneView().getScene());
392 | anchorNodeList.add(newMarkAnchorNode);
393 |
394 | //Delete the line if it is drawn
395 | removeLine(nodeForLine);
396 |
397 | return newMarkAnchorNode;
398 | }
399 |
400 | private void drawLine(AnchorNode node1, AnchorNode node2) {
401 | //Draw a line between two AnchorNodes (adapted from https://stackoverflow.com/a/52816504/334402)
402 | Log.d(TAG,"drawLine");
403 | Vector3 point1, point2;
404 | point1 = node1.getWorldPosition();
405 | point2 = node2.getWorldPosition();
406 |
407 |
408 | //First, find the vector extending between the two points and define a look rotation
409 | //in terms of this Vector.
410 | final Vector3 difference = Vector3.subtract(point1, point2);
411 | final Vector3 directionFromTopToBottom = difference.normalized();
412 | final Quaternion rotationFromAToB =
413 | Quaternion.lookRotation(directionFromTopToBottom, Vector3.up());
414 | MaterialFactory.makeOpaqueWithColor(getApplicationContext(), new Color(0, 255, 244))
415 | .thenAccept(
416 | material -> {
417 | /* Then, create a rectangular prism, using ShapeFactory.makeCube() and use the difference vector
418 | to extend to the necessary length. */
419 | Log.d(TAG,"drawLine insie .thenAccept");
420 | ModelRenderable model = ShapeFactory.makeCube(
421 | new Vector3(.01f, .01f, difference.length()),
422 | Vector3.zero(), material);
423 | /* Last, set the world rotation of the node to the rotation calculated earlier and set the world position to
424 | the midpoint between the given points . */
425 | Anchor lineAnchor = node2.getAnchor();
426 | nodeForLine = new Node();
427 | nodeForLine.setParent(node1);
428 | nodeForLine.setRenderable(model);
429 | nodeForLine.setWorldPosition(Vector3.add(point1, point2).scaled(.5f));
430 | nodeForLine.setWorldRotation(rotationFromAToB);
431 | }
432 | );
433 |
434 | }
435 | }
436 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_arrow_downward_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_arrow_forward_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_arrow_upward_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_call_made_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_call_received_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_baseline_delete_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable-xxhdpi/ic_xxx_arrow_back_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable/ic_baseline_edit_24px.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
24 |
26 |
28 |
30 |
32 |
34 |
36 |
38 |
40 |
42 |
44 |
46 |
48 |
50 |
52 |
54 |
56 |
58 |
60 |
62 |
64 |
66 |
68 |
70 |
72 |
74 |
75 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/layout/activity_ux.xml:
--------------------------------------------------------------------------------
1 |
16 |
21 |
22 |
25 |
26 |
35 |
36 |
44 |
45 |
54 |
55 |
63 |
64 |
73 |
74 |
82 |
83 |
92 |
93 |
101 |
102 |
111 |
112 |
120 |
121 |
129 |
130 |
137 |
138 |
146 |
147 |
152 |
153 |
154 |
155 |
156 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/raw/andy.sfb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/raw/andy.sfb
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/raw/arcticfox_posed.sfb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/lineview_main_app_module/src/main/res/raw/arcticfox_posed.sfb
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #1FF2FF
4 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
17 |
18 | LineView
19 |
20 |
--------------------------------------------------------------------------------
/lineview_main_app_module/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/screenshots/Screenshot_20190513-145400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mickod/LineView/a48a38c1172a89b43fc3be2747d680d5f123003b/screenshots/Screenshot_20190513-145400.png
--------------------------------------------------------------------------------
/screenshots/readme:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':lineview_main_app_module'
2 |
3 | // Uncomment to include the source version of the ux package in your project.
4 | //include ':sceneformux'
5 | //project(':sceneformux').projectDir=new File('../../sceneformux/ux')
6 |
--------------------------------------------------------------------------------