androidでCanvasの上にButtonを置く

多少の罪悪感を感じつつエアコンを使っている。

さて、訳あってandroidCanvasの上にButtonを置かなくてはならなくなったので、少し調べたところ、以下のサイトが見つかった。

Create a Button on a Canvas - Android Beginners

何だか良く分からないが、RelativeLayoutの子としてCanvas(を持ったView)とButtonを定義してやれば、ButtonをCanvas上に好きなように置けるらしい。
ので、早速やってみた。

  • ButtonOnCanvas.java
package jp.headcubicle;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class ButtonOnCanvas extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(listener);
    }
    
    OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(ButtonOnCanvas.this, "Button on Canvas",
                    Toast.LENGTH_SHORT).show();
        }
    };
}


package jp.headcubicle;

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

public class CanvasTest extends View {

    public CanvasTest(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 背景色を設定
        this.setBackgroundColor(Color.WHITE);
        
        // 適当に図形を書く
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawCircle(200, 200, 60, paint);
        paint.setColor(Color.GREEN);
        canvas.drawRect(300, 300, 400, 400, paint);
        paint.setColor(Color.BLUE);
        Path path = new Path();
        path.moveTo(200, 300);
        path.lineTo(150, 400);
        path.lineTo(250, 400);
        canvas.drawPath(path, paint);
    }
}


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <jp.headcubicle.CanvasTest
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    </jp.headcubicle.CanvasTest>
    <Button android:id="@+id/button"
        android:text="@string/button_text"
        android:layout_marginLeft="180px"
        android:layout_marginTop="250px"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</RelativeLayout>


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">ButtonOnCanvas</string>
    <string name="button_text">ButtonOnCanvas</string>
</resources>


  • 実行結果


もっとうまいやり方があるような気もするが、とりあえずこれでいいや。