Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 奇怪的画布/位图问题_Android_Bitmap_Android Canvas - Fatal编程技术网

Android 奇怪的画布/位图问题

Android 奇怪的画布/位图问题,android,bitmap,android-canvas,Android,Bitmap,Android Canvas,我有一个活动,用户在图片上触摸眼睛的位置,这应该在每个位置上画一个白色的小圆圈。我有一段代码,使用Android FaceDetector工具,找到眼睛位置和面部中点,并绘制一个矩形。作为参考,该规范的图纸部分如下: private void drawRectangles(){ Canvas canvas = new Canvas(mBitmap); Paint paint = new Paint(); paint.setStrokeWidth(2); paint

我有一个活动,用户在图片上触摸眼睛的位置,这应该在每个位置上画一个白色的小圆圈。我有一段代码,使用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);    
}
下面是显示每个代码片段结果的屏幕截图。第一张图片是画在脸上的矩形。第二张图片显示了当我尝试使用第二个代码片段绘制时得到的非常奇怪的结果。但是,请注意,在绘制第二个输出时,我将x和y指定为10,10表示圆的位置。当我给它传递的眼睛位置坐标时也是一样的,只是像素化的圆来自眼睛所在的任何地方

有人知道这种行为到底是怎么回事吗

非常感谢


所以我发现,在需要创建一个扩展View的类来开始从中调用方法之前,您基本上只能在画布上绘制一次。我最终需要做的是:customView.prepareCircle()、customView.invalidate(),然后是parentView.addView(customView)。实际上,在必须从UI线程上的Runnable进行任何后续调用之前,我只能准备、使修改后的自定义视图无效并将其重新添加到画布一次。我不认为这是一种理想的方法(当然感觉不优雅),但它给了我想要的结果:


为什么要调用mImageView.draw(c1)?这将把ImageView绘制到位图。@alanv--我之所以将ImageView绘制到位图,是因为我使用了矩形绘制方法。如果我删除那行代码,什么也不会发生。
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);
        
     }
}