我扩展了一个ImageView,并在Thread内部从外部类调用ImageView方法。在方法内部,我尝试使用invalidate postValidate,但它从未调用过onDraw方法,它是否与调用方法有关 -
public class TestImageView extends ImageView {
public FacePreviewImageView(Context context) {
super(context);
}
public void process(String strImageFilePath) {
//doing some operation
invalidate();
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
Log.i("CAME INSIDE ", ""+faces.total());
if(faces.total()>0){
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(20);
String s = "Processed Face";
float textWidth = paint.measureText(s);
canvas.drawText(s, (getWidth() - textWidth) / 2, 20, paint);
CvRect r = new CvRect(cvGetSeqElem(faces, 0));
int x = r.x(), y = r.y(), w = r.width(), h = r.height();
canvas.drawRect(new Rect(x, y, x+w, y+h), paint);
}
super.onDraw(canvas);
}
}
我的调用方法看起来像 -
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
((TestImageView )imageView).process(pictureFile.getAbsolutePath());
}
});
还有一点需要补充 -
我尝试在布局文件中直接添加此视图 -
<FrameLayout
android:id="@+id/ll2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:orientation="horizontal" >
<com.example.defaultfacetracker.TestImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</FrameLayout>
但它在启动时抛出异常。所以我最终将代码更改为 -
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@android:drawable/toast_frame" />
在一个类中,我只是创建一个新的TestImageView实例。 如果这是在这里做某事的原因。
答案 0 :(得分:4)
您是否尝试过设置:
setWillNotDraw(false);
在你的构造函数中?
@Override
public FacePreviewImageView(Context context) {
this(context, null, 0);
}
@Override
public FacePreviewImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@Override
public FacePreviewImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setWillNotDraw(false);
}
答案 1 :(得分:0)
setWillNotDraw(false);
对我不起作用。
我在这里遇到了同样的问题,并且我发现检查我的ImageView
儿童班有可见性 VISIBILE
而不是GONE
。
如果可见度值为GONE
,则不会调用onDraw
。