1月 28

すっかりご無沙汰しています。

最近、弊社では Android アプリ開発より iOS アプリ開発にすっかり重心が移っています。
そんな弊社で唯一マーケットに公開されている『めざましアラーム Classic』ですが、
Appliv(アプリヴ) さんに紹介していただきました。

Appliv(アプリヴ) -iPhoneアプリが探せる、見つかる

めざましアラーム Classic は、レトロなアナログ操作のめざまし時計です。
音とデザインにこだわったシンプル操作で、直感的にご使用になれます。
iPhone向けだけではなく Android 向けにも用意しています。
試して見てくださいね。

Android版

iPhone版


Posted by sak+

8月 08


おはようございます、Selphyです。
前回のエントリーでは、テクスチャーを使った簡単なサンプルを説明しました。

最後のサンプルでは、カルーセルの基本形を作ります。

RS内で使用している型やメソッドなどについては、RenderScriptのReference に記載されているので、そちらをご覧ください。

完成形のスクリーンショット

完成したアプリのスクリーンショット


ファイル構成

今までは RSHelloWorld を使っていましたが、新しいプロジェクトを作成します。

完成したアプリのスクリーンショット


コード

MainActivity.javaMainTextureView.javamain.xmlは前回のプロジェクトと大きく変わっていません。
プロジェクトが変わったことによるパッケージ名の修正程度なので省きます。

  • SampleScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    protected SampleScript(RenderScriptGL rs, Resources res) {
        script = new ScriptC_SampleScript(rs, res, R.raw.samplescript);
       
        // 構造体の初期化
        //  構造体内部にrs_allocationがあるので、そこにテクスチャーを設定する。
        ScriptField_RS_Droid droids = new ScriptField_RS_Droid(rs, MODEL_COUNT, Allocation.USAGE_GRAPHICS_TEXTURE);
        for (int i=0; i<MODEL_COUNT; i++) {
            ScriptField_RS_Droid.Item droid = new ScriptField_RS_Droid.Item();
            droid.texture = Allocation.createFromBitmap(rs, BitmapFactory.decodeResource(res, textureIds[i]));
            droids.set(droid, i, true);
        }
        script.bind_gDroids(droids);
       
        // ProgramStore
        //  Alpha値を有効にする。
        progStoreBlendAlpha = ProgramStore.BLEND_ALPHA_DEPTH_TEST(rs);
        script.set_gProgStoreBlendAlpha(progStoreBlendAlpha);
       
        // テクスチャー用のFragment
        //  Samplerを設定してテクスチャーのジャギーを目立たなくする。
        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(rs);
        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
        progFragmentTexture = texBuilder.create();
        progFragmentTexture.bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
        script.set_gProgFragmentTexture(progFragmentTexture);
       
        // Raster
        //  テクスチャーの表裏を描画する。
        script.set_gCullNone(ProgramRaster.CULL_NONE(rs));
       
        rs.bindRootScript(script);
    }

    Step3で構造体を扱ったので、ここでは復習のためにテクスチャーを構造体で用意しました。
    コード内にコメントもあるので、特に説明はありません。
    また、実際には、タッチイベントを RS に通知するためのメソッドもありますが、いままでのサンプルコードと同じ部分なので省いています。

  • SampleScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    int32_t root() {
        rsgClearColor(0.0f, 0.0f, 0.0f, 1.0f);      // RGBA
        rsgClearDepth(1.0f);
       
        // プロジェクション設定
        rs_matrix4x4 proj;
        rsMatrixLoadPerspective(&proj, 30.0f, (float) rsgGetWidth() / (float) rsgGetHeight(), 0.01f, 1000.0f);
        rsgProgramVertexLoadProjectionMatrix(&proj);
       
        rsgBindProgramStore(gProgStoreBlendAlpha);
        rsgBindProgramFragment(gProgFragmentTexture);
       
        // モデル座標の回転を計算
        if (gSwipePoint.x != 0) {
            gRotX += gSwipePoint.x * 0.5f;
            gSwipePoint.xy = 0;
            if (gRotX > 360 || gRotX < -360)
                gRotX %= 360;
        }
       
        // モデル座標
        rs_matrix4x4 matrix;
        rsMatrixLoadIdentity(&matrix);
        rsMatrixLoadTranslate(&matrix, 0, 0, -500);
        rsMatrixRotate(&matrix, 30, 1, 0, 0);
        rsMatrixRotate(&matrix, gRotX, 0, 1, 0);
        rsgProgramVertexLoadModelMatrix(&matrix);
       
        float x, y, z, minX, minY, maxX, maxY;
       
        rsgBindProgramRaster(gCullNone);
       
        // テクスチャー描画
        for (int32_t i=0; i<MODEL_COUNT; i++) {
            RS_Droid_t droid = gDroids[i];
            float rad = VALUE_DOUBLE_PI * (float) i / (float) MODEL_COUNT;
            x = 50 * sin(rad);
            y = 0;
            z = 50 * cos(rad);
           
            minX = z * sin(rad - VALUE_DOUBLE_PI) + x * cos(rad - VALUE_DOUBLE_PI) - 25;
            maxX = minX + 50;
            minY = y - 25;
            maxY = minY + 50;
            z = z * cos(rad - VALUE_DOUBLE_PI) - x * sin(rad - VALUE_DOUBLE_PI);
           
            rsgBindTexture(gProgFragmentTexture, 0, droid.texture);
            rsgDrawQuadTexCoords(minX, maxY, z, 0.f, 0.f,
                                 minX, minY, z, 0.f, 1.f,
                                 maxX, minY, z, 1.f, 1.f,
                                 maxX, maxY, z, 1.f, 0.f);  
        }
       
        // 20fps
        return 50;
    }

     プロジェクションでは、3Dモデルが描画される際のパースペクティブに関わる値を設定しています。
    どういうことかというと、3Dモデルをカメラで撮影して、その映像が描画されているとすると、カメラの視野角、アスペクト比、どこまで遠くまで撮影できるかという設定です。
     モデル座標については、 rsgProgramVertexLoadModelMatrix というメソッド名だったのでモデル座標ということにしましたが、このサンプルでは、ワールド座標として扱っています。
    これが何かというと、3Dモデルが描画される空間の座標系だと思ってください。
     最後にテクスチャーを描画するための座標が出てきますが、今回のサンプルでは、個々のテクスチャーをモデルとして扱っているので、テクスチャーの描画座標がモデル座標という感覚で扱っています。
     このあたりの知識は3D描画の基本なので、詳細な説明は省きます。

サンプルでは、モデルが常に同一方向を向き、x軸方向のスワイプにのみ動くようにしました。
2自由度でモデルを動かしたい場合には、クォータニオンによる計算をおすすめします。
常に正面を向かせたい場合、テクスチャーの描画座標を三角関数で計算してください。
また、モデルの動きに慣性を与えるとUXが向上するので試してみてください。

サンプルは Google Code で公開しています。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.



Posted by selphy

Tagged with:
7月 31


おはようございます、Selphyです。
前回のエントリーでは、 構造体 を使った簡単なサンプルを説明しました。

今回は、テクスチャーを使ってみます。

RS内で使用している型やメソッドなどについては、RenderScriptのReference に記載されているので、そちらをご覧ください。

完成形のスクリーンショット

完成したアプリのスクリーンショット


ファイル構成

プロジェクトは、前回のものを使うので、特に変更はありません。

コード

改造したファイルのみ載せます。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
        script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
       
        texture = Allocation.createFromBitmapResource(rs, res, R.drawable.droid_yellow);
        script.set_texture(texture);

        progStoreBlendAlpha = ProgramStore.BLEND_ALPHA_DEPTH_TEST(rs);
        script.set_gProgStoreBlendAlpha(progStoreBlendAlpha);

        ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(rs);
        texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
        progFragmentTexture = texBuilder.create();
        progFragmentTexture.bindSampler(Sampler.CLAMP_LINEAR(rs), 0);
        script.set_gProgFragmentTexture(progFragmentTexture);

        cullNone = ProgramRaster.CULL_NONE(rs);
        script.set_gCullNone(cullNone);
       
        rs.bindRootScript(script);
    }

    テクスチャーは、文字列と同様に、Allocationでメモリの確保を行います。
    そのため、テクスチャー自体のメモリ確保は簡単です。
    しかし、テクスチャーを表示するだけで、ProgramStoreや、ProgramFragmentFixedFunctionなどが必要となってくるため、文字列の描画に比べて難しそうな印象を受けるかもしれません。
    やっていることは、2DイメージのAlpha値を有効にしたり (7,8行目) 、ジャギーを軽減したり (13行目) 、カリング処理を施したり (16,17行目) といった作業なので、実際には、必要不可欠な行ではなく、テクスチャーの描画クォリティを上げるための行が多いです。

  • HelloWorldScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       
        rsgBindProgramStore(gProgStoreBlendAlpha);
        rsgBindProgramFragment(gProgFragmentTexture);
        rsgBindProgramRaster(gCullNone);
       
        float minX = gTouch.x;
        float maxX = minX + 100;
        float minY = gTouch.y;
        float maxY = minY + 100;
       
        rsgBindTexture(gProgFragmentTexture, 0, texture);
        rsgDrawQuadTexCoords(minX, minY, 0, 0.f, 0.f,
                             minX, maxY, 0, 0.f, 1.f,
                             maxX, maxY, 0, 1.f, 1.f,
                             maxX, minY, 0, 1.f, 0.f);  
       
        // 20fps
        return 50;
    }

    14行目でバインドしたテクスチャーデータを15行目で描画しているだけです。


RSで自動生成されるもの

今回、新たに自動生成されたクラスはありません。


今回のサンプルは Google Code で公開しています。
次回は、この連載の最初にスクリーンショットで紹介したカルーセルの基本となるサンプルを説明します。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.



Posted by selphy

Tagged with:
7月 25


おはようございます、Selphyです。
前回のエントリーでは、Hello World を説明しました。

今回は、前回のサンプルを少し改造して、 構造体 を扱ってみます。
RS内で使用している型やメソッドなどについては、RenderScriptのReferenceに記載されているので、そちらをご覧ください。

ファイル構成

プロジェクトは、前回のものを使うので、特に変更はありません。

コード

改造したファイルのみ載せます。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
            script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
           
            // -------------- 構造体の初期化 ------------------
            int length = COLORS.length;
            texts = new ScriptField_RS_Text(rs, length, Allocation.USAGE_SCRIPT);
            for (int i=0; i<length; i++) {
                ScriptField_RS_Text.Item item = new ScriptField_RS_Text.Item();
                item.text = Allocation.createFromString(rs, "HelloWorld", Allocation.USAGE_SCRIPT);
                ColorRGB color = COLORS[i];
                item.red = color.red;
                item.green = color.green;
                item.blue = color.blue;
               
                // 容器(.rsで定義した*gTexts)にアイテムを格納する感覚です。
                texts.set(item, i, true);
            }
            script.bind_gTexts(texts);
           
            font = Font.create(rs, res, "fantasy", Font.Style.NORMAL, 20);
            script.set_gFont(font);
           
            rs.bindRootScript(script);
        }

    ScriptField_RS_Text というクラスがあります。
    これがHelloWorldScript.rsで定義した構造体で、このクラスは自動生成されます。
    ScriptField_RS_Textのインスタンスに、 ScriptField_RS_Text.Item というサブクラスのインスタンスをセットすることにより、HelloWorldScript.rsファイルでデータを扱うことができるようになります。

  • HelloWorldScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33

    typedef struct RS_Text {
        rs_allocation text;
        float red;
        float green;
        float blue;
    } RS_Text_t;
    RS_Text_t *gTexts;



    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       
        int32_t left = 0;
        int32_t right = 0;
        int32_t top = 0;
        int32_t bottom = 0;
       
        int32_t size = rsAllocationGetDimX(rsGetAllocation(gTexts));
        for (int32_t i=0; i<size; i++) {
            rsgFontColor(gTexts[i].red, gTexts[i].green, gTexts[i].blue, 1.0f);
            rsgBindFont(gFont);
            rsgMeasureText(gTexts[i].text, &left, &right, &top, &bottom);
           
            // 5 * i で文字列の表示位置を少しだけずらしています。
            int32_t x = gTouch.x - (right - left) * 0.5f + 5 * i;
            int32_t y = gTouch.y - (bottom - top) * 0.5f + 5 * i;
            rsgDrawText(gTexts[i].text, x, y);
        }
       
        return 0;
    }

    8行目に、 *gTexts; とあります。
    この場合、Javaからデータを渡すときには、他の変数と違い
    script.bind_gText(ScriptField_RS_Text) というメソッドを使います。
    21行目のfor文では、構造体のデータに保持されているテキストデータとカラーデータを使って描画しています。


RSで自動生成されるもの

今回新たに出てきたもののみを記載します。

  • ScriptField_xxx.java
  • .rsファイルでxxxという名前の構造体を定義すると自動生成されます。



今回のサンプルは Google Code で公開しています。
次回は、テクスチャーを使ったサンプルを考えてます。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.



Posted by selphy

Tagged with:
7月 19


前回のエントリーは メリットとデメリット についてでした。

今回は、イベント処理を含めた HalloWorld について説明します。
RS内で使用している型やメソッドなどについては、RenderScriptのReferenceに記載されているので、そちらをご覧ください。

ファイル構成

プロジェクト内は以下のようになっています。



drawableには、アプリアイコンしか入っていません。
strings.xmlは、アプリ名の要素しか定義していません。
rawhelloworldscript.bcは、自動生成されます。

コード

  • MainActivity.java
  • 1
    2
    3
    4
    5
    6
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            texture = (MainTextureView) findViewById(R.id.texture);
        }

    layout.xmlを設定しているだけです。

  • MainTextureView.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
        public MainTextureView(Context context, AttributeSet attrs) {
            super(context, attrs);
            if (rs == null) {
                RenderScriptGL.SurfaceConfig config = new RenderScriptGL.SurfaceConfig();
                rs = createRenderScriptGL(config);
            }
            if (script == null)
                script = new HelloWorldScript(rs, context.getApplicationContext(), getResources());
        }

    RSTextureViewからRenderScriptGLを生成します。
    Android 4.0 (APILevel 14)以下のときは、RSSurfaceViewを使ってください。
    使い方は、ほとんど同じです。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
            script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
           
            text = Allocation.createFromString(rs, "Hello World", Allocation.USAGE_SCRIPT);
            font = Font.create(rs, res, "fantasy", Font.Style.NORMAL, 20);
            script.set_gFont(font);
            script.set_gText(text);
           
            rs.bindRootScript(script);
        }
       
        protected void touchEvent(float x, float y) {
            script.invoke_setTouchPosition(new Float2(x, y));
        }

    このクラスについても、今の段階では悩むところは無いと思います。
    なぜ、このクラスをつくったかというと、RSとJavaのアクセス部分は別にしておいた方が可読性が高くなるためです。
    とくに気にしないのであれば、MainTextureView.javaに含めても良いでしょう。
    唯一、注目して欲しいところは4行目で、Stringに必要なメモリ領域をAllocationとして確保している部分です。
    charで文字を渡しても良いのですが、Allocationを使ったほうが楽です。

  • HelloWorldScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #pragma rs java_package_name(jp.kiroru_inc.rs_hello_world)

    #include "rs_graphics.rsh"

    rs_allocation gText;
    rs_font gFont;
    float2 gTouch;

    void setTouchPosition(float2 pos) {
        gTouch = pos;
    }

    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        rsgFontColor(0.8f, 0.3f, 0.2f, 1.0f);
       
        int32_t left = 0;
        int32_t right = 0;
        int32_t top = 0;
        int32_t bottom = 0;
        rsgBindFont(gFont);
        rsgMeasureText(gText, &left, &right, &top, &bottom);
       
        int32_t x = gTouch.x - (right - left) * 0.5f;
        int32_t y = gTouch.y - (bottom - top) * 0.5f;
        rsgDrawText(gText, x, y);
       
        return 0;
    }

    1行目のjava_package_nameは、自動生成されるリソースの展開先です。
    ここで指定したパッケージ名として、genフォルダ直下にScriptC_HelloWorldScript.java (ScriptC_xxx.java: xxxは.rsのファイル名)などが作成されます。
    JavaからRSファイルに定義したメソッドや変数にアクセスするためには、この自動生成されたクラスを介して行います。
    13行目のinit32_t root()がメインループになる部分です。
    メソッド内の最後のreturn 0;ですが、この値が再描画の更新間隔になります。
    今回は、0を返しているので、タッチイベントが発生したときにシステムが自動的に再描画してくれます。
    例えば、50を返すと、20fpsで描画されます。


RSで自動生成されるもの

Javaから呼び出すものについてまとめました。
直接呼び出さないものについては記載していません。

※ scriptは.javaで定義した変数です。

  • xxx.bc
  • xxx.rsを作成するとres/rawに作成されます。
    私は、過去にこのファイルをEclipseで開こうとしたとき、Eclipseが落ちたので開かないほうが良いです。
    今も落ちるのかどうかはわかりません。

  • ScriptC_xxx.java
  • xxx.rsを作成すると自動生成されます。

  • script.set_xxx
  • xxx.rs内で定義したグローバル変数へのアクセサメソッドです。

  • script.invoke_aaaaa
  • xxx.rs内で定義したaaaaaというメソッドへのアクセサメソッドです。

他にも自動生成されるものはありますが、今回のサンプルで出てきていないものについては省きました。
それらについては、随時説明していきます。


今回のサンプルは Google Code で公開しています。
次回は、構造体を使ったサンプルを考えてます。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.



Posted by selphy

Tagged with:
7月 13


積極的に使っている人がまだ少ないと思われる RenderScript (以下、RS) について、数回に分けて説明していきます。

最終的には、以下のイメージに示すアプリが完成します。

完成したアプリのスクリーンショット



このアプリは、横にスワイプすると、メリーゴーランドのように、同一円周上に配置されたモデルが円に沿って回転します。
カルーセルの基本形とも言えるので、これを改造すれば魅力的なUIを作ることも可能です。



まず、このエントリーでは、メリットとデメリットについて説明します。

メリット

  • 描画処理が早い
  • Java側でCanvasを使った描画をするより早いです。
    パフォーマンスについては、 Developers Blogの下の方に書いてあります。
    それによると、DalvikよりもRSの方が3倍以上早いという結果が出たようです。

  • Javaとの連携がしやすい (個人的な見解)
  • なぜかというと、RSで定義した変数やメソッドにアクセスするためのクラスが、自動的に生成されるためです。
    あまり、細かいことを考えずに使えるので、私個人としては連携がしやすいと思っています。

  • アーキテクチャに依存しない
  • RS専用のランタイムで動作するので、例えばx86搭載端末が発売されても大丈夫というニュアンスの一文が公式の資料の記載されています。


デメリット

  • 開発環境が十分ではない (2012/07/03時点)
  • メモ帳でプログラミングすることに抵抗がなければ問題ありませんが、補完がないので、APIを覚えるまでは少し面倒です。

  • デバッグが難しい
  • JavaでNullPointerExceptionなどを発生させると、LogCatで行数まで表示してくれますが、RSだとそのような出力はされないので、大規模なRSになってくると大変です。


資料

このエントリーで参考にした資料です。



次回は、イベント処理を含めた HalloWorld の説明を予定しています。


Posted by selphy

Tagged with:
7月 10


はじめまして、Selphyです。
週末は、製菓学校の学生をやっています。
よろしくお願いします。

 最初のエントリーでは、 Android™アプリケーション技術者認定試験ベーシック の資格について私の思うところを書こうと思います。

 試験が開始されたのが2010年11月29日で、私が合格したのが2011年2月の第1週くらいです。
 当時、この資格を就活で利用していた人は何人いたんですかね。
 私は履歴書にもこの試験について書いたのですが、まだ試験の知名度がなかったため、恩恵がなかったです。
 開始されて数ヶ月しか経っていなかったので、仕方ないですけどね…
 もし恩恵を受けた方がいるのであれば羨ましいです。
 今後、この資格を持った就活生のためにも、この試験の知名度がより高くなればと願います。

Android™アプリケーション技術者認定試験ベーシック
※ 合格者はロゴを使用しても良いとのことですので使用しました。





Posted by selphy

7月 06

ずっと私(sak+)ひとりで書いてきたブログですが、『Kiroru Pfficial Blog』へとリニューアルもした事ですし、ライターを追加します。

ライターは当社社員でもある selphy くんです。今年、大学院を卒業したばかりの若者ですが、Android の経験は豊富です。OESFの認定資格である OESF Authorized Certification Engineer for Android(通称:ACE)なんかも持っています。彼は現在、当社の従事しながら週末は製菓学校に通うという二足わらじの生活を送っています。なんでもプログラムの書けるパティシエになりたいとか (^^;

そんな彼がメインで作った当社の最新作がこれ『Photo Visualizer』です。このアプリは Android 3.0 で採用された RenderScript を採用した フォトフレームアプリケーション です。Android 4.0.3 (API Level 15) 以降の Android スマホ/タブレットで動作します。

百聞は一見にしかず「デモ・ムービー」をご覧ください。

PhotoVisualizer は2つの表示モード CoolRotation を持ちます。前者は1枚の画像を見方を変えた4種類の方法で表示します。後者はメリーゴーランドのように回りながら画像を表示させます。

こんな魅力的な RenderScript ですが技術情報が非常に少ないです。次回以降、新ライターの selphy くんによる RenderScript のプログラミング解説が始まります。お楽しみに (^^)/


Posted by sak+

7月 04

前回の 「Stack Dialer』 に続き、当社アプリの紹介です。

キロル・スマートメニューとは?

レストランやカフェに置いてある『メニューブック』が Android タブレットアプリケーションになりました。

キロル・スマートメニューを使えば『メニューブック』を見る部分だけでなく、作成する部分も、PCやデジカメを使わずに Android タブレットだけで実現できます。

百聞は一見にしかず。デモ・ムービーを作成したのでまずはご覧ください。

デモ・ムービー

キロル・スマートメニュー・ビューアー

メニューを『見る』アプリケーションです。

Google Play でダウンロード

キロル・スマートメニュー・クリエーター

メニューを『作る』アプリケーションです。

Google Play でダウンロード

詳しい情報

詳しくは こちらのサイト をご覧ください。


Posted by sak+

6月 28
日本時間で本日早朝に Android の新バージョンである Android 4.1 (Jelly Bean) が発表されました。しかし国内を見渡せば世の中まだまだ Android 2.x 搭載機種が全盛です。
そんな中、本日 Android 4.0 (Ice Cream Sandwich) 搭載機種 GALAXY SIII SC-06D がようやく本日ドコモから発売開始です。
この機種を皮切りにこの夏モデルでは Android 4.0 搭載機種が続々とリリースされていきます。

そんな Android 4.0 搭載機種を入手したあなたにお勧めのアプリがこちらです。 (^^

Android 4.0 の最新機能搭載のアプリケーション『Stack Dialer』


stackdialer-640.png

『Stack Dialer』は、Android 4.0 から搭載された新機能、Stack Widget を採用し、電話/Eメール/SMS の利用を簡単にするウィジェットアプリケーションです。

予め相手を登録しておくだけでホーム画面上から一発で電話発信/メーラー起動/SMS起動ができます。

アプリは基本無料でご利用できます。Android 4.x 搭載機種を入手したあなた。是非、お試しくださいね!

※ Android 4.0 専用となっていますが、Android 4.1 でも動きます。多分 (^^;


Posted by sak+

preload preload preload