自定义视图不绘制自身

时间:2013-02-22 13:45:29

标签: android android-layout android-custom-view

我在这里读到了关于这个主题的不同问题,但我仍然找不到答案。随时以任何理由关闭此问题。

我有一个简单的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() s)调用此类中的每个方法。我在主要活动的<com.mypackage.Circle>中添加了LinearLayout元素,之后我添加了一个示例测试按钮。

我所取得的成就是我的Circle没有显示按钮,但按钮(LinearLayout之后的Circle)不是第一个元素布局:这让我觉得实际发生了一些事情,但没有得到任何东西。

3 个答案:

答案 0 :(得分:3)

这只是一个愚蠢的问题:mCirclePaint.setColor(0x666666)中的颜色是无效的。它适用于mCirclePaint.setColor(Color.RED)res文件夹中定义的任何其他颜色。

如果需要指定颜色值,则必须包含透明度字节(否则它不是您指定的32位整数,而是24位)。因此0x666666无效,但0xff666666是有效颜色并将绘制。

答案 1 :(得分:0)

阅读文档(http://developer.android.com/guide/topics/graphics/2d-graphics.html)后:

  

Android框架只会在必要时调用onDraw()。每一次   您的申请准备被提取,您必须要求您的申请   通过调用invalidate()使视图无效。这表明你已经   就像你要绘制的视图一样,Android会调用你的onDraw()   方法(虽然不能保证回调将是   瞬时)。

另外值得检查的是你正在绘制的尺寸,确保没有任何东西像0等高度一样无效。

答案 2 :(得分:0)

我注意到你没有覆盖View.onMeasure()

因为您没有覆盖此方法,onsizeChanged()可能会传递大小0.您可以通过在onSizechanged()方法中放置断点或打印到Logcat来检查这一点。