2012-10-24 39 views
35
public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TableView tv = new TableView(this); 
     tv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 
     setContentView(tv);  
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

public class TableView extends ViewGroup { 
    private Paint oval; 
    private RectF rect; 

    public TableView(Context context) { 
     super(context); 
     oval= new Paint(Paint.ANTI_ALIAS_FLAG); 
     oval.setColor(Color.GREEN); 
    } 


    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawOval(rect , oval); 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int wspec = MeasureSpec.makeMeasureSpec(
       getMeasuredWidth(), MeasureSpec.EXACTLY); 
     int hspec = MeasureSpec.makeMeasureSpec(
       getMeasuredHeight(), MeasureSpec.EXACTLY); 
     for(int i=0; i<getChildCount(); i++){ 
      View v = getChildAt(i); 
      v.measure(wspec, hspec); 
     } 
    } 


    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     float w=r-l; 
     float h=b-t; 
     rect=new RectF(w/8,h/8,7*w/8,7*h/8); 
     float theta = (float) (2 * Math.PI/getChildCount()); 
     for(int i=0; i< getChildCount(); i++) { 
      View v = getChildAt(i); 
      w = (rect.right-rect.left)/2; 
      h = (rect.bottom-rect.top)/2; 
      float half = Math.max(w, h)/2; 
      float centerX = rect.centerX()+w*FloatMath.cos(theta); 
      float centerY = rect.centerY()+h*FloatMath.sin(theta); 
      v.layout((int)(centerX-half),(int)(centerY-half),(int)(centerX+half),(int)(centerY+half)); 
     } 
    } 
} 

那麼有幾乎沒有良好而深刻的教程,幾乎任何一塊如何做自定義佈局正確的數據,所以我試圖找出它怎麼做,有什麼我試圖實現的是在屏幕中心繪製綠色橢圓形的佈局,並且我希望此佈局的每個孩子都圍繞橢圓形展開。Android的自定義佈局 - 的onDraw()不會被調用

您可以將橢圓形視爲一張撲克桌,我希望此佈局的孩子可以圍坐在桌子上。

目前該代碼會發生什麼事是,我得到沒有的橢圓形白色應用scren,所以我調試它,看到的onDraw不會被調用......

3個問題:

  1. 爲什麼onDraw沒有被調用?
  2. sdk警告我,我不應該在onLayout方法中分配新的對象,所以我應該在哪裏計算RectF,以便它可以用於onDraw調用?
  3. 調用super.onDraw()會讓所有的孩子自己畫嗎?或者我應該明確地調用他們的draw()?

如果我把它弄錯了,你們可以引導我朝着正確的方向發展,或者有任何與這個主題相關的例子或教程的鏈接,這也會有所幫助!

回答

119

默認情況下,onDraw()不針對ViewGroup對象調用。相反,您可以覆蓋dispatchDraw()

或者,您可以在TableView的構造函數中調用setWillNotDraw(false)來啓用ViewGroup圖形。

參見:Romain Guy's explanation

編輯:

#2: - 在構造函數初始化它,然後只需撥打rect.set()onLayout()方法。

對於#3: - 是的,據我所知,超級電話會處理它,你不應該處理,除非你需要自定義孩子的繪製方式。

+0

大,工作,謝謝!什麼關於我的其他問題? –

+0

@kcoppock
提到的方法名稱是** not **'setWillNotDrawEnabled',但只是'setWillNotDraw'(View類的公共方法)。 – lambruscoAcido

0

如果希望畫布是要重新繪製調用無效(),該方法的onDraw()將被重新執行