एंड्रॉइड में, यदि आप किसी ऑब्जेक्ट को एनिमेट करना चाहते हैं और उसे किसी लोकेशन 1 से लोकेशन 2 पर ले जाना चाहते हैं, तो एनीमेशन एपीआई इंटरमीडिएट लोकेशन (ट्वॉयइंग) से बाहर निकलता है और फिर मुख्य थ्रेड पर कतारें एक टाइमर का उपयोग करके उचित समय पर उचित मूव ऑपरेशन करता है। । यह ठीक काम करता है सिवाय इसके कि मुख्य धागा आमतौर पर कई अन्य चीजों के लिए उपयोग किया जाता है - पेंटिंग, फाइलें खोलना, उपयोगकर्ता इनपुट का जवाब देना आदि। एक कतारबद्ध टाइमर को अक्सर देरी हो सकती है। अच्छी तरह से लिखित कार्यक्रम हमेशा पृष्ठभूमि (गैर मुख्य) थ्रेड्स में अधिक से अधिक संचालन करने की कोशिश करेंगे, हालांकि आप हमेशा मुख्य धागे का उपयोग करने से बच नहीं सकते हैं। ऑपरेशन जिन्हें आपको UI ऑब्जेक्ट पर संचालित करने की आवश्यकता होती है, उन्हें हमेशा मुख्य थ्रेड पर किया जाना चाहिए। इसके अलावा, कई एपीआई थ्रेड-सेफ्टी के रूप में मुख्य थ्रेड पर वापस ऑपरेशन करेंगे।
दृश्य सभी एक ही जीयूआई धागे पर खींचे जाते हैं जो सभी उपयोगकर्ता इंटरैक्शन के लिए भी उपयोग किया जाता है।
इसलिए यदि आपको 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));
}
}