1

ユーザーが1ピクセルの精度でシングルタッチデバイスを使用してキャンバスに「書き込む」ことができるモバイルアプリ(Android)を作成しています。アプリは、およそ標準的な 8 1/2" x 11" サイズのタブレット デバイスで実行されます。私の戦略は、「テキスト」をベクトル データとして保存することです。入力デバイスの各ストロークは、基本的に、始点、終点、およびテキストの形状を定義するのに役立ついくつかの中間点で構成されるベクトルになります。ベクトル (タッチ移動時にタッチスクリーン/OS によって生成されます)。これにより、ストロークが配置された順序を追跡し(元に戻すなどをサポートするため)、このテキストのサイズを変更したり、他のベクターグラフィックスと同様に柔軟にすることができます。

ただし、非常に正確な入力デバイスと、標準の紙のメモ帳を 1 対 1 でエミュレートできる大画面を使用して、非常に大まかな封筒計算を行うと、1 ページ全体で最大 1,700 ストロークになることになります。文章。最悪の場合、各ストロークは最大 20 ~ 30 個の個別のポイント (ストロークのピクセルごとにポイント) で構成される可能性があり、これはページあたり最大 50,000 データ ポイントを意味します... SQLite には大きすぎますページがリロードされ、ベクター ストロークが再作成されているときに信頼性を期待して処理するための /Android (SQLite db から 50,000 以上の結果を取得すると、 CursorWindowの制限である 1Mb を超えると想像する必要があります) 。

データ取得を複数のクエリに分割したり、開始、終了、またはその他の中間ピクセルから X ピクセルを超える場合にストローク ベクター形状を定義するのに役立つ中間点のみを追加するようにストローク データを変更できることはわかっています。 、しかし、この戦略を根本から再考する必要があるかどうか疑問に思っています...

より効率的な方法でこの問題に取り組む方法について何か提案はありますか?

ありがとう!

ポール

4

2 に答える 2

0

そもそもベクターデータを使用する理由はありますか? 他の要件を知らなくても、データをラスター/ビットマップに保存し、PNG / zip / djvuなどの通常の圧縮方法で圧縮するだけでよいようです(または、パフォーマンスが低下する場合は、ランレングスエンコーディングなどの単純なもの/RLE)。

編集:申し訳ありませんが、質問を明確に読んでいませんでした。ただし、「元に戻す」や「サイズ変更」などの操作のみが必要な場合は、ストロークごとにビットマップのスナップショットを作成できます (もちろん、変更する領域のスナップショットを作成するだけで済みます)。

また、(実際の) ベクター画像が読み込まれるのを待っている間に、最初にスナップショット ビットマップを表示するハイブリッド アプローチを取ることも可能です。

さらに、私はアンドロイドのカーソル制限についてよく知りませんが、SQL クエリはいつでも書き直して結果を分割することができます (LIMIT... OFFSET を使用)。

于 2011-02-06T06:38:51.790 に答える
0

私は今のところ使用しているソリューションですが、それ以上の提案は受け付けています!

  1. SVG パスを Android パスに変換できるキャンバス ビューを作成し、モーション イベントをインターセプトして Android パスに変換し、SVG パスとして保存することもできます。
  2. onDraw() で画面への Android パスを表示する
  3. SVG パスを .svg ファイルに書き出します

ポール

于 2011-02-07T20:09:17.900 に答える