2013-02-22 94 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