具有可点击区域的可缩放 SVG - Android
Zoomable SVG with clickable areas - Android
我正在制作非常简单的应用程序。它需要显示一个包含广义世界地图的 SVG。通过单击城市名称(svg 矩形),我需要显示与该城市相对应的另一个 SVG。此外,所有 SVG 都必须支持缩放和平移。
我设法让 SVG 支持缩放和平移,效果非常好。为此,我使用 svg-android library for rendering SVGs and customized TouchImageView 进行平移、缩放和捕获缩放和触摸事件。但是,似乎不可能在 Android.
中的 SVG 上制作可点击区域
我尝试了蛮力,重新计算我感兴趣的区域在每次用户交互(触摸或缩放)上的位置,并在每次点击 SVG 时检查我的区域(矩形列表)是否包含该点,并且执行相应的操作。
这行不通,因为我无法理解计算 MotionEvent#getX/Y
的规则和类似的方法。也许我可以为固定的 SVG 实现这个,但对于可缩放的,我真的不能。
有什么提示吗?这在 Android 中甚至可能吗?
首先,非常抱歉回答晚了。希望对大家来说还不算太晚:)
我制作了一个 GitHub repo with code sample(不适用于可用的应用程序),所以请使用它! :)
使用存储库的自述文件了解一些详细信息。
核心解决方案:
SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.world_map);
// Get image view (this is our SVG map that is going to be clickable and zoomable):
ImageView touchImageView = (ImageView) view.findViewById(R.id.touchImageView);
// Create drawable (will convert svg to drawable so we can set it to image view as a bitmap):
PictureDrawable image = svg.createPictureDrawable();
Bitmap b = drawableToBitmap(image); // refer to WorldMapFragment for source code of the converting method
touchImageView.setImageBitmap(b);
// Create image with clickable areas from previous image view and set listener to id (listener of type OnClickableAreaClickedListener created in onAttach callback):
ClickableAreasImage clickableAreasImage = new ClickableAreasImage(new PhotoViewAttacher(touchImageView), listener);
// Define your clickable areas
// parameter values (pixels): (x coordinate, y coordinate, width, h eight) and assign an object to it
List<ClickableArea> clickableAreas = new ArrayList<>();
Map<String, FintemCity> cities = svg.getCities();
for (String key : cities.keySet()){
clickableAreas.add(cities.get(key).toClickableArea(getMetrics()));
}
// Set your clickable areas to the image
clickableAreasImage.setClickableAreas(clickableAreas);
感谢投票! :)
我正在制作非常简单的应用程序。它需要显示一个包含广义世界地图的 SVG。通过单击城市名称(svg 矩形),我需要显示与该城市相对应的另一个 SVG。此外,所有 SVG 都必须支持缩放和平移。
我设法让 SVG 支持缩放和平移,效果非常好。为此,我使用 svg-android library for rendering SVGs and customized TouchImageView 进行平移、缩放和捕获缩放和触摸事件。但是,似乎不可能在 Android.
中的 SVG 上制作可点击区域我尝试了蛮力,重新计算我感兴趣的区域在每次用户交互(触摸或缩放)上的位置,并在每次点击 SVG 时检查我的区域(矩形列表)是否包含该点,并且执行相应的操作。
这行不通,因为我无法理解计算 MotionEvent#getX/Y
的规则和类似的方法。也许我可以为固定的 SVG 实现这个,但对于可缩放的,我真的不能。
有什么提示吗?这在 Android 中甚至可能吗?
首先,非常抱歉回答晚了。希望对大家来说还不算太晚:)
我制作了一个 GitHub repo with code sample(不适用于可用的应用程序),所以请使用它! :)
使用存储库的自述文件了解一些详细信息。
核心解决方案:
SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.world_map);
// Get image view (this is our SVG map that is going to be clickable and zoomable):
ImageView touchImageView = (ImageView) view.findViewById(R.id.touchImageView);
// Create drawable (will convert svg to drawable so we can set it to image view as a bitmap):
PictureDrawable image = svg.createPictureDrawable();
Bitmap b = drawableToBitmap(image); // refer to WorldMapFragment for source code of the converting method
touchImageView.setImageBitmap(b);
// Create image with clickable areas from previous image view and set listener to id (listener of type OnClickableAreaClickedListener created in onAttach callback):
ClickableAreasImage clickableAreasImage = new ClickableAreasImage(new PhotoViewAttacher(touchImageView), listener);
// Define your clickable areas
// parameter values (pixels): (x coordinate, y coordinate, width, h eight) and assign an object to it
List<ClickableArea> clickableAreas = new ArrayList<>();
Map<String, FintemCity> cities = svg.getCities();
for (String key : cities.keySet()){
clickableAreas.add(cities.get(key).toClickableArea(getMetrics()));
}
// Set your clickable areas to the image
clickableAreasImage.setClickableAreas(clickableAreas);
感谢投票! :)