web-dev-qa-db-ja.com

Android Canvasの範囲外に描画できますか?

クリッピング長方形の境界の外側で描画を実行できるグラフィックス環境で記述されたアプリを移植しています。 Androidでこれを行う方法はありますか?

26
Mark

境界の外側に描画するには、キャンバスの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
45
numan salati

設定してみてください

Android:clipChildren="false" 

親ビューへ

32
Danylo.Vus

好きな場所に描くことができますが、クリッピング長方形の外側には何も保存されません。

9
CaseyB

@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);

それは問題を解決します:-)

3
cesards

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"を設定することを忘れないでください

2
legendmohe