5

このトピックについてここでさまざまな質問を読みましたが、それでも答えが見つかりません。なんらかの理由でこの質問を閉じてください。

Circleを拡張する単純なクラスがありますView

このクラスのコードは次のとおりです。

public class ProgressCircle extends View {
    Paint mCirclePaint;
    float extRadius;
    float viewWidth, viewHeight;
    float centerX, centerY;

    public ProgressCircle(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        init();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        float xpad = (float) getPaddingLeft() + getPaddingRight();
        float ypad = (float) getPaddingTop() + getPaddingBottom();
        float ww = (float)w - xpad; float hh = (float)h - ypad;
        extRadius = Math.min(ww, hh) / 2;

        viewWidth = this.getWidth();
        viewHeight = this.getHeight();
        centerX = viewWidth / 2; centerY = viewHeight / 2;

        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(centerX, centerY, extRadius, mCirclePaint);
        canvas.drawText("ciao", 0, 0, mCirclePaint);    
    }

    private void init() {
        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mCirclePaint.setColor(0x666666);
        mCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
    }

このクラスのすべてのメソッドは、メインアクティビティが作成されるときに呼び出されることを確認しました(いくつかLog.d()のを使用して)。<com.mypackage.Circle>メインアクティビティに要素を追加しLinearLayout、その後、サンプルのテストボタンを追加しました。

私が達成したことは、ボタンが表示されてCircleいないときに表示されることですが、それでもボタン(のLinearLayout後にあるCircle)はレイアウトの最初の要素ではありません。これにより、実際に何かが起こっていると思いますが、何も描画されません。

4

3 に答える 3

4

それはただのばかげた問題でした:の色はmCirclePaint.setColor(0x666666)無効なものでした。フォルダmCirclePaint.setColor(Color.RED)で定義されている他の色で動作しました。res

色の値を指定する必要がある場合は、透明度バイトを含める必要があります(そうでない場合は、指定している32ビット整数ではなく24ビットです)。したがって、0x666666は無効ですが、0xff666666は有効な色であり、描画されます。

于 2013-02-24T13:38:45.607 に答える
0

ドキュメントを読んだ後(http://developer.android.com/guide/topics/graphics/2d-graphics.html):

Androidフレームワークは、必要な場合にのみonDraw()を呼び出します。アプリケーションを描画する準備をするたびに、invalidate()を呼び出してビューの無効化を要求する必要があります。これは、ビューを描画することを示しており、AndroidはonDraw()メソッドを呼び出します(ただし、コールバックが瞬時に行われるとは限りません)。

また、チェックする価値のあるもう1つのことは、描画している寸法が、高さ0などのように無効なものがないことを保証することです。

于 2013-02-22T14:11:13.280 に答える
0

View.onMeasure()をオーバーライドしていないことに気付きました。

このメソッドをオーバーライドしていないため、onsizeChanged()サイズ0が渡される可能性があります。これを確認するには、onSizechanged()メソッドにブレークポイントを設定するか、Logcatに出力します。

于 2013-02-22T14:24:18.777 に答える