Java 使用Canvas和Framelayout android绘制圆
我正在尝试创建一个应用程序,每次单击按钮时都会显示一个圆圈。我的布局看起来很棒,但当我点击按钮(圆圈)在屏幕上显示一个圆圈时,什么也没有发生。我不相信我的画圈课在我的主要活动中被正确调用。下面是我的代码Java 使用Canvas和Framelayout android绘制圆,java,android,xml,canvas,Java,Android,Xml,Canvas,我正在尝试创建一个应用程序,每次单击按钮时都会显示一个圆圈。我的布局看起来很棒,但当我点击按钮(圆圈)在屏幕上显示一个圆圈时,什么也没有发生。我不相信我的画圈课在我的主要活动中被正确调用。下面是我的代码 package com.example.randomcircles; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Canvas; import
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>
好的,下面是我对此所做的一些更改。我不确定你想做什么,但这会让事情变得更容易 首先,将您的类“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将视图添加到框架布局中
<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方法。想象一下在画布上画一张邮票。每次绘制时,都会在上一次绘制顶部指定的位置标记图像
所以
受保护的void onDraw(画布c)
{
super.onDraw(c);
对于(int i=0;i<10;i++)
{
c、 画圈(i*100,75,100,画圈);
}
}
这将在屏幕顶部绘制10个半径为100像素的圆圈。您没有将DrawCircle视图添加到任何框架布局中。您永远不必手动调用draw或onDraw。视图层次结构将为您完成此操作。如何将DrawCircle视图添加到FrameLayout?您可以使用
View\addView()
方法。它会放在左上角。如果你想移动它,你必须使用边距和/或重力。谢谢你的工作。但如果我再次单击圆圈按钮,应用程序将关闭。我希望能够用圆圈填充屏幕。我需要把我的ondraw方法放在一个循环中吗?非常感谢。它就像一个符咒。我正在动态添加。我有一个FrameLayout元素主体。在java文件中动态添加:body.addView(newDrawCircle(this));
protected void onDraw(Canvas c)
{
super.onDraw(c);
for(int i = 0; i < 10; i++)
{
c.drawCircle(i*100, 75, 100, circlePaint);
}
}