Androidで透明ウィンドウ

kazhik.techさんのところで、

getWindow().setFormat(PixelFormat.TRANSLUCENT);

とすればウィンドウが半透明になるということを見た。


半透明な上に画像が表示できたら楽しいよね、
と思って試してみたらうまくいかない。
この設定を有効にするにはSurfaceViewを使わなくちゃいけないらしい。


そこでいろいろいじってたらやっと透明にできた。
これがSurfaceViewの正しい使い方かどうかはわからない(多分違う)けど、
なかなか面白いので良いです。


これで透明な部分はメイン画面を操作できたりしたら面白いんだけどな。
なんか出来る気がする。やりかたは見当つかないけども。


以下動作画面とソース。

ソース

package net.swelt.android.surfaceviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.Window;
import android.widget.AbsoluteLayout;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;

public class SurfaceViewTest extends Activity {
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);        
        getWindow().setFormat(PixelFormat.TRANSPARENT);
        
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(new MySurfaceView(this));
        addContentView(new SampleView(this), new ViewGroup.LayoutParams(-1, -1));
    }
    
    public class SampleView extends AbsoluteLayout {
    	private DisplayObject mKirby;
    	
    	public SampleView(Context context) {
    		super(context);
    		
    		mKirby = new DisplayObject(context);
    		this.addView(mKirby);
    		
    		Bitmap bmp = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.kirby_t);
    		mKirby.setBitmap(bmp);
    		mKirby.move((320 - mKirby.getImageWidth())/2, (240 - mKirby.getImageHeight())/2);
    	}
    	    	
    	@Override
    	public void onDraw(Canvas canvas) {
    		mKirby.draw(canvas);
    	}
    	
    	@Override
    	public boolean onMotionEvent(MotionEvent event) {    		
    		switch( event.getAction() ) {
    		case MotionEvent.ACTION_DOWN:
    		case MotionEvent.ACTION_MOVE:
    			int x = (int)(event.getX() - mKirby.getImageWidth()/2);
    			int y = (int)(event.getY() - mKirby.getImageHeight()/2);
    			mKirby.move(x, y);    			
    			return true;
    		}
    		return true;
    	}
    }
    
    public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    	private SurfaceHolder mHolder;
    	
    	public MySurfaceView(Context context) {
    		super(context);
    		
    		mHolder = getHolder();
    		mHolder.setCallback(this);
    	}
    	
    	public boolean surfaceCreated(SurfaceHolder holder) {
    		return true;
    	}
    	
    	public void surfaceDestroyed(SurfaceHolder holder) {
    	}
    	
    	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    	}
    }
}