//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);
}
}
}
댓글