안드로이드 개발 질문/답변
(글 수 45,052)
제가 지금 증강현실을 해보고 싶어서 도전중인데... 현재 카메라preview를 띄우는 것까지는 성공했습니다.. 여기까지는 어려움이 없더군요.. 하지만 문제는 이 카메라 위에 버튼을 띄우는 것이 쉽지가 않네요..ㅠㅠ
이부분은 자료도 많지 않은거 같고.. 그리고 자료를 찾아도 정확하게 뭔말인지도 모르겠고..ㅠㅠ 그래서 java소스와 xml소스를 올립니다.. 보고 틀린부분이 있다면 알려주시고... 카메라preview위에 버튼을 띄우는 방법 좀알려주세요...정말 간절합니다...ㅠㅠ 해야 할부분을 표시해서 알려주시면 감사하겠습니다..ㅠㅠ 아직까지는 말설명을 하면 잘 못알아 들어서요..ㅠㅠ 정말 죄송합니다..ㅠㅠ 귀찮게 해드려서...ㅠㅠ
#### Xml소스 ####
<?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"
>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.android.cameraTest
android:id="@+id/preview"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</FrameLayout>
#### Java소스 ####
package com.android.cameraTest;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
public class cameraTest extends Activity {
/** Called when the activity is first created. */
private Preview mPreview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = new Preview(this);
setContentView(mPreview);
}
}
/** Called when the activity is first created. */
private Preview mPreview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = new Preview(this);
setContentView(mPreview);
}
}
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder mHolder;
Camera mCamera;
{
SurfaceHolder mHolder;
Camera mCamera;
public Preview(Context context) {
super(context);
// TODO Auto-generated constructor stub
// SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
// 알수 있다.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
super(context);
// TODO Auto-generated constructor stub
// SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
// 알수 있다.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
//표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작한다.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
//표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작한다.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
// Preview를 표시할 수 위치를 설정합니다.
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}catch(IOException exception)
{
mCamera.release();
mCamera = null;
}
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
// Preview를 표시할 수 위치를 설정합니다.
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}catch(IOException exception)
{
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
//다른 화면으로 돌아가면, Surface가 소멸된다. 따라서 카메라의 Preview도
//중지해야 한다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
//경우 - 엑디비티가 일시정시 상태가 된 경우 등 - 자원을 반환해야 한다.
mCamera.stopPreview();
mCamera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
//다른 화면으로 돌아가면, Surface가 소멸된다. 따라서 카메라의 Preview도
//중지해야 한다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
//경우 - 엑디비티가 일시정시 상태가 된 경우 등 - 자원을 반환해야 한다.
mCamera.stopPreview();
mCamera = null;
}
}
<- 이 블로그에서 저는 카메라위에 놓는 버튼뷰 같은걸 습득했습니다. 이 블로그 한번 참고해보세요
예제소스 zip파일도 수록되어있습니다. 다만 영어라는거 ㅋ