15

次のようなカスタムビューCircleViewを作成しました。

public class CircleView extends LinearLayout {

    Paint paint1;
    public CircleView(Context context) {
        super(context);
        init();
    }   
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public void init() {
        paint1 = new Paint();
        paint1.setColor(Color.RED); 
    }       
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);         
        canvas.drawCircle(50, 50, 25, paint1);
        this.draw(canvas);  
    }
}

次に、それをアクティビティのレイアウトルートに含めました<RelativeLayout>

  <com.turkidroid.test.CircleView
      android:id="@+id/circle_view"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" 
      android:layout_centerInParent="true"  />  

しかし、何も描かれていません!

  • カスタムビューを正しく実装していますか?
  • それとも、カスタムビューをどのように使用したのですか?

いくつかの情報:

  • CircleViewとMyActivityの両方が同じパッケージに含まれています:com.turkidroid.test
  • onDraw()メソッドでは、それを含めてコメントしてみましsuper.onDraw()た。
  • 私はもっ​​と簡単なアプローチで円を描くことができることを知っていますが、私のCircleViewには円を描く以上のものが含まれています。カスタムビューにする必要があります。
4

2 に答える 2

29

onDrawメソッドが呼び出されることはありません。実際にonDrawが呼び出されるようにするには、カスタムビューのコンストラクターでsetWillNotDraw(false)を呼び出す必要があります。

Android SDKに記載されているように:

このビューがそれ自体で描画を行わない場合は、このフラグを設定して、さらに最適化できるようにします。デフォルトでは、このフラグはViewに設定されていませんが、ViewGroupなどの一部のViewサブクラスに設定できます。通常、onDraw(android.graphics.Canvas)をオーバーライドする場合は、このフラグをクリアする必要があります。

于 2012-09-04T10:41:38.900 に答える
0

this.draw()あなたの方法はどこですか?

これは確実に機能するはずです。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);         
    canvas.drawCircle(50, 50, 25, paint1);
    //this.draw(canvas);  where is this method?
}
于 2012-09-04T11:23:55.200 に答える