最終更新:2016-01-04 (月) 19:01:23 (3033d)
Android/描画
http://developer.android.com/guide/topics/graphics/2d-graphics.html
ビュー
android.view.View 1 普通のビュー android.view.SurfaceView 1 別のスレッドから描画 android.view.TextureView 14 (Android 4.0) SurfaceViewと違ってWindowsを作らない
android.view.View
- 描画処理:メインスレッドのみ
- 画面の更新時にViewクラスでは、onDrawメソッドが自動的に呼ばれ、グラフィックの描画が行われますが、 SurfaceViewでは、呼び出されません。
android.view.TextureView
- Viewなのでレイアウトの移動とかもできる
- 回転もできる、アルファも使える
android.view.SurfaceView
- 描画処理:バックグラウンドスレッドからも可能
- SurfaceHolderからのコールバックを受け取るためのSurfaceHolder.Callbackをimplementする
- 描画用のスレッド用にRunnableを実装
- surfaceCreatedでThread.start
- 人によってはsurfaceChanged?でnewしてThread.start
- 描画用のスレッド用にRunnableを実装
- アクティビティの手前か奥にしか描画できない
- 実際はWindow
- アプリケーションの裏に新しいWindowを生成する
- アプリケーションの一部に穴を開けて裏のWindowを表示する
- 裏のWindowに描画されたコンテンツなので、意図したとおりに変形させられない
- このため、ListViewやScrollViewで使いづらい
- UIに直接作用するView Propertyが使えない。View#setAlpha()とか
SurfaceHolder
- Surfaceのピクセルを実際にいじったり、Surfaceの変化を監視する人のためのインターフェイス。
- SurfaceView.getHolder()メソッドが用意されていて、そのSurfaceViewのホルダーのインスタンスを取得できる
public MySurfaceView(Context context) { super(context); SurfaceHolder holder = getHolder(); // でもこのタイミングではまだSurfaceの準備ができてない holder.addCallback(this); //new Thread thread = new Thread(); }
- SurfaceHolder.lockCanvas?
- SurfaceHolder.unlockCanvasAndPost?
SurfaceHolder.Callback
- SurfaceViewのコンストラクタでgetHolder?().addCallback?
- surfaceCreated(SurfaceHolder holder) {}
public void surfaceCreated(SurfaceHolder holder) { thread.start(); }
SurfaceViewのrun
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLUE); paint.setStyle(Style.FILL); Canvas canvas = holder.lockCanvas(); canvas.drawColor(Color.BLACK); canvas.drawCircle(100, 200, 50, paint); holder.unlockCanvasAndPost(canvas);
描画
android.graphics.Bitmap
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b);
android.graphics.Paint
android.graphics.Canvas
android.graphics.Color
android.graphics.Picture
RectとかText
- android.graphics.Path
- android.graphics.Rect
- android.graphics.Region?