2

私は ImageView を拡張し、スレッド内の外部クラスから 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());
                }
            });

追加するもう1つのポイント-

このビューをレイアウトファイル内に直接追加しようとしました-

<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 の新しいインスタンスを作成して作業しています。それがここで何かをする理由である場合。

4

2 に答える 2

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);
}
于 2013-10-17T16:20:15.223 に答える
0

setWillNotDraw(false);私にはうまくいきません。

私はここで同じ問題を抱えてImageViewまし VISIBILEGONE.

GONE可視性の値がある場合、onDraw呼び出されません。

于 2017-06-01T08:08:44.230 に答える