반응형
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);
이렇게 하면 된다.
반응형
'Android' 카테고리의 다른 글
일반 이클립스에 android sdk연동하기 (0) | 2014.07.06 |
---|---|
Android DB SQLite 예제 (6) | 2014.02.13 |
android에서 pdf파일 페이지를 png파일로 저장하기. (0) | 2013.12.04 |
android에서 png를 pdf로 만들기. (0) | 2013.12.04 |
프로젝트에 jar 파일 추가하기. (0) | 2013.12.04 |