角を丸くしたレイアウトを作るには...?

角を丸くしたレイアウトを作るには?LinearLayout`` に角丸をつけたいのですが、どうすればいいですか?

質問へのコメント (4)
ソリューション

1: drawables に layout_bg.xml を定義する。

<?xml version="1.0" encoding="UTF-8"?>





2: layout_bg.xml をレイアウトの背景として追加します。

android:background="@drawable/layout_bg"
解説 (15)

API 21以降の場合は、クリップビューを使用します

丸みを帯びたアウトラインクリッピングがAPI 21の「ビュー」クラスに追加されました。 詳細については、このトレーニングドキュメントまたはこのリファレンスを参照してください。

この組み込み機能により、丸みを帯びたコーナーの実装が非常に簡単になります。 任意のビューまたはレイアウトで機能し、適切なクリッピングをサポートします。

何をすべきか:

-丸みを帯びた形状の引き出し可能なものを作成し、ビューの背景として設定します。 android:background = "@ drawable / round_outline"。 -ドキュメントによると、必要なのはこれだけです: android:clipToOutline = "true"

残念ながら、[バグ][3]があるようで、このXML属性は現在認識されていません。 幸いなことに、クリッピングをJavaに設定できます。

-アクティビティまたはフラグメント: View.setClipToOutline(true)

それがどのように見えるか:

ここに画像の説明を入力してください。! ImageViewsに関する特別な注意事項

setClipToOutline()は、ビューの背景が描画可能な形状に設定されている場合にのみ機能します。 この背景形状が存在する場合、ビューは背景の輪 ⁇ をクリッピングとシャドウイングの目的で境界線として扱います。

つまり、ImageViewのコーナーを setClipToOutline()で丸める場合、画像は android:backgroundではなく android:srcからのものでなければなりません(背景は丸みを帯びた形状に使用されるため)。 srcの代わりに背景を使用して画像を設定する必要がある場合は、このネストされたビューの回避策を使用できます。

-背景を描画可能な形状に設定した外側のレイアウターを作成します。 -そのレイアウトをImageViewに巻き付けます(パディングなし)。 -ImageView(レイアウトの他のものを含む)は、外側のレイアウトの丸みを帯びた形状にクリップされます。

[3]:https://code.google.com/p/android/issues/detail?id = 164125。

解説 (9)

以下は、白背景、黒枠、角丸のドローアブルを作成するためのXMLファイルのコピーです。

 <?xml version="1.0" encoding="UTF-8"?> 








をxmlファイルとしてdrawableディレクトリに保存してください。 他のdrawableの背景(アイコンやリソースファイル)と同様に、リソース名(R.drawable.your_xml_name)を使って使用します。

解説 (5)

Android v7サポートライブラリでCardViewを使用します。 少し重いですが、すべての問題を解決し、十分に簡単です。 描画可能な背景設定方法とは異なり、サブビューを正常にクリップできます。

<?xml version="1.0" encoding="utf-8"?>


解説 (1)

私はこのようにしました。

スクリーンショットを確認する。

相対レイアウトの背景1

drawable フォルダに custom_rectangle.xml という名前の drawable** ファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>








次に、ビュー矩形の背景を適用します。

mView.setBackground(R.drawlable.custom_rectangle);

完了です。

解説 (1)

そのためのより良い方法は、2つのことをマージすることだと思います。

1。 [ここ][1]に示すように、レイアウトのビットマップを作成します。

2。 [ここ][2]に示すように、ビットマップから丸みを帯びた引き出し可能なものにします。

3。 imageViewに描画可能ファイルを設定します。

これは、コーナーのあるコンテンツを持つなど、他のソリューションが解決できなかったケースを処理します。

2ではなく1つのレイヤーが表示されるため、GPUにも少し適していると思います。 .

唯一良い方法は、完全にカスタマイズされたビューを作成することですが、それは多くのコードであり、多くの時間がかかる場合があります。 ここで提案したのは、両方の世界で最高だと思います。

これがどのように実行できるかのスニペットです。

RoundedCornersDrawable.java

/**
 * shows a bitmap as if it had rounded corners. based on :
 * http://rahulswackyworld.blogspot.co.il/2013/04/android-drawables-with-rounded_7.html
 * easy alternative from support library: RoundedBitmapDrawableFactory.create( ...) ; 
 */
public class RoundedCornersDrawable extends BitmapDrawable {

    private final BitmapShader bitmapShader;
    private final Paint p;
    private final RectF rect;
    private final float borderRadius;

    public RoundedCornersDrawable(final Resources resources, final Bitmap bitmap, final float borderRadius) {
        super(resources, bitmap);
        bitmapShader = new BitmapShader(getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        final Bitmap b = getBitmap();
        p = getPaint();
        p.setAntiAlias(true);
        p.setShader(bitmapShader);
        final int w = b.getWidth(), h = b.getHeight();
        rect = new RectF(0, 0, w, h);
        this.borderRadius = borderRadius < 0 ? 0.15f * Math.min(w, h) : borderRadius;
    }

    @Override
    public void draw(final Canvas canvas) {
        canvas.drawRoundRect(rect, borderRadius, borderRadius, p);
    }
}

CustomView.java


public class CustomView extends ImageView {
    private View mMainContainer;
    private boolean mIsDirty=false;

    // TODO for each change of views/content, set mIsDirty to true and call invalidate

    @Override
    protected void onDraw(final Canvas canvas) {
        if (mIsDirty) {
            mIsDirty = false;
            drawContent();
            return;
        }
        super.onDraw(canvas);
    }

    /**
     * draws the view's content to a bitmap. code based on :
     * http://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/
     */
    public static Bitmap drawToBitmap(final View viewToDrawFrom, final int width, final int height) {
        // Create a new bitmap and a new canvas using that bitmap
        final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bmp);
        viewToDrawFrom.setDrawingCacheEnabled(true);
        // Supply measurements
        viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.EXACTLY));
        // Apply the measures so the layout would resize before drawing.
        viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(), viewToDrawFrom.getMeasuredHeight());
        // and now the bmp object will actually contain the requested layout
        canvas.drawBitmap(viewToDrawFrom.getDrawingCache(), 0, 0, new Paint());
        return bmp;
    }

    private void drawContent() {
        if (getMeasuredWidth() 
解説 (9)

これを試してみてください。..

1.create drawable xml (custom_layout.xml):

<?xml version="1.0" encoding="utf-8"?>








2.ビューの背景を追加します。

android:background="@drawable/custom_layout"
解説 (1)

レイアウトを丸くしたい場合は、CardViewを使用するのが最適です。デザインを美しくするための多くの機能が提供されています。






このcard_view:cardCornerRadius = "5dp"を使用すると、半径を変更できます。

解説 (0)

プログラム的に設定されたコーナー半径の関数。

static void setCornerRadius(GradientDrawable drawable, float topLeft,
        float topRight, float bottomRight, float bottomLeft) {
    drawable.setCornerRadii(new float[] { topLeft, topLeft, topRight, topRight,
            bottomRight, bottomRight, bottomLeft, bottomLeft });
}

static void setCornerRadius(GradientDrawable drawable, float radius) {
    drawable.setCornerRadius(radius);
}

使用。

GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setColor(Color.GREEN);
setCornerRadius(gradientDrawable, 20f);
//or setCornerRadius(gradientDrawable, 20f, 40f, 60f, 80f); 

view.setBackground(gradientDrawable);
解説 (0)

それを行うためのより良い方法は次のとおりです。

background_activity.xml

<?xml version="1.0" encoding="UTF-8"?>











これはAPI 21の下でも機能し、次のようなものを提供します。

。![結果](https://i.stack.imgur.com/FMSFD.png。)

----------。

もう少し努力してより適切な制御を行う場合は、「cardCornerRadius」属性を持つ「android.support.v7.widget.CardView」を使用します(「levation」属性を「0dp」に設定して、 cardViewに伴う付随するドロップシャドウ)。 また、これはAPIレベルで15まで機能します。

解説 (4)

CardViewを使用して、レイアウトの丸みを帯びたエッジを取得します。 card_view:cardCornerRadius = "5dp" を使用して、丸みを帯びたレイアウトエッジを取得します。











解説 (1)

最良かつ最も簡単な方法は、レイアウトで描画可能な card_background を利用することです。 これは、Googleのマテリアルデザインガイドラインにも従います。 これをLinearLayout:に含めてください。

android:background="@drawable/card_background"

これを描画可能なディレクトリに追加し、 card_background.xml に名前を付けます。

<?xml version="1.0" encoding="utf-8"?>















解説 (0)
<?xml version="1.0" encoding="UTF-8"?>





@David、ストロークと同じ値のパディングを置くだけなので、境界線が見え、見かけのない画像サイズになります。

解説 (0)

@gauravsapiensの回答をコメントとともに取り入れて、パラメーターがどのような影響を与えるかについて合理的な理解を深めました。

<?xml version="1.0" encoding="utf-8"?>














コーナーを丸める形状を作成しようとしているだけの場合は、パディングを削除するとストロークが実行されます。 ソリッドも取り外すと、実際には、透明な背景に丸みを帯びたコーナーが作成されます。

怠惰になるために、下に丸い角のある真っ白な背景の形を作りました-楽しんでください。! :)。

<?xml version="1.0" encoding="utf-8"?>








解説 (0)

引き出し可能な layout_background.xmlでxmlを作成します。

 <?xml version="1.0" encoding="utf-8"?>





次に、これを layout.xmlに追加します。

 android:background="@drawable/layout_background"
解説 (1)




< / shape>。

解説 (0)