Android(Honeycomb)でViewGroupのクリップ領域を定義する方法はありますか?たとえば、角が丸い画像の背景を持つListViewがあります。リストをスクロールすると、子供たちは背景の角を越えて突き出します-私は丸い角の中にクリップすることを好むでしょう。
左の画像は現在行っていることで、右の画像は私が望むものです。
ClipDrawableを見ていましたが、これはプログレスバーにしか使用できないようです?
また、私はウィジェットでこれをやろうとしています。そのため、カスタムビューを使用して、onDrawをマスキングにオーバーライドすることはできません。
ありがとうございました!
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()オーバーライドで指定した境界にクリップされ、「丸められた」ドロウアブルに基づいて背景が追加されます。
overridden onDraw(Canvas canvas)
を使用してカスタムレイアウトを作成する
canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);
を呼び出します
これにより、レイアウトの境界から外れるすべてのビューがクリップされます。
そして、コンストラクタでsetWillNotDraw(false)
を呼び出すことを忘れないでください。そうすればonDrawが実行されます
layout
の背景に丸い角があることを確認してください。
コトリン
layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true
Java
layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
Path p = new Path()
// define your clipping path...
canvas.clipPath(p);
これについてはどうですか: Androidビューをビットマップにレンダリングする方法 の場合、そのビットマップをクリップします。
または、別のアイデアとして、FrameLayout
を使用して、ViewGroupの上にクリップマスクをスタックします。クリップマスクには、透明な中央、不透明な境界線があります。
どちらの場合も、ユーザー入力を処理するのは難しいと思います...
Canvas.clipRegionメソッドを使用して、ビューの違いをクリップできます。