অ্যান্ড্রয়েডে, আপনি যদি কোনও বস্তু সঞ্জীবিত করতে এবং এটি কোনও অবস্থান 1 থেকে লোকেশন 2 এ স্থানান্তর করতে চান তবে অ্যানিমেশন এপিআই মধ্যবর্তী অবস্থানগুলি (টিউনিং) সনাক্ত করে এবং তারপরে টাইমার ব্যবহার করে উপযুক্ত সময়ে যথাযথ পদক্ষেপের ক্রিয়াগুলি মূল থ্রেডের মধ্যে সারি করে । মূল থ্রেডটি সাধারণত অন্যান্য অনেক কিছুর জন্য ব্যবহৃত হয় - পেন্টিং, ফাইল খোলার জন্য, ব্যবহারকারীর ইনপুটগুলিতে সাড়া দেওয়া ইত্যাদি etc. ভাল লিখিত প্রোগ্রামগুলি সর্বদা ব্যাকগ্রাউন্ড (নন মেইন) থ্রেডগুলিতে যথাসম্ভব অপারেশন করার চেষ্টা করবে তবে আপনি সবসময় মূল থ্রেড ব্যবহার এড়াতে পারবেন না। অপারেশনগুলির জন্য যেগুলি আপনাকে কোনও ইউআই অবজেক্টে চালিত করা প্রয়োজন সর্বদা মূল থ্রেডে করতে হবে। এছাড়াও, অনেকগুলি এপিআই থ্রেড-সুরক্ষার ফর্ম হিসাবে মূল থ্রেডে ফিরে অপারেশনগুলি ফানেল করবে।
ভিউগুলি সমস্ত একই জিইউআই থ্রেডে আঁকা হয় যা সমস্ত ব্যবহারকারীর মিথস্ক্রিয়াতেও ব্যবহৃত হয়।
সুতরাং আপনার যদি GUI দ্রুত আপডেট করার প্রয়োজন হয় বা যদি রেন্ডারিংটি খুব বেশি সময় নেয় এবং ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে তবে সারফেসভিউ ব্যবহার করুন।
ঘূর্ণন চিত্রের উদাহরণ:
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));
}
}