プレビューに画像をオーバレイ
昨晩検討したソレを実装してみました。
結論から言うと
正常動作。ただし課題あり。
とりあえず昨晩検討した方向性が以下で
- SurfaceView なプレビュー用の View を定義して setContentView する
- Overlay 用の View を定義して addContentView に new で生成したオブジェクトを渡す
- コンストラクタで invalidate() する
- onDraw で BitMap 取得して Canvas#drawBitmap する
その通り実装してみました。プレビューな View の定義は略します。以下。
package jp.shuri.android.cameraex; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.ViewGroup.LayoutParams; public class CameraEx extends Activity { private static final int SETTINGS_MENU_ID = Menu.FIRST; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new CameraView(this, getWindowManager().getDefaultDisplay())); addContentView(new OverlayView(this), new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); } @Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, SETTINGS_MENU_ID, Menu.NONE, R.string.menu1); return result; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case SETTINGS_MENU_ID: Intent intent = new Intent(getApplicationContext(), SettingsPreferencesActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } class OverlayView extends View { private float x = -1; private float y = -1; private Bitmap bitmap; public OverlayView(Context context) { super(context); bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.droidkun); setFocusable(true); x = y = 0; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.TRANSPARENT); if (x >= 0) { canvas.drawBitmap(bitmap, x, y, null); } } } }
詳細は略。あと、drawable なナニに関する理解が不足しているようですので、今から確認入れます。