[android] Add ImageSource bindings

This commit is contained in:
Asheem Mamoowala
2017-05-25 14:36:05 -07:00
parent ab5b310a9e
commit b7c7d3fdab
18 changed files with 528 additions and 29 deletions

View File

@@ -0,0 +1,87 @@
package com.mapbox.mapboxsdk.geometry;
import android.os.Parcel;
import android.os.Parcelable;
/**
* A geographical area representing a non-aligned quadrilateral
* <p>
* This class does not wrap values to the world bounds
* </p>
*/
public class LatLngQuad implements Parcelable {
private final LatLng topLeft;
private final LatLng topRight;
private final LatLng bottomRight;
private final LatLng bottomLeft;
/**
* Construct a new LatLngQuad based on its corners,
* in order top left, top right, bottom left, bottom right
*/
public LatLngQuad(final LatLng topLeft, final LatLng topRight, final LatLng bottomRight, final LatLng bottomLeft) {
this.topLeft = topLeft;
this.topRight = topRight;
this.bottomRight = bottomRight;
this.bottomLeft = bottomLeft;
}
public LatLng getTopLeft() {
return this.topLeft;
}
public LatLng getTopRight() {
return this.topRight;
}
public LatLng getBottomRight() {
return this.bottomRight;
}
public LatLng getBottomLeft() {
return this.bottomLeft;
}
public static final Parcelable.Creator<LatLngQuad> CREATOR = new Parcelable.Creator<LatLngQuad>() {
@Override
public LatLngQuad createFromParcel(final Parcel in) {
return readFromParcel(in);
}
@Override
public LatLngQuad[] newArray(final int size) {
return new LatLngQuad[size];
}
};
@Override
public int hashCode() {
int code = topLeft.hashCode();
code = (code ^ code >>> 31) + topRight.hashCode();
code = (code ^ code >>> 31) + bottomRight.hashCode();
code = (code ^ code >>> 31) + bottomLeft.hashCode();
return code;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel out, final int arg1) {
topLeft.writeToParcel(out, arg1);
topRight.writeToParcel(out, arg1);
bottomRight.writeToParcel(out, arg1);
bottomLeft.writeToParcel(out, arg1);
}
private static LatLngQuad readFromParcel(final Parcel in) {
final LatLng topLeft = new LatLng(in);
final LatLng topRight = new LatLng(in);
final LatLng bottomRight = new LatLng(in);
final LatLng bottomLeft = new LatLng(in);
return new LatLngQuad(topLeft, topRight, bottomRight, bottomLeft);
}
}

View File

@@ -0,0 +1,137 @@
package com.mapbox.mapboxsdk.style.sources;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.v4.content.ContextCompat;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.geometry.LatLngQuad;
import java.net.URL;
/**
* Image source, allows a georeferenced raster image to be shown on the map.
* <p>
* The georeferenced image scales and rotates as the user zooms and rotates the map.
* The geographic location of the raster image content, supplied with `LatLngQuad`,
* can be non-axis aligned.
* </p>
* * @see <a href="https://www.mapbox.com/mapbox-gl-style-spec/#sources-image">the style specification</a>
*/
@UiThread
public class ImageSource extends Source {
/**
* Internal use
*
* @param nativePtr - pointer to native peer
*/
public ImageSource(long nativePtr) {
super(nativePtr);
}
/**
* Create an ImageSource from coordinates and an image URL
*
* @param id The source id
* @param coordinates The Latitude and Longitude of the four corners of the image
* @param url remote json file
*/
public ImageSource(String id, LatLngQuad coordinates, URL url) {
initialize(id, coordinates);
setUrl(url);
}
/**
* Create an ImageSource from coordinates and a bitmap image
*
* @param id The source id
* @param coordinates The Latitude and Longitude of the four corners of the image
* @param bitmap A Bitmap image
*/
public ImageSource(String id, LatLngQuad coordinates, @NonNull android.graphics.Bitmap bitmap) {
initialize(id, coordinates);
setImage(bitmap);
}
/**
* Create an ImageSource from coordinates and a bitmap image resource
*
* @param id The source id
* @param coordinates The Latitude and Longitude of the four corners of the image
* @param resourceId The resource ID of a Bitmap image
*/
public ImageSource(String id, LatLngQuad coordinates, @DrawableRes int resourceId) {
initialize(id, coordinates);
setImage(resourceId);
}
/**
* Updates the source image url
*
* @param url An Image url
*/
public void setUrl(URL url) {
setUrl(url.toExternalForm());
}
/**
* Updates the source image url
*
* @param url An image url
*/
public void setUrl(String url) {
nativeSetUrl(url);
}
/**
* Updates the source image to a bitmap
*
* @param bitmap A Bitmap image
*/
public void setImage(@NonNull android.graphics.Bitmap bitmap) {
nativeSetImage(bitmap);
}
/**
* Updates the source image to a bitmap image resource
*
* @param resourceId The resource ID of a Bitmap image
*/
public void setImage(@DrawableRes int resourceId) throws IllegalArgumentException {
Context context = Mapbox.getApplicationContext();
Drawable drawable = ContextCompat.getDrawable(context, resourceId);
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
nativeSetImage(bitmapDrawable.getBitmap());
} else {
throw new IllegalArgumentException("Failed to decode image. The resource provided must be a Bitmap.");
}
}
/**
* @return The url or null
*/
@Nullable
public String getUrl() {
return nativeGetUrl();
}
protected native void initialize(String layerId, LatLngQuad payload);
protected native void nativeSetUrl(String url);
protected native String nativeGetUrl();
protected native void nativeSetImage(Bitmap bitmap);
@Override
protected native void finalize() throws Throwable;
}