2013-02-22 92 views
3

我在这里阅读关于此主题的不同问题,但我仍然无法找到答案。出于任何原因,请随时关闭此问题。自定义视图不能自己绘制

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

我实现的是按钮显示,而我的Circle不大,但仍然按钮(这在LinearLayoutCircle后自带)不是布局的第一个元素:这让我觉得这事其实发生,但没有任何绘制。

+0

尝试删除'super.onDraw(canvas);' – aragaer 2013-02-22 13:50:34

+0

@aragaer没有任何改变。 – whatyouhide 2013-02-22 13:54:23

回答

1

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

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

0

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

Android框架只会调用的onDraw()是必要的。每次您准备绘制您的应用程序 时,您必须通过调用invalidate()来请求您的 视图失效。这表示你会像你的View一样被绘制为 ,然后Android会调用你的onDraw() 方法(尽管不保证瞬时回调将为 )。

另外值得一检查另一件事是你画丑陋的事情是一样的0等的高度无效..

+0

增加了'invalidate()'的各种组合,没有任何改变。 – whatyouhide 2013-02-24 00:08:37

+0

那么唯一的解释是你正在绘制的参数是无效的 – JoxTraex 2013-02-24 05:08:08

0

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

因为您不重写此方法onsizeChanged()可能会传递大小0.您可以通过在onSizechanged()方法中放置断点或打印到Logcat来检查此问题。

+0

它用非零参数调用'onSizeChanged()'。 – whatyouhide 2013-02-23 23:34:59

+0

如果您获得了首先通过的正的非零大小,我认为它会给出可以看到的大小,即不是1像素乘1像素。你总是可以通过调用getLeft()和getTop()来检查视图将在sceen上绘制的位置,并查看返回值是否如预期的那样。 – Kerry 2013-02-24 08:29:39