summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-04-25 12:01:55 +0300
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2019-04-25 12:03:03 +0300
commit43864761620cf537d672e09fe4b2572f3a9122c3 (patch)
tree680ff4c0ffdc0133ca84a5b3cda0d6e8549ddc68
parentf5773adcce7f1395fd422f74754ed8d2b1ef90d4 (diff)
downloadqtlocation-mapboxgl-upstream/alexshalamov_wip_animated_icon.tar.gz
WIP: animate symbol layer iconupstream/alexshalamov_wip_animated_icon
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolLayerActivity.java67
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_symbol_layer.xml4
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml1
3 files changed, 71 insertions, 1 deletions
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolLayerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolLayerActivity.java
index 6eed142fc4..ce2230895c 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolLayerActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolLayerActivity.java
@@ -1,7 +1,12 @@
package com.mapbox.mapboxsdk.testapp.activity.style;
+import android.animation.PropertyValuesHolder;
+import android.animation.ValueAnimator;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
import android.graphics.PointF;
import android.os.Bundle;
import android.support.annotation.NonNull;
@@ -9,6 +14,8 @@ import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
+import android.view.animation.AccelerateDecelerateInterpolator;
+
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.mapbox.geojson.Feature;
@@ -108,6 +115,56 @@ public class SymbolLayerActivity extends AppCompatActivity implements MapboxMap.
private MapboxMap mapboxMap;
private MapView mapView;
+ class AnimatedIcon {
+ private Bitmap canvasBitmap;
+ private Bitmap icon;
+ private Canvas canvas;
+ private String iconID;
+ private ValueAnimator animator;
+ private static final String PROPERTY_ROTATE = "rotate";
+ PropertyValuesHolder propertyRotate = PropertyValuesHolder.ofInt(PROPERTY_ROTATE, 0, 360);
+ private int angle;
+ private final Paint paint = new Paint();
+
+ public AnimatedIcon(String iconID_, Bitmap icon_) {
+ iconID = iconID_;
+ icon = icon_;
+ canvasBitmap = Bitmap.createBitmap(icon_.getWidth(), icon_.getHeight(), icon_.getConfig());
+ canvas = new Canvas(canvasBitmap);
+ canvas.drawBitmap(icon,0,0, paint);
+ animator = new ValueAnimator();
+ animator.setValues(propertyRotate);
+ animator.setInterpolator(new AccelerateDecelerateInterpolator());
+ animator.setDuration(3000);
+ animator.addUpdateListener(animation -> {
+ angle = (int) animation.getAnimatedValue(PROPERTY_ROTATE);
+ render();
+ });
+ }
+
+ public Bitmap getCanvasBitmap() {
+ return canvasBitmap;
+ }
+
+ public void animate() {
+ animator.start();
+ }
+
+ public void render() {
+ // TODO: interleave with onDidFinishRenderingFrame callback
+ Matrix matrix = new Matrix();
+ matrix.setRotate (angle, canvasBitmap.getWidth()/2, canvasBitmap.getHeight()/2);
+ canvasBitmap.eraseColor(Color.TRANSPARENT);
+ canvas.drawBitmap(icon, matrix, paint);
+ Style style = mapboxMap.getStyle();
+ if (style != null) {
+ style.addImage(iconID, Objects.requireNonNull(getCanvasBitmap()));
+ }
+ }
+ }
+
+ private AnimatedIcon animatedIcon;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -133,7 +190,8 @@ public class SymbolLayerActivity extends AppCompatActivity implements MapboxMap.
if (style != null) {
Timber.e("Adding image with id: %s", id);
Bitmap androidIcon = BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.ic_android_2));
- style.addImage(id, Objects.requireNonNull(androidIcon));
+ animatedIcon = new AnimatedIcon(id, androidIcon);
+ style.addImage(id, Objects.requireNonNull(animatedIcon.getCanvasBitmap()));
}
});
}
@@ -240,6 +298,10 @@ public class SymbolLayerActivity extends AppCompatActivity implements MapboxMap.
}
}
+ private void animateStyleIcon() {
+ animatedIcon.animate();
+ }
+
private void shuffleMapboxSign() {
if (mapboxSignSymbolLayer != null) {
mapboxSignSymbolLayer.setProperties(
@@ -343,6 +405,9 @@ public class SymbolLayerActivity extends AppCompatActivity implements MapboxMap.
case R.id.action_toggle_text_font:
toggleTextFont();
return true;
+ case R.id.action_animate_style_icon:
+ animateStyleIcon();
+ return true;
default:
return super.onOptionsItemSelected(item);
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_symbol_layer.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_symbol_layer.xml
index 8f396b07b0..17e8dd6f73 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_symbol_layer.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_symbol_layer.xml
@@ -13,4 +13,8 @@
android:id="@+id/action_toggle_text_font"
android:title="@string/toggle_text_font"/>
+ <item
+ android:id="@+id/action_animate_style_icon"
+ android:title="@string/toggle_animate_icon"/>
+
</menu>
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml
index 7513baaa36..169e363433 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/actions.xml
@@ -83,6 +83,7 @@
<string name="toggle_text_size">Toggle text size</string>
<string name="toggle_text_field_contents">Toggle text field contents</string>
<string name="toggle_text_font">Toggle text font</string>
+ <string name="toggle_animate_icon">Animate icon</string>
<string name="zoom_in">Zoom in</string>
<string name="zoom_out">Zoom out</string>
<string name="zoom_by_2">Zoom by 2</string>