マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

タッチイベントを使って遊ぶ

タッチイベントを使って、頑張ればお絵描きもできるプログラムを作ってみた。ただ、ビットマップを用意して、タッチされたところを塗りつぶしてCanvasにビットマップを描画するだけ。Viewを継承したクラスのコンストラクタが呼ばれた段階では、幅や高さがわからないので描画時に1度だけ初期化するようにした。しかし、初期化用のメソッドがありそう、あとで調べてみる。

package draw.picture;

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

public class PictureView extends View{
    private Bitmap bitmap;
    
    public PictureView(Context context){
        super(context);
        bitmap = null;
        
        setBackgroundColor(Color.WHITE);
        setFocusable(true);
    }
    
    public void initBitmap(){        
        bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    }

    @Override
    public void onDraw(Canvas canvas){
        if(bitmap == null){
            initBitmap();
        }
        
        canvas.drawBitmap(bitmap, 0, 0, new Paint());
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event){
        int x = (int)event.getX();
        int y = (int)event.getY();
        drawRect(x, y, 16);
        
        invalidate();
        
        return true;
    }
    
    private void drawRect(int x, int y, int size){
        int half = size / 2;

        x = x < half ? 0 : x - half;
        y = y < half ? 0 : y - half;
        x = x + size > getWidth() ? getWidth() - size : x;
        y = y + size > getHeight() ? getHeight() - size : y;
        
        for(int cy = y; cy < y + size; cy++){
            for(int cx = x; cx < x + size; cx++){
                bitmap.setPixel(cx, cy, 0xFF0000FF);
            }
        }
    }
}