티스토리 뷰

//SurfaceHolder와 SurfaceHolder.Callback 적용...이것들이 어디에 쓰이는지 모른다
//아무래도 FrameLayout일때 쓰이는것 같은데 사용법은 잘 모름..
//SurfaceHolder는 직접 접근할수가 없다고 한다
//그래서 SurfaceHolder.Callback을 이용해서 접근한다고 한다.
//그래서 여기서 클래스 안에 클래스를 하나 더 적용해서 (쓰래드 상속 받은 클래스)
//그 클래스에서 그리기, 키입력을 받아 쓴다.
//layout 에서 <ImageView> 으로 이미지를 그리고 배치할수 있으나
//FrameLayout 이 아무래도 전체 그리기로는 알맞는것 같다.
//비트맵,png 이미지 하나 그리는데 소스가 너무 많다.. 헷깔린다.

package com.chiree.myimageview;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

// 클래스 생성시
//superClass를 android.view.SurfaceHoloder 로 지정
//interface를 surfaceholder.Callback으로 지정

public class ImageView extends SurfaceView implements SurfaceHolder.Callback {

 private img mimg;
 public ImageView(Context context, AttributeSet attrs) {
  super(context, attrs);

//surfaceholder callback설정
  SurfaceHolder holder = getHolder();
  holder.addCallback(this);

//thread 클래스 생성
  mimg = new img(holder,context,new Handler());
  // TODO Auto-generated constructor stub
 }

 @Override
 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub

 }

 @Override
 public void surfaceCreated(SurfaceHolder arg0) {
  // TODO Auto-generated method stub
//thread 클래스 시작하기.
  mimg.start();
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder arg0) {
  // TODO Auto-generated method stub

 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
 }

 //내부 클래스 Thread 상속 받아 생성
 class img extends Thread{
  private Bitmap mbitmap;
  private Drawable mpng ;
  private int mpngWidth;
  private int mpngHeight;
  Canvas canvas;
  private SurfaceHolder mSurfaceHolder;
  public img(SurfaceHolder surfaceHolder,Context context, Handler handler) {
   mSurfaceHolder = surfaceHolder;

//이미지 로드
   Resources res = context.getResources();
   mbitmap = BitmapFactory.decodeResource(res, R.drawable.mimgback1);
   mpng = context.getResources().getDrawable(R.drawable.mfrontimage1);
   mpngWidth = mpng.getIntrinsicWidth();
   mpngHeight = mpng.getIntrinsicHeight();
   // TODO Auto-generated constructor stub
  }

//쓰래드는 run() 함수를 호출한다.
//while 문으로 계속 그리는데 예외처리는 잘 모르는 부분이다.
  public void run(){
   while(true){
    Canvas c = null;
    try{
     c = mSurfaceHolder.lockCanvas(null);
     synchronized(mSurfaceHolder){
      startDraw(c);
      sleep(100);
     
     }
    }catch(InterruptedException e){
     e.printStackTrace();
     
    }finally{
     if(c != null)
      mSurfaceHolder.unlockCanvasAndPost(c);
    }
   }
  }
//run함수에서 그리기함수를 호출한다.
  public void startDraw(Canvas canvas) {
   // TODO Auto-generated method stub
//비트맵 그리는 함수
   canvas.drawBitmap(mbitmap,0,0,null);
//png 그리는 함수 방법
   mpng.setBounds(10,10,10+mpngWidth,10+mpngHeight);
   mpng.draw(canvas);
  }
 }
}

'프로그래밍 언어 > android' 카테고리의 다른 글

스피드 랭킹퍼즐  (0) 2024.03.21
sound  (0) 2010.01.28
이미지 읽어오기  (0) 2010.01.20
animation  (0) 2010.01.20
비트맵 그리기  (0) 2009.10.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함