Android에서 객체에 애니메이션을 적용하여 객체를 location1에서 location2로 이동 시키려면 애니메이션 API가 중간 위치 (트위닝)를 파악한 다음 타이머를 사용하여 적절한 시간에 적절한 이동 작업을 메인 스레드에 대기시킵니다. . 메인 스레드는 일반적으로 그림 그리기, 파일 열기, 사용자 입력에 대한 응답 등 많은 다른 용도로 사용된다는 점을 제외하고는 잘 작동합니다. 대기 타이머는 종종 지연 될 수 있습니다. 잘 작성된 프로그램은 백그라운드 (메인이 아닌) 스레드에서 가능한 한 많은 작업을 수행하려고하지만 항상 메인 스레드 사용을 피할 수는 없습니다. UI 객체에서 작업해야하는 작업은 항상 기본 스레드에서 수행해야합니다. 또한 많은 API가 스레드 안전성의 형태로 기본 스레드로 작업을 다시 퍼널합니다.
뷰는 모두 동일한 GUI 스레드에서 그려지며 모든 사용자 상호 작용에도 사용됩니다.
따라서 GUI를 빠르게 업데이트해야하거나 렌더링 시간이 너무 오래 걸리고 사용자 경험에 영향을주는 경우 SurfaceView를 사용하십시오.
회전 이미지의 예 :
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private DrawThread drawThread;
public MySurfaceView(Context context) {
super(context);
getHolder().addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawThread = new DrawThread(getHolder(), getResources());
drawThread.setRunning(true);
drawThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
drawThread.setRunning(false);
while (retry) {
try {
drawThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
}
class DrawThread extends Thread{
private boolean runFlag = false;
private SurfaceHolder surfaceHolder;
private Bitmap picture;
private Matrix matrix;
private long prevTime;
public DrawThread(SurfaceHolder surfaceHolder, Resources resources){
this.surfaceHolder = surfaceHolder;
picture = BitmapFactory.decodeResource(resources, R.drawable.icon);
matrix = new Matrix();
matrix.postScale(3.0f, 3.0f);
matrix.postTranslate(100.0f, 100.0f);
prevTime = System.currentTimeMillis();
}
public void setRunning(boolean run) {
runFlag = run;
}
@Override
public void run() {
Canvas canvas;
while (runFlag) {
long now = System.currentTimeMillis();
long elapsedTime = now - prevTime;
if (elapsedTime > 30){
prevTime = now;
matrix.preRotate(2.0f, picture.getWidth() / 2, picture.getHeight() / 2);
}
canvas = null;
try {
canvas = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(picture, matrix, null);
}
}
finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}
활동:
public class SurfaceViewActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView(this));
}
}