使用Canvas和Framelayout android绘制圆圈

时间:2014-10-01 23:57:58

标签: java android xml canvas

我正在尝试创建一个应用,每次单击按钮时都会显示一个圆圈。我的布局看起来很棒但是当我点击按钮(圆圈)在屏幕上显示一个圆圈时没有任何反应。我对自己的主要活动中正确调用绘制圆圈类没有信心。以下是我的代码。

 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;
    }
}
}

这是我的DrawCircle类

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>

1 个答案:

答案 0 :(得分:1)

好的,这是我为此做的一些改变。我不确定你要做什么,但这应该会让事情变得更容易。

首先,改变你的类“DrawCircle”,如下所示:

 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将View添加到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);
  }
} 

这应该在屏幕顶部绘制10个半径为100像素的圆圈。