我找到了虫子。事实证明,我没有考虑不同图像的不同尺寸,相对于视图本身。
所以,我把代码放在
super
在里面
setImageBitmap
在
getViewTreeObserver().addOnGlobalLayoutListener
并建立了一个新的
DrawingCache
那里:
@Override
public void setImageBitmap(final Bitmap img){
if(!changed)
origImage = img;
changed =true;
super.setImageBitmap(img);
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
buildDrawingCache();
image = getDrawingCache();
selectedFace = null;
faces = detector.detect(new Frame.Builder().setBitmap(image).build());
faceRects.clear();
for (int i = 0; i < faces.size(); i++)
faceRects.add(getFaceRect(i));
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
selectedFace = null;
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
for (int i = 0; i < faceRects.size(); i++)
if (faceRects.get(i).contains((int) event.getX(), (int) event.getY())) {
selectedFace = faces.valueAt(i);
}
invalidate();
}
return true;
}
});
}
});
}