package com.android.imagedisplay;
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.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
import android.widget.TextView;
public class AnimateView extends SurfaceView implements Callback {
class ImageThread extends Thread {
private Bitmap mImgBack0;
private Bitmap mImgBack1;
private Bitmap mImgBack21;
private Bitmap mImgback31;
private int mPlayerWidth;
private int mPlayerHeight;
private int mVisitCount = 0;
private SurfaceHolder mSurfaceHolder;
private Drawable mFrontImage[] = new Drawable[4];
private int mDirection = 0;
private Drawable mArrow[] = new Drawable[2];
private int mArrowWidth, mArrowHeight;
public ImageThread(SurfaceHolder surfaceHolder, Context context, Handler handler) {
// TODO Auto-generated method stub
mSurfaceHolder = surfaceHolder;
Resources res = context.getResources();
mFrontImage[0] = context.getResources().getDrawable(R.drawable.front01);
mFrontImage[1] = context.getResources().getDrawable(R.drawable.front02);
mFrontImage[2] = context.getResources().getDrawable(R.drawable.front03);
mFrontImage[3] = context.getResources().getDrawable(R.drawable.front04);
mImgBack0 = BitmapFactory.decodeResource(res, R.drawable.img0);
mImgBack1 = BitmapFactory.decodeResource(res, R.drawable.img1);
mImgBack21 = BitmapFactory.decodeResource(res, R.drawable.img21);
mImgback31 = BitmapFactory.decodeResource(res, R.drawable.img31);
mPlayerWidth = mFrontImage[1].getIntrinsicWidth();
mPlayerHeight = mFrontImage[1].getIntrinsicHeight();
mArrow[0] = context.getResources().getDrawable(R.drawable.arrowleft);
mArrow[0] = context.getResources().getDrawable(R.drawable.arrowright);
mArrowWidth = mArrow[0].getIntrinsicWidth();
mArrowHeight = mArrow[1].getIntrinsicHeight();
}
public void doStart(){
synchronized (mSurfaceHolder){
}
}
public void run(){
while(true){
Canvas c = null;
try{
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder){
doDraw(c);
mVisitCount++;
sleep(100);
}
}catch(InterruptedException e){
e.printStackTrace();
} finally{
if(c!=null){
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private void doDraw(Canvas canvas){
canvas.drawBitmap(mImgBack0, 0, 0, null);
canvas.drawBitmap(mImgBack1, 0, 90, null);
canvas.drawBitmap(mImgBack21, 0, 190, null);
canvas.drawBitmap(mImgback31, 0, 310, null);
mFrontImage[mVisitCount%4].setBounds(145, 360, 145+mPlayerWidth, 360+mPlayerHeight);
mFrontImage[mVisitCount%4].draw(canvas);
if (mDirection == -1) {
mArrow[0].setBounds(20, 200, 20+mArrowWidth, 200+mArrowHeight);
mArrow[0].draw(canvas);
}
else if (mDirection == 1) {
mArrow[1].setBounds(190, 200, 190+mArrowWidth, 200+mArrowHeight);
mArrow[1].draw(canvas);
}
}
void setKeyDown(int keyCode) {
mDirection = keyCode;
}
}
private TextView mStatusText;
private ImageThread thread;
public AnimateView(Context context, AttributeSet attrs){
super(context, attrs);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
thread = new ImageThread(holder, context, new Handler() {
public void handleMessage(Message m){
mStatusText.setVisibility(m.getData().getInt("viz"));
mStatusText.setText(m.getData().getString("text"));
}
});
setFocusable(true);
}
@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
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
boolean retry = true;
while (retry) {
try {
thread.join();
retry = false;
}catch (InterruptedException e) {
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
thread.setKeyDown(-1);
else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
thread.setKeyDown(1);
else if (keyCode == KeyEvent.KEYCODE_DPAD_UP)
thread.setKeyDown(0);
return super.onKeyDown(keyCode, event);
}
}
공지사항 모두 읽었습니다.