web-dev-qa-db-ja.com

Androidクリッピングを表示

Android(Honeycomb)でViewGroupのクリップ領域を定義する方法はありますか?たとえば、角が丸い画像の背景を持つListViewがあります。リストをスクロールすると、子供たちは背景の角を越えて突き出します-私は丸い角の中にクリップすることを好むでしょう。 Left: unclipped, Right: clipped

左の画像は現在行っていることで、右の画像は私が望むものです。

ClipDrawableを見ていましたが、これはプログレスバーにしか使用できないようです?

また、私はウィジェットでこれをやろうとしています。そのため、カスタムビューを使用して、onDrawをマスキングにオーバーライドすることはできません。

ありがとうございました!

54
Jon Ross

ViewGroupをサブクラス化し、次のようにOnDrawメソッドをオーバーライドして、RADIUS_IN_PIXELSの値を置き換えてみてください。

@Override
protected void onDraw(Canvas canvas) {
    Path clipPath = new Path();
    clipPath.addRoundRect(new RectF(canvas.getClipBounds()), RADIUS_IN_PIXELS, RADIUS_IN_PIXELS, Path.Direction.CW);
    canvas.clipPath(clipPath);
    super.onDraw(canvas);
}

...また、「丸みを帯びた」のようなものと呼ばれる、YOUR_BACKGROUND_COLORとRADIUS_IN_DPに置き換えて、DPの四角形の丸みをPXの以前のクリッピング半径に一致させるように、このようなカスタムドローアブルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <corners Android:radius="RADIUS_IN_DP" />
    <solid Android:color="YOUR_BACKGROUND_COLOR"/>
</shape>

次に、そのサブクラスをレイアウトで使用して、行を追加できます

Android:background="@drawable/rounded"
Android:clipChildren="true"

すべての子はOnDraw()オーバーライドで指定した境界にクリップされ、「丸められた」ドロウアブルに基づいて背景が追加されます。

24

overridden onDraw(Canvas canvas)を使用してカスタムレイアウトを作成する

canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);を呼び出します

これにより、レイアウトの境界から外れるすべてのビューがクリップされます。

そして、コンストラクタでsetWillNotDraw(false)を呼び出すことを忘れないでください。そうすればonDrawが実行されます

5
kapil

layoutの背景に丸い角があることを確認してください。

コトリン

layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true

Java

layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
4
Marco

WhatsUp を見ると、連絡先の写真に丸みのある境界線で丸みを帯びた画像があることがわかります。これを行うには、丸みを帯びた境界線を持つFrameLayout(画像の前にProgressBarを使用して[実際には不可視]の読み込みを通知するため、FrameLayout)内にImageViewを配置しました。写真は正方形ですが、それを調整するには、キャンバスで作業する必要があります。

これをもう一度見てみましょう link これで問題が解決します;)

1
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);
1
Bondax

これについてはどうですか: Androidビューをビットマップにレンダリングする方法 の場合、そのビットマップをクリップします。

または、別のアイデアとして、FrameLayoutを使用して、ViewGroupの上にクリップマスクをスタックします。クリップマスクには、透明な中央、不透明な境界線があります。

どちらの場合も、ユーザー入力を処理するのは難しいと思います...

1
Pēteris Caune

Canvas.clipRegionメソッドを使用して、ビューの違いをクリップできます。

0
blessenm