@blog.justoneplanet.info

日々勉強

Android 4.0のグラフィックとアニメーション

原文はこちらです。結構適当に訳してますので間違いがあれば指摘していただけると助かります。

■ハードウェアアクセラレーションの有効化

android 4.0ではデフォルトでハードウェアアクセラレーションがONになった。4.0よりも低いレベルでは「android:hardwareAccelerated=”true”」をAndroidManifest.xmlの<application>タグに加えることでONにできる。

もっと2Dのレンダリングパイプラインを学びたいならオフィシャル開発ガイドを見るように。このガイドは様々なレベルでハードウェアアクセラレーションをコントロールする方法を説明し、様々なパフォーマンスチップスやトリックを提供、新しい描画モデルの詳細を説明している。

Google I/O 2011 の Androidハードウェアアクセラレーションを見るのがおすすめ。

■TextureViewについて

今日、OpenGLや動画コンテンツを必要とするアプリケーションはSurfaceViewを呼び出した特別なUI要素に頼っている。このウィジェットはアプリケーションのウィンドウの後方に配置された新しいウィンドウを作ることによって動作する。新しいウィンドウを見せるためにアプリケーションのウィンドウ全体に穴を開ける。このアプローチは(アプリケーションウィンドウの再描画なしに新しいウィンドウのコンテンツがリフレッシュされる)とても効率的な一方、幾つかの重大な制限に苦しむ。

SurfaceViewのコンテンツはアプリケーションのウィンドウでは生きていないので効率的に(移動・リサイズ・回転)変形できない。これはListViewやScrollViewの内部でSurfaceViewを使うことを難しくさせる。SurfaceViewも退色した輪郭やView.setAlpha()(で半透明になったView)のようなUI toolkitと上手く相互作用できない。

これらの問題を解決するために、android 4.0はハードウェアアクセラレーションされた2DレンダリングパイプラインとSurfaceTextureによるTextureViewと呼ばれる新しいウィジェットを導入した。TextureViewはSurfaceViewと同じ能力を提供するが通常のViewと同じように振る舞う。例えばOpenGLを表示したり動画ストリームを表示したりできる。

下述のコードはカメラから動画のプレビューを表示するためにTextureViewを作っている。TextureViewは45度回転し半梅井になっている。(コードはそのまま引用)

public class TextureViewActivity extends Activity implements TextureView.SurfaceTextureListener {
    private Camera mCamera;
    private TextureView mTextureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mTextureView = new TextureView(this);
        mTextureView.setSurfaceTextureListener(this);

        setContentView(mTextureView);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        mCamera = Camera.open();

        Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
        mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
                previewSize.width, previewSize.height, Gravity.CENTER));

        try {
            mCamera.setPreviewTexture(surface);
        } catch (IOException t) {
        }

        mCamera.startPreview();
        
        mTextureView.setAlpha(0.5f);
        mTextureView.setRotation(45.0f);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // Ignored, the Camera does all the work for us
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        mCamera.stopPreview();
        mCamera.release();
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // Called whenever a new frame is available and displayed in the TextureView
    }
}

アニメーション

まず、もしも3.0と3.1で加えられたandroid.animationパッケージとクラスを見たことがないならば、Animation in HoneycombIntroducing ViewPropertyAnimatorを読むといいかもしれない。 これらの記事はandroidでアニメーションを簡単にパワフルでフレキシブルにする3.0で追加されたAPIを説明する。下述で説明されているAndroid 4.0の進化はこれらのコアの機能に小さな追加をしたものである。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment