SurfaceView を使ってみた

SurfaceView は
java.lang.Object
  ↳ android.view.View
    ↳ android.view.SurfaceView
を使用します

また、Surfaceの変更などを取得するために
SurfaceHolder.Callback
を使用します
このインターフェースは
  • public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
  • public void surfaceCreated(SurfaceHolder holder)
  • public void surfaceDestroyed(SurfaceHolder holder)
の3つのメソッドを実装する必要があります

というわけで、SurfaceView をいじってみた

サンプルプログラム
  1. import android.app.Activity;  
  2. import android.content.Context;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.drawable.BitmapDrawable;  
  8. import android.os.Bundle;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11.   
  12. public class SurfaceViewTest extends Activity {  
  13.   @Override  
  14.   public void onCreate(Bundle savedInstanceState) {  
  15.     super.onCreate(savedInstanceState);  
  16.   
  17.     setContentView(new SurfaceTestView(this));  
  18.   }  
  19.    
  20.   class SurfaceTestView extends SurfaceView   
  21.         implements SurfaceHolder.Callback, Runnable {  
  22.     private Thread thread;  
  23.     private BitmapDrawable bitmapDrawable;  
  24.     
  25.     public SurfaceTestView(Context context) {  
  26.       super(context);  
  27.      
  28.       // SurfaceHolder の取得  
  29.       SurfaceHolder holder = getHolder();  
  30.      
  31.       // SurfaceHolder に コールバックを設定  
  32.       holder.addCallback(this);  
  33.       holder.setFixedSize(getWidth(), getHeight());  
  34.      
  35.       // フォーカスをあてる  
  36.       setFocusable(true);  
  37.      
  38.       bitmapDrawable = new BitmapDrawable(  
  39.         context.getResources(),  
  40.         BitmapFactory.decodeResource(  
  41.           context.getResources(),   
  42.           R.drawable.icon)  
  43.       );  
  44.     }  
  45.   
  46.     // Surface が変更されたときの動作  
  47.     public void surfaceChanged(SurfaceHolder holder,  
  48.         int format, int width, int height) {  
  49.     }  
  50.   
  51.     // Surface が作成されたときの動作  
  52.     public void surfaceCreated(SurfaceHolder holder) {  
  53.       thread = new Thread(this);  
  54.       thread.start();  
  55.     }  
  56.   
  57.     // Surface が削除されたときの動作  
  58.     public void surfaceDestroyed(SurfaceHolder holder) {  
  59.       thread = null;  
  60.     }  
  61.   
  62.     public void run() {  
  63.       while (thread != null) {  
  64.         // 描画の開始  
  65.         Canvas canvas = getHolder().lockCanvas();  
  66.       
  67.         draw(canvas);  
  68.       
  69.         // 描画の終了  
  70.         getHolder().unlockCanvasAndPost(canvas);  
  71.       }  
  72.     }  
  73.   
  74.     @Override  
  75.     public void draw(Canvas canvas) {  
  76.       // 現在の状態を保存  
  77.       canvas.save();  
  78.      
  79.       Paint paint = new Paint();  
  80.       paint.setColor(Color.RED);  
  81.       paint.setTextSize(32);  
  82.      
  83.       bitmapDrawable.setBounds(009696);  
  84.       bitmapDrawable.draw(canvas);  
  85.       canvas.drawText("SurfaceViewTest"0128, paint);  
  86.   
  87.       paint.setAntiAlias(true);  
  88.       bitmapDrawable.setBounds(016096256);  
  89.       bitmapDrawable.draw(canvas);  
  90.       canvas.drawText("SurfaceViewTest2"0288, paint);  
  91.   
  92.       // 現在の状態の変更  
  93.       canvas.restore();  
  94.     }  
  95.   }  
  96. }  

プログラムを実行すると...


こんな感じ!(上:アンチエイリアスなし, 下:あり)

アンチエイリアスは時間がかかるが場合によってはかけた方が良さそう

参考サイト
http://developer.android.com/intl/ja/reference/android/view/SurfaceView.html
http://developer.android.com/intl/ja/reference/android/view/SurfaceHolder.Callback.html

0 件のコメント:

コメントを投稿