2014-10-01 66 views
1

我想創建一個應用程序,每次點擊一個按鈕時都會顯示一個圓圈。我的佈局看起來不錯,但是當我點擊按鈕(圓圈)在屏幕上顯示一個圓時,什麼也沒有發生。我不相信我的繪畫圈課在我的主要活動中被正確調用。以下是我的代碼如下。使用畫布和框架佈局繪製圈子android

package com.example.randomcircles; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 

public class DisplayRandomCircles extends Activity 
{ 
    DrawCircle c; 
    Canvas d; 
    @Override 
public void onCreate(Bundle b) 
{ 
    super.onCreate(b); 
    setContentView(R.layout.activity_display_random_circles); 
    Button btn1 = (Button) findViewById(R.id.btn1); 
    Button btn2 = (Button) findViewById(R.id.btn2); 
    c = new DrawCircle(getApplicationContext()); 
    d = new Canvas(); 
    FrameLayout f1 = (FrameLayout) findViewById(R.id.frame); 

} 
@SuppressLint("WrongCall") 
public void doit(View v) 
{ 
    switch (v.getId()) 
    { 
     case (R.id.btn1): 
      c.onDraw(d); 
      break; 

     case (R.id.btn2): 
      break; 
    } 
} 
} 

這裏是我畫圓類

package com.example.randomcircles; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.View; 

public class DrawCircle extends View 
{ 
public DrawCircle(Context con) 
{ 
    super(con); 
} 
@Override 
protected void onDraw(Canvas c) 
{ 
    super.onDraw(c); 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setAntiAlias(true); 
    p.setStyle(Paint.Style.STROKE); 
    p.setStrokeWidth(100); 
    p.setColor(Color.RED); 
    p.setStyle(Paint.Style.FILL); 
    c.drawCircle(75, 75, 100, p); 
} 
} 

而且我的佈局XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<FrameLayout 
    android:id="@+id/frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight=".75" 
    android:orientation="vertical" > 


</FrameLayout> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight=".25" 
    android:gravity="bottom|center" 
    android:orientation="horizontal" > 

    <Button 
     android:id="@+id/btn1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="start|bottom" 
     android:layout_weight=".50" 
     android:onClick="doit" 
     android:text="@string/Circle" /> 

    <Button 
     android:id="@+id/btn2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight=".50" 
     android:layout_gravity="end|bottom" 
     android:onClick="doit" 
     android:text="@string/Clear" /> 
</LinearLayout> 

</LinearLayout> 
+0

您不會將DrawCircle視圖添加到任何FrameLayouts。你不必手動調用draw或onDraw。 View層次結構將爲你做到這一點。 – DeeV 2014-10-02 00:03:28

+0

如何將DrawCircle視圖添加到FrameLayout? – user3242607 2014-10-02 00:10:15

+0

您使用'View#addView()'方法。它會放在左上角。如果你想移動它,你必須使用邊距和/或重力。 – DeeV 2014-10-02 00:24:14

回答

1

好了,這裏有一些變化我會做這個。我不確定你想要做什麼,但這應該會讓事情變得更容易。

首先,改變你的類「畫圓」是這樣的:

public class DrawCircle extends View 
{ 
    final Paint circlePaint; 

    { 
     circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     circlePaint.setAntiAlias(true); 
     circlePaint.setStyle(Paint.Style.STROKE); 
     circlePaint.setStrokeWidth(100); 
     circlePaint.setColor(Color.RED); 
     circlePaint.setStyle(Paint.Style.FILL); 
    } 

    public DrawCircle(Context con) 
    { 
    super(con); 
    } 

    public DrawCircle(Context con, AttributeSet set) 
    { 
    super(con, set); 
    } 

    public DrawCircle(Context con, AttributeSet set, int style) 
    { 
    super(con, set, style); 
    } 

    @Override 
    protected void onDraw(Canvas c) 
    { 
    super.onDraw(c); 
    c.drawCircle(75, 75, 100, circlePaint); 
    } 
} 

這將允許您重用與每個相同Paint對象繪製因爲onDraw()方法可以被調用上百次,而且也沒有必要爲此減慢你的程序。

其次,添加其他構造函數允許您通過xml將視圖添加到FrameLayouts。

<FrameLayout 
    android:id="@+id/frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.example.randomCircles.DrawCircle 
    android:id="@+id/circleFrame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</FrameLayout> 

接下來,來填補你的屏幕上,你需要循環在你的onDraw方法。考慮將畫布作爲圖章。每次畫畫時,都會將圖像印在您之前繪製頂部指定的位置。

所以

protected void onDraw(Canvas c) 
{ 
    super.onDraw(c); 
    for(int i = 0; i < 10; i++) 
    { 
    c.drawCircle(i*100, 75, 100, circlePaint); 
    } 
} 

這應該吸取半徑100個像素的10圈在你的屏幕的頂部。