Android用のプログラムを書いた私の経験





みなさんこんにちは!

この記事では、アニメーションメッセージを送信するためのAndroidプラットフォーム用のプログラムの作成についてお話したいと思います。 それは、プログラミングの深化というよりも、創造の小さな物語に過ぎません。

それは約2か月前でしたが、今は何が書けるかを考えて、需要があり、ユーザーがそれを気に入り、オリジナルであるようにしました。 市場がどれほど雑然としているかを考えると、アイデアを思い付くのは難しいようにさえ思えました。 あらゆる種類のシステムユーティリティ、数百のアニメーション壁紙、カメラ用プログラム、ソーシャルネットワーク用クライアント、ゲーム、さらにはウイルス対策(何らかの理由で大人気です!)もすでにありました。 もちろん、何よりも中国の都市があり、新しい市場の到来で目立たなくなりました。



そのアイデアは突然現れ、私を彼女のサイトlivetyping.ruに押しやった 。 「そして、なぜそうではないのか」と私は考え、それがどのように見えるか、どう書くかについて考え始めました。 サイトに行くのが面倒な人は、ポイントがユーザーがテキストを書くことであると説明します。そして、彼はgifファイルで生成され、すべての変更を含む書き込みプロセスを表示します。 かなりおもしろいことがわかります。メッセージを1つの意味で書いてから、すべてを消去して、まったく逆のことを書くことができます。 一般的に、ユーザーは彼の想像力によってのみ制限されます。

多くのAndroid携帯電話は、組み込みツールを使用してアニメーションGIFを表示する方法を知らないため、誰かがプログラムのアイデアはあまりないと言います。 また、インターネット上のレビューから判断すると、多くのAndroidがこのサポートを欠いているため、一部は正しいでしょう。 しかし、判明したように、ファームウェア2.3.3を搭載した私の電話はこれを行うことができます。これは、将来、メーカーがすべてのデバイスにサポートを追加することを期待して私を刺激しました。 少し楽観的かもしれませんが、 オフィスで。 Androidはgifをデコードできるはずです(ただし、どちらを指定したかはわかりません)。



開発



プログラムコア


最初の問題は、生成されたテキストを元のテキストとまったく同じようにフォーマットする必要があることでした。 次の2つのオプションがありました。



  1. ユーザーが入力したすべてのテキスト、フィールドサイズ、フォントサイズ、色を送信し、GIFを生成してリンクまたはファイル自体を返すサーバーを作成します。
  2. クライアントですべてを生成します。


2番目のオプションはすぐに選択されました。これは、私がWebと友達ではなく、サーバーコストを必要としないためです。

GIFアニメーションを作成するには、最初にすべてのフレームを生成してから、それらをヒープにまとめる必要がありました。 この操作はJavaよりもsiの方が速く動作すると考えて、インターネットを調べて、必要なクラスのソースを見つけました。それをNDKで正常にコンパイルしました。 このクラスでは、Bitmapクラスのインスタンスから取得したピクセルの配列としてフレームを追加し、最後にアニメーションGIFファイルを生成できました。

リンクの例に書かれているように:



static { System.loadLibrary("gifflen"); } .... public native int Init(String gifName, int w, int h, int numColors, int quality, int frameDelay); public native void Close(); public native int AddFrame(int[] inArray); .... // Filename, width, height, colors, quality, frame delay if(Init("/sdcard/foo.gif", width, height, 256, 100, 4) != 0) { Log.e("gifflen", "Init failed"); } int[] pixels = new int[width*height]; // bitmap should be 32-bit ARGB, eg like the ones you get when decoding // a JPEG using BitmapFactory bitmap.getPixels(pixels, 0, width, 0, 0, width, height); // Convert to 256 colors and add to foo.gif AddFrame(pixels); Close();
      
      





次のタスクは、入力したテキストをビットマップでレンダリングする方法を見つけることでした。 Android APIを掘り下げると、StaticLayoutクラスが見つかりました。これにより、キャンバスのペイントを使用してこのテキストを描画できます。キャンバスはビットマップにあります。 すべて次のようになります。



 Canvas canvas = new Canvas(); TextPaint paint = new TextPaint(Paint.LINEAR_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); Bitmap bitmap; paint.setStyle(Paint.Style.FILL); paint.setColor(fontColor); paint.setTextSize((int) (fontSizeDP * mDensityScale + 0.5f)); paint.setAntiAlias(true); paint.setTypeface(font); paint.setTextAlign(Align.LEFT); StaticLayout[] layoutTexts = new StaticLayout[mLiveTypeStringArray.size()]; for(int i = 0; i < layoutTexts.length; i++) { layoutTexts[i] = new StaticLayout(mLiveTypeStringArray.get(i), paint, (int) (gifWidthDP * mDensityScale + 0.5f), Alignment.ALIGN_NORMAL, 1, 1, true); if(gifHeight < layoutTexts[i].getHeight()) gifHeight = layoutTexts[i].getHeight(); } if(gifHeight == 0) return 0; bitmap = Bitmap.createBitmap((int) (gifWidthDP * mDensityScale + 0.5f), gifHeight, Bitmap.Config.RGB_565); canvas.setBitmap(bitmap); for(int i = 0; i < layoutTexts.length; i++) { canvas.drawColor(backColor); layoutTexts[i].draw(canvas); gifEncoder.addFrame(bitmap); }
      
      





いいね! 入力したテキスト、またはその変更のそれぞれが、ビットマップにレンダリングされ、そこからgifファイルが収集されました。

その後、次の問題が発生しました。 gifファイルは巨大でした! 平均して、最大200フレームのGIFは3〜5 MBかかりました。 これは、特にモバイルデバイスから送信する必要がある場合に非常に多くなります。 それから私は、ライブタイピングでそのようなgifがはるかに少ない(30〜50 kb)ので、その結果をどのように達成したかを著者に尋ねました。 答えはGifsicleライブラリで、これはGIFを非常に強力かつ定性的に最適化できました。 同様の結果は、個々のフレームすべてではなく、フレーム間の違いのみが保存されるために達成されました。これは、アニメーションテキストを保存するのに理想的でした。

その後、NDKを使用してGifsicleをAndroidに移植し始めましたが、すぐに正常に終了しました。

気にする人は、ここに私のAndroid.mkです:

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := malloc LOCAL_SRC_FILES := fmalloc.c dmalloc.c LOCAL_ARM_MODE := arm LOCAL_CFLAGS := -DFPM_ARM -ffast-math -O3 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := gifwrite LOCAL_SRC_FILES := ungifwrt.c LOCAL_ARM_MODE := arm LOCAL_CFLAGS := -DFPM_ARM -ffast-math -O3 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := gifopt LOCAL_SRC_FILES := clp.c giffunc.c gifread.c gifunopt.c \ merge.c optimize.c quantize.c support.c xform.c \ gifsicle.c LOCAL_ARM_MODE := arm LOCAL_CFLAGS := -DFPM_ARM -ffast-math -O3 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_LDLIBS := -llog LOCAL_STATIC_LIBRARIES := gifwrite malloc include $(BUILD_SHARED_LIBRARY)
      
      





モバイルデバイスで正しく動作しないことがわかったときの驚きを想像してください。 毎回同じGIFファイルを生成および最適化すると、異なる結果が得られました。 非常に異なり、スプレッドは50kbから2 mbでした。 その後、再びコンパイルを開始し、さまざまなパラメータで再コンパイルし、メモリリークなどを探しました。この現象を説明するものは何でも。 しかし、何も見つかりませんでした。 それで2週間が経ちました。

ある美しい朝、私は、Gifsicleが失敗するのではなく、作者も問題を理解できなかったのではなく、GIFを生成する最初のライブラリ(クラス)であることに気付きました。 最適化をオフにして結果を確認しました。ファイルはほとんど常に同じサイズであり、1〜2kbだけ異なる場合がありました。 奇妙ですが、致命的ではありません。 他の誰かの生のCコードをいじりたくないので、Java MEで同様のライブラリを見つけてAndroidに移植しました。 また、Java MEとAndroid APIの驚くほどの類似性にも気付きました。ほとんど同じ機能がたくさんあります(以前はMEとは取引がありませんでした)。 これですべてが正常になりました。



繰り返しになりますが、標準のImage View'erを使用してAndroidデバイスでGIFファイルを再生するときに最適化すると、ひどい色のグリッチとフレームが消えることがあります。 同時に、コンピューター上で同じファイルが完全に表示されました。 これはすべて、LZWビューアーによる圧縮の不十分なサポートによるもので、Gifsicleソートでは無効になっていると思いました。 ファイルは以前よりも少し占有し始めましたが、今ではすべてが本当に良くなりました。



インターフェース


その瞬間まで、私は約1ヶ月を費やしました。 2か月目は、プログラムインターフェイスを作成する必要がありました。 ダッシュボードを選択した可能性のあるもののうち、ある種のAndroid UIパターンを常に使用したかったのです。 「すべてが既に私たちの前に書かれている」ので、Google IOのソースコードをダウンロードし、そこからコードを取得しました。 次のようになりました。





新しいメッセージを書くためのウィンドウは次のようになりました。



書かれたアニメーションメッセージを表示したり、gifアニメーションとして生成したりできます。その後、「共有」ボタンが表示され、電子メール、mms、twitterなどで送信できます。



ダイヤル用のフィールドの高さは、さまざまな画面でキーボードがカバーしないように選択されました。 キーボードが多くのスペースを占有するため、最小の画面は禁止されました。 もちろん、画面のサイズに応じて高さを作成することもできますが、それは怠lazになりました。



次に、標準のPreferenceActivityクラスに基づいて設定が行われました。





同様に私の投稿のリスト。

バイナリ形式のテキスト(フレーム)の配列のみがメモリカードに保存されます。 メッセージを表示する場合、最初に設定(フォントの色とサイズ、背景色、アニメーション速度)を変更することにより、メッセージを再生成できます。



結果



最初は、無料と有料の2つのバージョンが計画されていました。 現在は無料でのみ利用可能で、約20日間市場に出回っています。 有料版では、より多くのフォント、より多くのフォントと背景色、より多くのフレーム制限が計画されました-500(現在140)。 しかし、残念なことに、無料版の成功にはまだ多くのことが望まれています。合計で583のインストールがあり、そのうち227がアクティブです。つまり、ダウンロードされたものの半分以上がすでに削除されています。 どうやらアイデアは乗りませんでした=)

そのため、プログラムの開発は中断されており、継続する可能性は低いです。



それだけです、ご清聴ありがとうございました! コメントであなたの質問に答えます。 また、エラーの可能性についても謝罪します。



更新:外国のサイトに関するいくつかのミニレビュー:

www.androidapplog.com/2011/09/android-app-reviews/animado-animated-messaging-app-review

www.addictivetips.com/mobile/animado-for-android-share-animated-text-messages-as-gif-files



ここで気にする人は市場へのリンクです。








All Articles