Android'de, bir nesneyi canlandırmak ve nesneyi konum1'den konum2'ye taşımak istiyorsanız, animasyon API'sı ara konumları (ara doldurma) anlar ve ardından bir zamanlayıcı kullanarak uygun hareket işlemlerini uygun zamanlarda sıralar . Bu, ana iş parçacığının genellikle diğer birçok şey için kullanılması dışında işe yarar - boyama, dosyaları açma, kullanıcı girişlerine yanıt verme vb. İyi yazılmış programlar her zaman arka plan (ana olmayan) iş parçacıklarında mümkün olduğunca çok işlem yapmaya çalışır, ancak her zaman ana iş parçacığını kullanmaktan kaçınamazsınız. Bir UI nesnesinde çalışmanızı gerektiren işlemlerin her zaman ana iş parçacığında yapılması gerekir. Ayrıca, birçok API, bir iş parçacığı güvenliği biçimi olarak işlemleri ana iş parçacığına geri yönlendirir.
Görünümlerin tümü, tüm kullanıcı etkileşimi için de kullanılan aynı GUI iş parçacığında çizilir.
Dolayısıyla, GUI'yi hızlı bir şekilde güncellemeniz gerekiyorsa veya oluşturma işlemi çok fazla zaman alıyorsa ve kullanıcı deneyimini etkiliyorsa SurfaceView kullanın.
Döndürme görüntüsü örneği:
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);
}
}
}
}
}
aktivite:
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));
}
}