[英]Strange canvas/bitmap issue
我有一个“活动”,用户可以在该活动上触摸图片上的眼睛位置,并且应该在每个图片上画一个小白圈。 我有一段工作代码,可使用Android FaceDetector工具查找眼睛位置和面部中点并绘制一个矩形。 该代码的图形部分可供参考:
private void drawRectangles(){
Canvas canvas = new Canvas(mBitmap);
Paint paint = new Paint();
paint.setStrokeWidth(2);
paint.setColor(Color.BLUE);
paint.setStyle(Style.STROKE);
for (int i=0; i < faceFrames.length; i++) {
RectF r = faceFrames[i];
if (r != null){
canvas.drawRect(r, paint);
Log.d(TAG, "Drew rectangle");
}
}
mImageView.setImageResource(0);
mImageView.setImageBitmap(mBitmap);
mImageView.draw(canvas);
}
那部分很好。 我认为,作为从onTouchEvent调用的方法,我可以使用以下内容绘制一个圆:
private void makeDrawableLayer(int x, int y, int touchCount){
if (touchCount == 1){
Bitmap eyeOneBmp = Bitmap.createBitmap(mBitmap);
Canvas c1 = new Canvas(eyeOneBmp);
c1.drawCircle(x, y, 5, eyePaint);
mImageView.setImageResource(0);
mImageView.setImageBitmap(eyeOneBmp);
mImageView.draw(c1);
}
}
这是显示每个代码段结果的屏幕截图。 第一张图片是在脸上绘制的矩形。 第二张图片显示了我尝试使用第二个代码段绘制时得到的非常奇怪的结果。 但是请注意,在绘制第二个输出时,我已将x和y指定为圆的位置的10和10。 当我给它传入的眼睛位置坐标是一样的,只是像素化的圆圈来自眼睛的任何地方。
有谁知道这种行为到底是怎么回事?
非常感谢。
因此,我发现您基本上只能在画布上绘制一次,然后才需要创建一个扩展View的类以开始从中调用方法。 我最终需要做的是:customView.prepareCircle(),customView.invalidate(),然后是parentView.addView(customView)。 实际上,在必须从UI线程上的Runnable进行任何后续调用之前,我只能准备一次,使修改后的自定义视图无效并使它重新添加到画布上。 我不觉得这是一种理想的方法(当然感觉并不优雅),但是它给了我想要的结果:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.