2011-07-12 16 views
0

私は、ユーザーが指で描くことができるアンドロイドの描画アプリケーションを持っていて、その結果の形状をAndroid Pathとして保存します。ユーザは、彼らが描かれている個々Path Sを削除することを可能にするために、私は、各Pathの境界Rectを使用し、その後、境界Rect内の画素を表現するために、内側マルチ次元バイナリアレイを使用this solutionを実装しています。次に、Pathのコントロールポイントを取得し、2次ベジェ曲線の数式を使用して配列を作成し、その下のピクセルが1になる配列の各要素を1に設定します。Androidのパスの衝突の問題/ソリューション

上記の設定を使用して、消去モードでは、まずユーザの指と境界線Rectとの衝突をチェックし、衝突した場合は、ユーザがタッチしているピクセルがアレイの1に設定されているかどうかを確認します。

ユーザーがメモを読み込んだとき、すべての図形を「ストローク」オブジェクトのArrayListにロードして、簡単に表示でき、消去モードのときに衝突をチェックすることができます。 Rectとバイナリ配列をカスタムオブジェクトのストロークと共に保存します。すべてが予想どおりに動作していますが、このデータのすべてを格納するメモリフットプリント、具体的には各パスの境界のバイナリ配列Rectは高価になります。ユーザーが多数のストロークを持つ場合、java.lang.OutOfMemoryError私のコードは、各ストロークの配列を作成しています。

これを達成するためのより良い方法についてのご意見はありますか?基本的には、2つのAndroid Path(描画パスと、消去モードのときにユーザーが作成するパス)の衝突を判断しようとしていますが、理論上は上記のように動作しますが、実際には実現できません。

おかげで、

ポール

答えて

0

"バイナリ配列" の実際の表現とは何ですか?私はあなたが格納する必要がある実際のデータを反映するために表現を微調整すると思います(例えば、RLEはビットをエンコードします:このxとzピクセルから始まるこのyでは、あなたは余分なサイズなしで必要なものを保存できます)。

ピクセル単位で1バイト、または8ピクセル単位で実際のバイト配列を格納することは、この用途には必要ありません。

もう1つの方法は、ビットマップを格納することではなく、コントロールポイントとバウンディングボックスのみを格納することです。タッチが境界ボックスと交差する場合、コントロールポイントからオンザフライでビットマップを計算します。

+0

表現はビットマップの表現であるため、配列の型はint型で、rect_width、rect_heightのサイズを持ちます。うーん、その場でビットマップを計算することを考えたが、パフォーマンスの観点からは高すぎるかもしれないと思った(明らかに選択肢がないかもしれないが)。 RLEも動作する可能性がありますので、基本的には、パスのRLE命令を保存していました。ポイントXが検出されたら、Yがパスにヒットすると、RLEに沿ってトレースしますか? –

+0

@Paul - RLEにはいくつかのオプションがあります。 (x、run_length)オブジェクト(それはベジェ曲線なので、各yに2つの最大値があると思います...) – antlersoft