Android

SurfaceView 기본 구조.

Ohjeonghak 2013. 12. 4. 10:20
반응형

SurfaceView 는 하나의 스레드를 가진게 일반적인 구조이다.

하지만 리스너에서 SurfaceView를 사용한다면 스레드를 가지거나 리스너 안에서 SurfaceView를 생성하는

행동은 앱을 느리게하거나 터지게 만든다...  이러한 사항을 고려해서 리스너 밖에서 생성하고 스레드를 사용하지 않도록  조심하면 될 것 같다는 생각이 든다...

 

SurfaceView 구조는 이러하다....

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.Path;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//surfaceview
public class Surface extends SurfaceView implements SurfaceHolder.Callback {

	private SurfaceHolder holder;
	public ImageThread mThread;

	public Surface(Context context) {

		super(context);
		holder = getHolder();
		holder.addCallback(this);

		mThread = new ImageThread(holder, context);

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		mThread.setRunning(true);
		mThread.start();

	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {

		//TODO thread stop
		boolean done = true;

		mThread.setRunning(false);

		while (done) {
			try {
				mThread.join();
				done = false;
			} catch (InterruptedException e) {

			}
		}
	}

	public class ImageThread extends Thread {

		SurfaceHolder mHolder;
		boolean m_run;
		int mStart_x;
		int mStart_y;
		int mEnd_x;
		int mEnd_y;

		public ImageThread(SurfaceHolder holder, Context context) {

			this.mHolder = holder;
		}

		public void setRunning(boolean run) {
			this.m_run = run;
		}

		@Override
		public void run() {
			Bitmap Img = BitmapFactory.decodeResource(getResources(),
					R.drawable.drag);

			while (m_run) {
				Canvas canvas = null;
				try {
					canvas = mHolder.lockCanvas();
					synchronized (mHolder) {
						//TODO 실제 그래픽 처리부분을 구현하여 줍니다.

						//Paint paint = new Paint();

						//paint.setStyle(Paint.Style.STROKE);
						//paint.setStrokeWidth(2);
						//paint.setColor(Color.RED);
					
						//Path path = new Path();

						//path.moveTo(50, 50);
						//path.lineTo(100, 0);
						//path.lineTo(150, 50);
						//path.close();
						//path.offset(110, 150);
						//canvas.drawPath(path, paint);
						
						int w = Img.getWidth();
						int h = Img.getHeight();
						Rect src = new Rect(0, 0, w, h);
						Rect dst = new Rect(200, 200, 200+w/2, 200+h/2);
						canvas.drawBitmap(Img, src, dst, null);
						

					}
				} catch (Exception e) {

				} finally {
					if (canvas != null) {
						mHolder.unlockCanvasAndPost(canvas);
					}
				}
			}
		}
	}

}

 

그리고 메인에서....

Surface surfaceEvent = new Surface(Main_Activity.this);
surfaceEvent.setZOrderOnTop(true); ⁄⁄최상위로 뷰를 보여주는듯 하다.
surfaceEvent.getHolder().setFormat(PixelFormat.TRANSPARENT); ⁄⁄ 배경을 불투명으로 만든다.

//surfaceview를 뷰에 추가한다.
//png형식의 비트맵이라면 배경이 투명하게 적용되어 기존 뷰와 합해져서 보인다.
addContentView(surfaceEvent, 
new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

//surfaceview 로 뷰를셋팅함으로 덮어쓴다고 생각하면 될 것 같다.
//결과는 배경이 불투명하게 보였다.
⁄⁄setContentView(surfaceEvent);

 

 

이렇게 하면 된다.

반응형