2013年2月4日月曜日

SurfaceViewを重ねる


背景のSurfaceViewを赤く塗りつぶして、
前面(オーバーレイ)のSurfaceViewで画像を表示している。

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
  Context mContext = getApplicationContext();

  // 背景になるSurfaceView
  SurfaceView bkSurfaceview = (SurfaceView) findViewById(R.id.BackSurfaceView);
  SurfaceHolder holder = bkSurfaceview.getHolder();

  MySurfaceViewCallback BkSurfaceViewCallback = new MySurfaceViewCallback(mContext);
  holder.addCallback(BkSurfaceViewCallback);

  // オーバーレイするSurfaceView
  SurfaceView OverLaySurfaceView = (SurfaceView) findViewById(R.id.OverLaySurfaceView);

  OverLaySurfaceViewCallback OverLaySurfaceViewCallback = new OverLaySurfaceViewCallback(mContext);

  SurfaceHolder overLayHolder = OverLaySurfaceView.getHolder();
  // ここで半透明にする
  overLayHolder.setFormat(PixelFormat.TRANSLUCENT);
  overLayHolder.addCallback(OverLaySurfaceViewCallback);
        
    }

 /*
  * 背景のMySurfaceViewCallback
  */
 public class MySurfaceViewCallback implements SurfaceHolder.Callback {

  public MySurfaceViewCallback(Context mContext) {
   // TODO 自動生成されたコンストラクター・スタブ
   Log.d("タグ", "MySurfaceViewCallback");
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO 自動生成されたメソッド・スタブ
   Log.d("タグ", "surfaceChanged");
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO 自動生成されたメソッド・スタブ
   Log.d("タグ", "surfaceCreated");
   // SurfaceViewが作成された時の処理(初期画面の描画等)を記述
   Canvas canvas = holder.lockCanvas();

   // この間にグラフィック描画のコードを記述する。
   // Canvasより取得した領域
   int canvasWidth = canvas.getWidth(); //480
   int canvasHeight = canvas.getHeight();

   Log.d("タグ", String.valueOf(canvasWidth) + "::" +String.valueOf(canvasHeight));

   Paint paint = new Paint();
   paint.setColor(Color.RED);
   canvas.drawRect(0, 0, 480, 724, paint);

   // この間にグラフィック描画のコードを記述する。

   holder.unlockCanvasAndPost(canvas);
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO 自動生成されたメソッド・スタブ
   Log.d("タグ", "surfaceDestroyed");
  }

 }
 
 /*
  * オーバーレイのMySurfaceViewCallback
  */
 public class OverLaySurfaceViewCallback implements SurfaceHolder.Callback {

  private Context ovContext;

  public OverLaySurfaceViewCallback(Context mContext) {
   // TODO 自動生成されたコンストラクター・スタブ
   ovContext = mContext;
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO 自動生成されたメソッド・スタブ
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO 自動生成されたメソッド・スタブ
   Canvas mCanvas = holder.lockCanvas();

   Bitmap image = BitmapFactory.decodeResource(
     ovContext.getResources(), R.drawable.ic_launcher);
   mCanvas.drawBitmap(image, 240,50, null);
   
   holder.unlockCanvasAndPost(mCanvas);
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO 自動生成されたメソッド・スタブ
  }
 }
}

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView
android:id="@+id/OverLaySurfaceView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<SurfaceView
android:id="@+id/BackSurfaceView"
android:layout_width="fill_parent"
android:layout_height="match_parent" />
</FrameLayout>

関連記事

0 件のコメント:

コメントを投稿