2014-05-18 238 views
2

我正在做一个简单的鼓组应用程序,用户可以点击按钮制作相应的声音,并在画布上随机绘制一个圆圈。对于画布,我创建了一个名为CanvasView的自定义视图,然后将该CanvasView实现到MainActivity中,这样每次使用MainActivity中的OnClickListener单击按钮时,都可以控制该视图。
但是,我不知道如何使用OnClickListener实际控制(画一个圆圈)CanvasView。我需要这部分
帮助这是我在MainActivity类代码:
Android:在自定义画布上绘制圆形按钮,点击

public class MainActivity extends Activity { 
//setup variables for soundpool 
. 
. 
. 
//implements CanvasView 

CanvasView mCanvasView; 

//set up soundID for each sound 
. 
. 
. 
//setup buttons 
Button mKick; 
. 
. 
. 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
//set up soundpools 
. 
. 
. 

//example, the kick drum button 
//kick drum 
    mKick = (Button) findViewById(R.id.kick); 
    mKick.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     soundPool.play(kick, leftVolume, rightVolume, priority, no_loop, normal_playback_rate); 

//   mCanvasView.draw(CanvasView.mCanvas); 

    } 
}); 

这是我的代码CanvasView

public class CanvasView extends View { 
public Paint mPaint; 
public static Canvas mCanvas; 
//constructor 
public CanvasView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mPaint = new Paint(); 
} 
//what I want to draw is here 
protected void onDraw(Canvas canvas) { 
    mCanvas = canvas; 
    super.onDraw(mCanvas); 
    canvas.drawColor(Color.GRAY); 
    mPaint.setColor(Color.BLUE); 
    mPaint.setStyle(Style.STROKE); 
    mPaint.setAntiAlias(true); 
    canvas.drawCircle(30, 30, radius, mPaint); 

这是我在MainActivity布局XML

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/GridLayout1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="center" 
android:columnCount="3" 
android:orientation="horizontal" 
android:rowCount="5" 
tools:context=".GridXMLActivity" > 

<Button 
    android:id="@+id/kick" 
    android:layout_width="78dp" 
    android:layout_height="wrap_content" 
    android:layout_column="1" 
    android:layout_gravity="center_horizontal|fill_vertical" 
    android:layout_row="3" 
    android:text="Kick" /> 

<com.example.virtualdrumset.CanvasView 
    android:id="@+id/canvasView1" 
    android:layout_width="143dp" 
    android:layout_height="169dp" 
    android:layout_column="1" 
    android:layout_gravity="left|top" 
    android:layout_row="0" /> 

对于任何不便或错误,我深表歉意。这是我第一次提问。

+0

我没有正确理解你的问题。 “我不知道如何使用OnClickListener控制CanvasView(在一个圆上画),你是什么意思。每次点击按钮时你想绘制一个圆圈?像第二次点击按钮时画第二个圆圈,点击按钮时第三次画圆圈第三次? –

+0

是的,我想要的是每次单击按钮时绘制一个圆形,但每次都会刷新一次。 – user3648721

+0

查看我的回答 –

回答

2

您不应该直接从该活动调用onDraw函数canvas。相反,在画布视图中创建一个公共方法,并在那里编写逻辑,最后请拨invalidate。这要求onDraw方法和内容根据您的新逻辑再次在屏幕上绘制。

如果你想在每一次点击按钮,你可以做这样的事情

public class CanvasView extends View { 
    public Paint mPaint; 
    public static Canvas mCanvas; 
    private int mPivotX = 0; 
    private int mPivotY = 0; 
    private int radius = 60; 

    //constructor 
    public CanvasView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mPaint = new Paint(); 
    } 

    public void drawCircle() { 

     int minX = radius * 2; 
     int maxX = getWidth() - (radius *2); 

     int minY = radius * 2; 
     int maxY = getHeight() - (radius *2); 

     //Generate random numbers for x and y locations of the circle on screen 
     Random random = new Random(); 
     mPivotX = random.nextInt(maxX - minX + 1) + minX; 
     mPivotY = random.nextInt(maxY - minY + 1) + minY; 

     //important. Refreshes the view by calling onDraw function 
     invalidate(); 

    } 

    //what I want to draw is here 
    protected void onDraw(Canvas canvas) { 
     mCanvas = canvas; 
     super.onDraw(mCanvas); 
     canvas.drawColor(Color.GRAY); 
     mPaint.setColor(Color.BLUE); 
     mPaint.setStyle(Style.STROKE); 
     mPaint.setAntiAlias(true); 
     canvas.drawCircle(mPivotX, mPivotY, radius, mPaint); 
    } 
} 

然后onButtonClick

mKick.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     soundPool.play(kick, leftVolume, rightVolume, priority, no_loop, normal_playback_rate); 

      mCanvasView.drawCircle() 

    } 

希望它可以帮助在屏幕上任意位置要绘制一个圆!

+0

谢谢,但是当我点击时,应用程序崩溃了,错误日志是指按钮 – user3648721

+0

的onclicklistener什么是异常?你能发布例外的完整LogTrace吗? –

+0

你在onCreate中初始化了'mCanvasView'吗? 'mCanvasView =(CanvasView)findViewById(R.id.canvasView1);' –