0

の関数RoundRectShapeで描画される があります。ViewonDraw()

この形状の角は、オーバーライドされたonTouchEvent関数 (invalidate()への呼び出しを強制するために呼び出されますonDraw()) を介して、このビューでのドラッグ アクションによって変更されます。

で変数を初期化するときに、Eclipse は、描画/レイアウト操作中にオブジェクトの割り当てを回避する (代わりに事前に割り当てて再利用する)onDrawという警告を表示します。

この問題は次のように説明されています。

描画またはレイアウト操作中にオブジェクトを割り当てることは避けてください。これらは頻繁に呼び出されるため、スムーズな UI は、オブジェクトの割り当てによって発生するガベージ コレクションの一時停止によって中断される可能性があります。

これが一般的に処理される方法は、オブジェクトを前もって割り当て、描画操作ごとに再利用することです。

これを行うには、明らかに、コンストラクターで設定されている角の半径を変更できる必要があります。RoundedRectShapeクラスにはセッターがありません (関連するメンバー変数にアクセスできないことは確かです)。

これが小さなオブジェクトで小さな問題であることはわかっていますが、角の丸みの半径を設定するためにクラスが提供する唯一の方法がコンストラクターを使用する場合、オブジェクトを再初期化せずにこれらの角を変更するにはどうすればよいでしょうか?

それとも、これは最善を尽くすことを、可能なことを行うことに置き換えなければならない場合にすぎませんか?

ありがとう、

PSメソッドでコンストラクターを呼び出すと、警告は削除されますが、とにかく毎回呼び出されるonTouchEvent()ため、何も達成されませんonDraw()invalidate()

4

1 に答える 1

1

使う必要は全くないと思いますRoundRectShapeRoundRectShapeは不変であるため、その値を変更する唯一の方法はリフレクションを使用することです。Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint)を使用せずにメソッドを直接呼び出すことで、同じ描画を簡単に実現できますRoundRectShapeRoundRectShape または、実装を見て、そのコードをonDraw()メソッドで使用することもできます。

編集:RoundRectShape正しい方法ではなく、実装を検討しているという コメントは正しかった。実装をたどると、次の呼び出しが見つかりました。

mPath.addRoundedRect() 

入力としてコーナー半径のフロートを許可するバリエーションがあります ( Path.addRoundRect )

質問に答える際に:

形状の代わりにパスを変数として使用し、必要に応じて新しい角丸長方形をパスに描画します

于 2012-07-15T11:57:23.347 に答える