2012-10-24 8 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)); 
     } 
    } 
} 

と呼ばれることは決してありませんがまあNONE良いと深い​​チュートリアルやほとんどのカスタムレイアウトの権利を行う方法についてのデータのどの部分がほとんど存在し、私はそのを行う方法を見つけ出すことを試み、何私は実装しようとしています画面の中央に緑色の楕円形を塗るレイアウトです、私はこのレイアウトのすべての子を楕円の周りにレイアウトしたい。Androidのカスタムレイアウト - onDraw()

あなたはこの楕円形をポーカーテーブルと考えることができます。これは、このレイアウトの子どもたちがその周りに座ることを望みます。

  1. 理由:...

    3質問現在このコードで何が起こる

    は私がいない楕円形の白いアプリのscrenを得るということですので、私はそれをデバッグし、onDrawが呼び出されることは決してありませんことを見ましたonDrawは呼び出されませんか?

  2. sdkは、onLayoutメソッド内に新しいオブジェクトを割り当てるべきではないことを警告します。したがって、onDrawコールの準備が整うようにRectFをどこで計算する必要がありますか?
  3. super.onDraw()を呼び出すと、すべての子が自分自身にペイントされますか?または明示的にdraw()を呼び出す必要がありますか?

もし私が間違っていたら、あなたは正しい方向に私を導くことができますし、この問題に関する実例やチュートリアルへのリンクもあります。

答えて

119

ViewGroupオブジェクトでは、デフォルトでonDraw()は呼び出されません。代わりに、dispatchDraw()を無効にすることができます。

TableViewコンストラクタでsetWillNotDraw(false)を呼び出して、ViewGroup図面を有効にすることもできます。

参照:Romain Guy's explanation

EDIT:#2の

: - その後、ちょうどあなたのonLayout()方法でrect.set()を呼び出し、コンストラクタでそれを初期化します。

#3: - はい、スーパーコールがそれを処理することがわかっている限り、子供の描画方法をカスタマイズする必要がない限り、それを処理する必要はありません。

+0

働いていた偉大な、感謝!、どのような私の他の質問についてのだろうか? –

+0

@kcoppock
上記のメソッド名は** setWillNotDrawEnabledではなく、単純に 'setWillNotDraw'(' View'クラスのpublicメソッド)です。 – lambruscoAcido

0

キャンバスを再描画呼び出し無効(可能であることをしたい場合)、および方法onDraw()を再実行

関連する問題