diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-04-25 12:01:55 +0300 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-04-25 12:03:03 +0300 |
commit | 43864761620cf537d672e09fe4b2572f3a9122c3 (patch) | |
tree | 680ff4c0ffdc0133ca84a5b3cda0d6e8549ddc68 | |
parent | f5773adcce7f1395fd422f74754ed8d2b1ef90d4 (diff) |
WIP: animate symbol layer iconupstream/alexshalamov_wip_animated_icon
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 6eed142fc..ce2230895 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 8f396b07b..17e8dd6f7 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 7513baaa3..169e36343 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> |