애니메이션을 수행하기 위해서 처음에 onDraw함수에 thread.delay를 사용하였지만 잘 되지 않아 여러 방법을 찾아 다녔다. invalidate()를 사용하여 변경된것을 적용해보았는데 이것역시 잘 되지 않았다.
http://eagle.phys.utk.edu/guidry/android/animatorDemo.html
위의 있는 예제와 거의 동일하다.

결국 찾은 방법은 thread를 하나 생성하고 여기서 refresh 명령을 내려주면서 달의 위치를 바꿔주면 쉽게 만들 수 있다.
이 방법은 다른 progressbar등을 만들때 사용하면 될 것 같다.
어쨋든 run() 과 onDraw() 부분을 잘 분석 해보기를 바란다.
This slideshow requires JavaScript.
package com.ysoh.canvas2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import com.ysoh.canvas2.AndroidCanvas2Activity.MyView;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.graphics.drawable.*;
import android.os.Handler;
import android.os.Message;;
public class AndroidCanvas2Activity extends Activity {
MyView vw;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vw = new MyView(this);
setContentView(vw);
vw.start();
}
protected class MyView extends View implements Runnable{
int cur_angle = 0;
Thread animator = null;
public MyView(Context context) {
super(context);
}
void start(){
animator = new Thread(this);
animator.start();
}
public void run() {
while(true){
cur_angle += (360/16);
postInvalidate();
try {
Thread.sleep(900, 0);
}
catch (InterruptedException e)
{
;
}
}
}
public void onDraw(Canvas canvas) {
Paint Pnt = new Paint();
super.onDraw(canvas);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int deviceWidth = displayMetrics.widthPixels;
int deviceHeight = displayMetrics.heightPixels;
int radius = 100;
int mini_radius = 10;
canvas.drawColor(Color.WHITE);
Pnt.setColor(Color.BLACK);
Pnt.setStrokeWidth(5);
Pnt.setStyle(Paint.Style.STROKE);
radius = deviceWidth/4;
Pnt.setColor(Color.RED);
canvas.drawCircle(deviceWidth/2, deviceHeight/5*1, radius, Pnt);
mini_radius = 15;
Pnt.setColor(Color.BLUE);
for (double angle = cur_angle; angle int x_base = deviceWidth/2;
int y_base = deviceHeight/5*1;
int diff = mini_radius;
int x, y;
double rad;
rad = angle*3.14/180;
x = (int) ((radius + diff) * Math.sin(rad));
y = (int) ((radius + diff) * Math.cos(rad));
canvas.drawCircle(x_base + x, y_base + y, mini_radius, Pnt);
}
}
}
}

package com.ysoh.canvas2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import com.ysoh.canvas2.AndroidCanvas2Activity.MyView;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.graphics.drawable.*;
import android.os.Handler;
import android.os.Message;;
public class AndroidCanvas2Activity extends Activity {
MyView vw;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vw = new MyView(this);
setContentView(vw);
vw.start();
}
protected class MyView extends View implements Runnable{
int cur_angle = 0;
Thread animator = null;
public MyView(Context context) {
super(context);
}
void start(){
animator = new Thread(this);
animator.start();
}
public void run() {
while(true){
cur_angle += (360/16);
postInvalidate();
try {
Thread.sleep(900, 0);
}
catch (InterruptedException e)
{
;
}
}
}
public void onDraw(Canvas canvas) {
Paint Pnt = new Paint();
super.onDraw(canvas);
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int deviceWidth = displayMetrics.widthPixels;
int deviceHeight = displayMetrics.heightPixels;
int radius = 100;
int mini_radius = 10;
canvas.drawColor(Color.WHITE);
Pnt.setColor(Color.RED);
Pnt.setStrokeWidth(5);
Pnt.setStyle(Paint.Style.STROKE);
radius = deviceWidth/4;
canvas.drawCircle(deviceWidth/2, deviceHeight/5*3, radius, Pnt);
Pnt.setColor(Color.BLUE);
for (double angle = cur_angle; angle int x_base = deviceWidth/2;
int y_base = deviceHeight/5*3;
int diff = mini_radius;
int x, y;
double rad = angle*3.14/180;
x = (int) ((radius-diff) * Math.sin(rad));
y = (int) ((radius-diff) * Math.cos(rad));
canvas.drawCircle(x_base + x, y_base + y, mini_radius, Pnt);
}
}
}
}