Android Java:如何在ImageView上绘制多个Firebase ML Kit检测点
解决ImageView上绘制多个概率点的问题
看起来你遇到的核心问题是每次调用drawpoint都会重新加载原始图片并创建新的Bitmap,导致之前绘制的点被完全覆盖,而且你在循环里还没有实际使用listpoint里的点,反而硬编码了固定坐标。我来帮你一步步修正:
1. 修复概率点数组遍历的越界问题
你当前的循环逻辑里i = i+1可能会导致数组越界(比如probabilities长度为奇数时),应该改成按步长2遍历:
ArrayList<Point> listpoint = new ArrayList<Point>(); // 按x、y成对遍历,确保不会越界 for (int i = 0; i < probabilities.length - 1; i += 2) { float x = probabilities[i]; float y = probabilities[i+1]; Point p = new Point(x, y); Log.i("Information1 ","valeur 1 "+p.getX()); listpoint.add(p); Log.i("Information2 ","valeur 2 "+p.getX()); }
2. 重构drawpoint逻辑,避免重复创建Bitmap
现在你的drawpoint每次都会重新加载原始图片,这会覆盖之前所有绘制的点。应该先一次性创建可编辑的Bitmap和Canvas,然后把所有点都画在同一个画布上,最后再设置到ImageView:
// 重构后的绘制方法:一次性加载图片,批量绘制所有点 private void drawPoints(ImageView imageView, List<Point> points, int radius) { // 只加载一次原始图片 BitmapFactory.Options myOptions = new BitmapFactory.Options(); myOptions.inDither = true; myOptions.inScaled = false; myOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; myOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.imgg, myOptions); // 创建可编辑的Bitmap Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap); // 设置画笔 Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE); // 遍历所有点,一次性画在画布上 for (Point p : points) { // 这里根据你的需求调整缩放比例,比如乘以100 float x = p.getX() * 100; float y = p.getY() * 100; canvas.drawCircle(x, y, radius, paint); } // 最后把绘制好的Bitmap设置到ImageView imageView.setAdjustViewBounds(true); imageView.setImageBitmap(mutableBitmap); }
3. 修正useInferenceResult里的调用逻辑
现在你可以在useInferenceResult里直接调用新的drawPoints方法,传入你的点列表,而不是循环调用旧的drawpoint:
private void useInferenceResult(float[] probabilities) throws IOException { ArrayList<Point> listpoint = new ArrayList<Point>(); // 修正后的遍历逻辑 for (int i = 0; i < probabilities.length - 1; i += 2) { float x = probabilities[i]; float y = probabilities[i+1]; Point p = new Point(x, y); listpoint.add(p); Log.e("Resultat","point_"+i/2+"("+p.getX()+", "+p.getY()+")"); } // 一次性绘制所有点 ImageView imageView = findViewById(R.id.imageView); drawPoints(imageView, listpoint, 1); }
为什么之前只显示单个点?
- 旧的
drawpoint方法每次都会重新加载原始图片,创建新的Bitmap,所以每次调用都会覆盖之前的绘制结果,最后只保留最后一次画的点。 - 你在循环里还硬编码了两个固定坐标的
drawpoint调用,完全没有使用listpoint里的点,等于白收集了模型输出的概率点。
这样修改后,所有的点都会被画在同一个Bitmap上,最后一次性显示在ImageView里,就能看到多个点了。
内容的提问来源于stack exchange,提问作者abdou_dev
相关产品推荐
相关产品推荐

