How to draw canvas by coordinate and let them scale with picture together? 1. In image side the colored polygon should scale with background image, but it is not. (It shows on the correct position) 2. polygonList contain coordinate, should change value when scale, so onSigleTabEvent can found if the click position is in the pologon. But now, it is not working because the coordinate always become infinity. (Solved!)
PS: the TouchImageView is embed in the XML file. The onDraw method in the TouchImageView .java
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
if (polygonList != null) { for (Polygon polygon : polygonList) { canvas.drawPath(polygon.path, polygon.paint); } } onDrawReady = true; imageRenderedAtLeastOnce = true; if (delayedZoomVariables != null) { setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX, delayedZoomVariables.focusY, delayedZoomVariables.scaleType); delayedZoomVariables = null; } } private void fixTrans() { matrix.getValues(m); // update all polygon coordinate for (Polygon polygon : polygonList) { for (Coordinate coordinate : polygon.coordinates) { coordinate.x = coordinate.x * m[0] + m[2]; coordinate.y = coordinate.y * m[4] + m[5]; } } float transX = m[Matrix.MTRANS_X]; float transY = m[Matrix.MTRANS_Y]; float fixTransX = getFixTrans(transX, viewWidth, getImageWidth()); float fixTransY = getFixTrans(transY, viewHeight, getImageHeight()); if (fixTransX != 0 || fixTransY != 0) { matrix.postTranslate(fixTransX, fixTransY); } }
MainActivity.java
List locations = floorPlan.getLocation(); Log.i("FloorPlanAct", "SetupClickArea(), Location.count():" + locations.size()); List polygonList = new ArrayList<>();
for (Location location : locations) { List<Coordinate> coordinateList = location.getCoordinate(); // Test data, has location, but no coordinate // Paint as a pen Paint paint = new Paint(); paint.setARGB(location.areaColorA, location.areaColorR, location.areaColorG, location.areaColorB); paint.setAlpha(128); paint.setStyle(Paint.Style.FILL); // Group pen and path as a Polygon~ Polygon polygon = new Polygon(coordinateList, paint, location); polygonList.add(polygon); } // 1. Prepare originalImagePosition preparePolygon(polygonList, obj.orignalMatrix); // Create a click area TouchImageView imgClickArea = holder.imgClickArea; imgClickArea.init(act, polygonList, obj.scaledBitmap, obj.orignalMatrix); public void preparePolygon(List<Polygon> polygonList, Matrix orignalMatrix){ float[] m = new float[9]; orignalMatrix.getValues(m); for (Polygon polygon : polygonList) { List<Coordinate> coordinates = polygon.coordinates; // Path walk follow the coordinate Path path = new Path(); path.reset(); // only needed when reusing this path for a new build int coordinateCount = coordinates.size(); Log.i("TouchImageView", "***** initPolygon(), Polygon ******"); for (int i = 0; i < coordinateCount; i++) { // Calculate the point of screen Coordinate coordinate = coordinates.get(i); Log.i("TouchImageView", "**** Coordinate ****"); Log.i("TouchImageView", "Original :" + coordinate.x + "," + coordinate.y); coordinate.x = coordinate.x * m[0] + m[2]; coordinate.y = coordinate.y * m[4] + m[5]; Log.i("TouchImageView", "On the screen:" + coordinate.x + "," + coordinate.y); if (i == 0) { path.moveTo(coordinate.x, coordinate.y); } else { path.lineTo(coordinate.x, coordinate.y); } } path.close(); polygon.path = path; } }