我有一个活动,其中用户触摸图片上的眼睛位置,这应该在每个上画一个小白圈。我有一些代码,使用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。当我给它传入的眼睛位置坐标时,它就是同样的东西,就像眼睛所在的像素化圆圈一样。
有没有人知道这种行为究竟发生了什么?
非常感谢。
答案 0 :(得分:0)
所以我发现你基本上只需要画一次画布,然后才需要创建一个扩展View的类来开始调用方法。我最终需要做的是:customView.prepareCircle(),customView.invalidate(),然后是parentView.addView(customView)。实际上,我只能在UI线程上从Runnable进行任何后续调用之前,先将修改后的自定义视图准备,无效并重新添加到画布中。我并不认为这是一种理想的做法(当然不会感觉优雅),但它给了我想要的结果: