クリッピング長方形の境界の外側で描画を実行できるグラフィックス環境で記述されたアプリを移植しています。 Androidでこれを行う方法はありますか?
境界の外側に描画するには、キャンバスのclipRectを展開する必要があります。
CanvasクラスのオーバーロードされたclipRectメソッドを確認してください。
注-デフォルトの操作はINTERSECTであるため、Region操作を指定する必要があります。だからこのようなもの:
Rect newRect = canvas.getClipBounds();
newRect.inset(-5, -5) //make the rect larger
canvas.clipRect (newRect, Region.Op.REPLACE);
//happily draw outside the bound now
設定してみてください
Android:clipChildren="false"
親ビューへ
好きな場所に描くことができますが、クリッピング長方形の外側には何も保存されません。
@numanの答えはほぼ問題ありません。問題はそのアプローチでのメモリ割り当てであるため、代わりにこれを行う必要があります。
// in constructor/elsewhere
Rect newRect = new Rect();
// in onDraw
canvas.getClipBounds(newRect);
newRect.inset(0, -20); //make the rect larger
canvas.clipRect(newRect, Region.Op.REPLACE);
それは問題を解決します:-)
TextViewで範囲外のテキストを描画する場合は、代わりに次のようにする必要があります。
<TextView
...
Android:shadowColor="#01000000"
Android:shadowDx="100" // out of right bound
Android:shadowDy="0"
Android:shadowRadius="1"
.../>
TextViewはonDraw()で独自のrectをクリップするため、@ numanの回答のようにclipRect()を使用することはできません。
if (mShadowRadius != 0) {
clipLeft += Math.min(0, mShadowDx - mShadowRadius);
clipRight += Math.max(0, mShadowDx + mShadowRadius);
clipTop += Math.min(0, mShadowDy - mShadowRadius);
clipBottom += Math.max(0, mShadowDy + mShadowRadius);
}
canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom);
最後になりましたが、親のViewGroupでAndroid:clipChildren="false"
とAndroid:clipToPadding="false"
を設定することを忘れないでください