Android 안드로이드2015. 2. 20. 21:53












카메라와 플레시를 다루는 기본 구조를 만들었다.

같은 자리에서 근 1주일여 이상 머무르는 중이다.

바닥으로 내려가서 점검하며 올라가려는 생각에 만들었다.

이것으로 실마리를 찾아가는 단초가 되었으면한다.



package com.example.tstbselight; import java.io.IOException; import android.app.Activity; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MnTstBaeLightActy extends Activity implements SurfaceHolder.Callback { private static final String TAG = MnTstBaeLightActy.class.getSimpleName(); Camera mCamera = null; Parameters mParameters = null; // add null!!! SurfaceView mSurfaceView; SurfaceHolder mSurfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acty_mntstbaelight); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "*******************************************************"); Log.d(TAG, "onCreate()"); mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated()"); mCamera = Camera.open(); mParameters = mCamera.getParameters(); try { mCamera.setPreviewDisplay(mSurfaceHolder); } catch (IOException e) { e.printStackTrace(); } Log.d(TAG, "__ B4:setFlashMode():"); mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH); Log.d(TAG, "__ B4:setParameters():"); mCamera.setParameters(mParameters); Log.d(TAG, "__ B4:startPreview():"); mCamera.startPreview(); Log.d(TAG, "__ A4:startPreview():"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG, "surfaceChanged()"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "surfaceDestroyed()"); if (mCamera != null) { Log.d(TAG, "setFlashMode(Parameters.FLASH_MODE_OFF)"); mParameters.setFlashMode(Parameters.FLASH_MODE_OFF); Log.d(TAG, "setParameters(mParameters)"); mCamera.setParameters(mParameters); // mSurfaceHolder.removeCallback(this); Log.d(TAG, "stopPreview()"); mCamera.stopPreview(); Log.d(TAG, "release()"); mCamera.release(); Log.d(TAG, "A4:release()"); mCamera = null; } } @Override public void onDestroy() { Log.d(TAG, "onDestroy()"); super.onDestroy(); } }





Posted by 코드버무려
Android 안드로이드2015. 2. 18. 09:59












서피스 뷰를 테스트한다.

화면을 외쫀에서 우로 녹색원이 가로지른다.

화면 오른쪽을 빠져나가고 바로 왼쪽에서 시작한다.

일시정지로 화면 밖을 나갈경우 복귀 후 마지막위치에서 시작한다

왼쪽에서 우로 반복한다.

public class MySurfaceVwActy extends Activity { private static final String TAG = MySurfaceVwActy.class.getSimpleName(); SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature()는 setContentView() 앞에 놓인다 // requestWindowFeature(Window.FEATURE_NO_TITLE); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "onCreate()"); TestView surfaceEvent = new TestView(getApplicationContext()); setContentView(surfaceEvent); Log.d(TAG, "onCreate() out"); } } class TestView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG_sfvw = MySurfaceVwActy.class.getSimpleName(); private SurfaceHolder mHolder; public TstThread mThread; Context mContext; int mStrX, mStrY; float mRadius; public TestView(Context context) { super(context); Log.d(TAG_sfvw, "__TestView() "); mContext = context; mHolder = getHolder(); mHolder.addCallback(this); mStrX = 0; mStrY = 150; mRadius = 50.0f; } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG_sfvw, "__surfaceCreated() "); mThread = new TstThread(mHolder, mContext, mStrX); mThread.setRunning(true); mThread.start(); Log.d(TAG_sfvw, "__surfaceCreated() out"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG_sfvw, "__surfaceChanged() "); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG_sfvw, "__surfaceDestroyed() "); boolean retry = true; mThread.setRunning(false); while (retry) { try { mThread.join(); retry = false; } catch (InterruptedException e) { Log.d(TAG_sfvw, "catch(InterruptedException e) & repeat while(done){8888888}"); e.printStackTrace(); } } Log.d(TAG_sfvw, "__surfaceDestroyed() end"); } public class TstThread extends Thread { SurfaceHolder mHolder; boolean bIsRunning; int mWidth; int mHeight; public TstThread(SurfaceHolder holder, Context context, int mStrX) { Log.d(TAG_sfvw, "ImageThread() "); this.mHolder = holder; DisplayMetrics metrics = context.getResources().getDisplayMetrics(); mWidth = metrics.widthPixels; mHeight = metrics.heightPixels; } public void setRunning(boolean run) { Log.d(TAG_sfvw, "setRunning(" +run+ ")"); this.bIsRunning = run; } @Override public void run() { Log.d(TAG_sfvw, "__run() "); while(bIsRunning) { android.graphics.Canvas cnvs = null; try { cnvs = getHolder().lockCanvas(null); synchronized(mHolder) { android.graphics.Paint pnt = new android.graphics.Paint(); //이전화면을 지워 이돟효과를 마련 pnt.setColor(android.graphics.Color.BLACK); cnvs.drawRect(new Rect(0,0, mWidth, mHeight), pnt); mStrX++; if(mStrX > mWidth+mRadius+2) mStrX= 0; //화면을 빠져나가자마자 왼쪽에서 pnt.setColor(android.graphics.Color.GREEN); cnvs.drawCircle(mStrX, mStrY, mRadius, pnt); } } finally { if(cnvs != null) getHolder().unlockCanvasAndPost(cnvs); } } //while(true) Log.d(TAG_sfvw, "__run() end"); } } }



Posted by 코드버무려
Android 안드로이드2014. 12. 28. 15:11















public class MySurfaceVwActy extends Activity { private static final String TAG = MySurfaceVwActy.class.getSimpleName(); SurfaceView surfaceView; SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); // setContentView(R.layout.activity_my_surface_view); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); SurfaceVw surfaceEvent = new SurfaceVw(MySurfaceVwActy.this); surfaceEvent.setZOrderOnTop(true); surfaceEvent.getHolder().setFormat(PixelFormat.TRANSPARENT); addContentView(surfaceEvent, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); Log.d(TAG, "onCreate() end"); } } class SurfaceVw extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG_sfvw = MySurfaceVwActy.class.getSimpleName(); private SurfaceHolder holder; public TstThread mThread; public SurfaceVw(Context context) { super(context); Log.d(TAG_sfvw, "Surface() "); holder = getHolder(); holder.addCallback(this); mThread = new TstThread(holder, context); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG_sfvw, "surfaceCreated() "); mThread.setRunning(true); mThread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG_sfvw, "surfaceChanged() "); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG_sfvw, "surfaceDestroyed() "); //TODO thread stop boolean done = true; mThread.setRunning(false); while (done) { try { mThread.join(); done = false; } catch (InterruptedException e) { Log.d(TAG_sfvw, "catch(InterruptedException e) & repeat while(done){8888888}"); e.printStackTrace(); } } } public class TstThread extends Thread { SurfaceHolder mHolder; boolean m_run; int mStrX; int mStrY; int mWidth; int mHeight; public TstThread(SurfaceHolder holder, Context context) { Log.d(TAG_sfvw, "TstThread() "); this.mHolder = holder; DisplayMetrics metrics = context.getResources().getDisplayMetrics(); mWidth = metrics.widthPixels; mHeight = metrics.heightPixels; mStrX = 0; mStrY = 0; } public void setRunning(boolean run) { Log.d(TAG_sfvw, "setRunning() "); this.m_run = run; } @Override public void run() { Bitmap Img = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); int w = Img.getWidth(); int h = Img.getHeight(); Log.d(TAG_sfvw, "run() "); while (m_run) { Canvas canvas = null; try { canvas = mHolder.lockCanvas(); synchronized (mHolder) { Rect src = new Rect(0, 0, w, h); mStrX += 1; if(mStrX > mWidth) mStrX= 0; mStrY += 1; if(mStrY > mHeight) mStrY= 0; Rect dst = new Rect(mStrX, mStrY, mStrX+w, mStrY+h); canvas.drawBitmap(Img, src, dst, null); } } catch (Exception e) { // Log.d(TAG_sfvw, " "); e.printStackTrace(); } finally { if (canvas != null) { Log.d(TAG_sfvw, "while (m_run): finally"); mHolder.unlockCanvasAndPost(canvas); } } } } } }


Posted by 코드버무려
카테고리 없음2014. 11. 14. 11:54













SurfaceView와 그 부속 함수 사용 정리가 필요하다.

이것 저것 테스트한 코드를 쌓았다.

public class MySurfaceVwActy extends Activity { private static final String TAG = MySurfaceVwActy.class.getSimpleName(); SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); //setContentView 앞|뒤에 오면? 에러!! // setContentView(R.layout.activity_my_surface_view); Log.d(TAG, "*********************************************************"); Log.d(TAG, "*********************************************************"); TestView surfaceEvent = new TestView(getApplicationContext()); // TestView surfaceEvent = new TestView(MyTestViewActy.this); // surfaceEvent.setZOrderOnTop(true);     // surfaceEvent.getHolder().setFormat(PixelFormat.TRANSPARENT); // addContentView(surfaceEvent, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); setContentView(surfaceEvent); Button buttonStartCameraPreview = (Button)findViewById(R.id.startcamerapreview); Button buttonStopCameraPreview = (Button)findViewById(R.id.stopcamerapreview); Log.d(TAG, "onCreate() end"); } } class TestView extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG_sfvw = MySurfaceVwActy.class.getSimpleName(); private SurfaceHolder mHolder; public TestView(Context context) { super(context); Log.d(TAG_sfvw, "Surface() "); mHolder = getHolder(); mHolder.addCallback(this); }

@Override public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG_sfvw, "surfaceCreated() "); android.graphics.Canvas cnvs = null; try { cnvs = getHolder().lockCanvas(null); synchronized(getHolder()) { android.graphics.Paint pnt = new android.graphics.Paint(); pnt.setColor(android.graphics.Color.GREEN); cnvs.drawCircle(100, 100, 50, pnt); } } finally { if(cnvs != null) getHolder().unlockCanvasAndPost(cnvs); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(TAG_sfvw, "surfaceChanged() "); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG_sfvw, "surfaceDestroyed() "); } }






Posted by 코드버무려
Android 안드로이드2014. 8. 31. 19:32











Activity 아닌 위칭에서 화면크기 구할 때 Context 객체를 넘겨받아

DisplayMetrics metrics = context.getResources().getDisplayMetrics();

mWidth = metrics.widthPixels;

mHeight = metrics.heightPixels;



************************************************************

리소스에 등록된 이미지를 읽고 bitmap에 연결하며 그 가로 세로 크기를 구한다

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

int w = bitmap.getWidth();

int h = bitmap.getHeight();



************************************************************

버튼 클릭으로 카메라 Preview를 등록하고 해제한다.


buttonStartCameraPreview.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

if(!previewing){

camera = Camera.open();

if (camera != null){

try {

camera.setPreviewDisplay(surfaceHolder);

camera.startPreview();

previewing = true;

} catch (IOException e) {

e.printStackTrace();

}

}

}

}});


buttonStopCameraPreview.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

if(camera != null && previewing){

camera.stopPreview();

camera.release();

camera = null;


previewing = false;

}

}});

Posted by 코드버무려