使用 XML 在 android 中绘制自定义形状
Draw a custom shape in android using XML
我正在向 android 地图视图添加自定义标记。这是我为 it.It 使用的图像,随着更多标记的放置,比如大约 100,整个应用程序变慢了。这是我为此使用的图片。
我打算不使用此图像,而是将此图像绘制为 XML 中的形状。怎么做?
我也在关注 this tutorial 以显示自定义标记。这个自定义绘图是否延迟了应用程序?
最好的方法是什么?
最简单的方法是只包含一个小的 png 或 jpg 标记。绘制速度会更快,而且不会占用那么多 space。我不认为你可以在 xml 中得到那个形状——底部的小三角形让它变硬,形状真的很有限。您可以在部分 xml 和部分图像中完成,但是为什么要为 xml?
操心呢?
有可能,但看起来没有意义。因为Google Map只需要位图。所以你需要创建位图并在 canvas.
的帮助下绘制你的形状
marker.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="20dp"
android:height="20dp"
android:top="10dp">
<rotate
android:fromDegrees="45"
android:pivotX="75%"
android:pivotY="40%">
<shape>
<solid android:color="#fe696d" />
</shape>
</rotate>
</item>
<item
android:width="@dimen/marker_width"
android:height="@dimen/marker_height"
android:bottom="8dp">
<shape>
<solid android:color="#4b4b4b" />
<corners
android:topLeftRadius="@dimen/marker_corner_radius"
android:topRightRadius="4dp" />
</shape>
</item>
<item
android:width="32dp"
android:height="26dp"
android:bottom="4dp"
android:top="16dp">
<shape>
<solid android:color="#fe696d" />
<corners
android:bottomLeftRadius="@dimen/marker_corner_radius"
android:bottomRightRadius="@dimen/marker_corner_radius" />
</shape>
</item>
dimen.xml
<resources>
<dimen name="marker_corner_radius">4dp</dimen>
<dimen name="marker_height">40dp</dimen>
<dimen name="marker_width">32dp</dimen>
</resources>
将形状转换为位图的部分代码(来自 fragment/activity with Map)
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.marker, null);
Canvas canvas = new Canvas();
int width = getResources().getDimensionPixelOffset(R.dimen.marker_width);
int height = getResources().getDimensionPixelOffset(R.dimen.marker_height);
drawable.setBounds(0, 0, width, height);
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
drawable.draw(canvas);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(bitmap);
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().icon(bitmapDescriptor).position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
下一个结果
我正在向 android 地图视图添加自定义标记。这是我为 it.It 使用的图像,随着更多标记的放置,比如大约 100,整个应用程序变慢了。这是我为此使用的图片。
我打算不使用此图像,而是将此图像绘制为 XML 中的形状。怎么做?
我也在关注 this tutorial 以显示自定义标记。这个自定义绘图是否延迟了应用程序?
最好的方法是什么?
最简单的方法是只包含一个小的 png 或 jpg 标记。绘制速度会更快,而且不会占用那么多 space。我不认为你可以在 xml 中得到那个形状——底部的小三角形让它变硬,形状真的很有限。您可以在部分 xml 和部分图像中完成,但是为什么要为 xml?
操心呢?有可能,但看起来没有意义。因为Google Map只需要位图。所以你需要创建位图并在 canvas.
的帮助下绘制你的形状marker.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="20dp"
android:height="20dp"
android:top="10dp">
<rotate
android:fromDegrees="45"
android:pivotX="75%"
android:pivotY="40%">
<shape>
<solid android:color="#fe696d" />
</shape>
</rotate>
</item>
<item
android:width="@dimen/marker_width"
android:height="@dimen/marker_height"
android:bottom="8dp">
<shape>
<solid android:color="#4b4b4b" />
<corners
android:topLeftRadius="@dimen/marker_corner_radius"
android:topRightRadius="4dp" />
</shape>
</item>
<item
android:width="32dp"
android:height="26dp"
android:bottom="4dp"
android:top="16dp">
<shape>
<solid android:color="#fe696d" />
<corners
android:bottomLeftRadius="@dimen/marker_corner_radius"
android:bottomRightRadius="@dimen/marker_corner_radius" />
</shape>
</item>
dimen.xml
<resources>
<dimen name="marker_corner_radius">4dp</dimen>
<dimen name="marker_height">40dp</dimen>
<dimen name="marker_width">32dp</dimen>
</resources>
将形状转换为位图的部分代码(来自 fragment/activity with Map)
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.marker, null);
Canvas canvas = new Canvas();
int width = getResources().getDimensionPixelOffset(R.dimen.marker_width);
int height = getResources().getDimensionPixelOffset(R.dimen.marker_height);
drawable.setBounds(0, 0, width, height);
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
drawable.draw(canvas);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(bitmap);
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().icon(bitmapDescriptor).position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
下一个结果