<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
package aa.surface_ex1; import android.app.Activity; import android.os.Bundle; public class MainAct extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MySurfaceView(this)); } }
package aa.surface_ex1; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Point; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.graphics.Canvas; import android.view.SurfaceHolder.Callback; /* View 에 동영상 또는 카메라 프리뷰와 같이 빠른 화면 변화 또는 그러지는 양이 많을 경우 SurfaceView를 사용해 처리 Surface 는 그래픽 버퍼 Surfaceview 에서 화면 제어를 하기 위해 SurfaceHolder 생성 =-=-=-=--=-=-=-=-=-=-==-=-=-= Surface View =-=-=-=--=-=-=-=-=-=-==-=-=-= Surface =-=-=-=--=-=-=-=-=-=-==-=-=-= SurfaceHolder SurfaceHolder를 이용해서 surface(버퍼)에 그림을 그리면 SurfaceView에 반영 */ public class MySurfaceView extends SurfaceView{ Bitmap imgMove; int moveX,moveY,imgW,imgH; Thread thread; Point pImage; boolean bMove = true; SurfaceHolder holder; //canvas의 주체 public MySurfaceView(Context context) { super(context); /*SurfaceHolder 주요 메소드 addCallBack(); 구현한 Callback 객체 등록 lookccanvas() : Surface를 잠그고 그리기 위한 Canvas를 반환 unlockCanvasAndPost() : Canvas lock을 풀고 현재 이미지를 렌더링 */ holder = getHolder(); //SurfaceHolder 객체 반환 holder.addCallback(callback); setFocusable(true); } /*Surface에 변동사항을 전달할 객체 Callback Interface는 SurfaceHolder를 통해 작성한 Surface와 SurfaceView를 연결하기 위해서 Surfcae의 생성,변경 종료에 대한 이벤트 처리 */ private SurfaceHolder.Callback callback = new Callback(){ //Surface가 파괴되었을때 public void surfaceDestroyed(SurfaceHolder holder){ Log.i("MySurfaceView", "표면 파괴"); bMove = false; thread = null; } public void surfaceCreated(SurfaceHolder holder){ Log.i("MySurfaceView", "표면 생성"); pImage = new Point(0,0); Resources resources = getResources(); Bitmap temp_bitmap = BitmapFactory.decodeResource(resources, R.drawable.popeye); imgW = 150; imgH = 180; moveX = 200; moveY = 200; imgMove = Bitmap.createScaledBitmap(temp_bitmap,imgW,imgW,false); setClickable(true); thread = new Thread(runnable); thread.start(); } //Surface가 변경되었을때 public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){ Log.i("MySurfaceView", "표면 변경"); } }; private Runnable runnable = new Runnable() { public void run() { while(bMove){ Canvas c = null; try { c = holder.lockCanvas(); synchronized (holder) { doDraw(c); } } catch (Exception e) { Log.i("disp", "err : " + e.getMessage()); } finally{ if(c != null) holder.unlockCanvasAndPost(c); } } } }; private void doDraw(Canvas canvas){ pImage.x = moveX; pImage.y = moveY; canvas.drawColor(Color.WHITE); canvas.drawBitmap(imgMove, pImage.x,pImage.y, null); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); //touch 지점의 좌표 int x = (int)event.getX(); int y = (int)event.getY(); switch (action) { case MotionEvent.ACTION_MOVE: moveX = x; moveY = y; break; } return super.onTouchEvent(event); } }
마우스에 이미지가 따라 다님
'Android > 기본' 카테고리의 다른 글
Android 메인로딩 페이지 만들기 (0) | 2012.04.28 |
---|---|
Android 카메라, 인증키(키스토어) (0) | 2012.04.28 |
Android Video View (동영상 재생) (0) | 2012.04.28 |
Android Audio사용 (음악 재생) (0) | 2012.04.28 |
Android Constants Provider (0) | 2012.04.28 |