プログラムで角を丸めてランダムな背景色を設定する方法


114

ビューの角を丸くし、実行時にコンテンツに基づいてビューの色を変更したいのですが。

TextView v = new TextView(context);
v.setText(tagsList.get(i));
if(i%2 == 0){
    v.setBackgroundColor(Color.RED);
}else{
    v.setBackgroundColor(Color.BLUE);
}

v.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
v.setPadding(twoDP, twoDP, twoDP, twoDP);               
v.setBackgroundResource(R.drawable.tags_rounded_corners);

ドローアブルを設定して色が重なることを望んでいましたが、重複しません。私が2番目に実行するものは、結果として得られる背景です。

実行時まで背景色が決定されないことを念頭に置いて、このビューをプログラムで作成する方法はありますか?

編集:私はテストのために赤と青の間で交換しているだけです。後でユーザーが色を選択できるようになります。

編集:

tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners 
         android:bottomRightRadius="2dp" 
         android:bottomLeftRadius="2dp" 
         android:topLeftRadius="2dp" 
         android:topRightRadius="2dp"/>
</shape>

もちろん、背景色と背景画像は互いに上書きします。何を達成しようとしていますか?なにtags_rounded_corners
Alex MDC

もっとコードを見せてもらえますか?見た目は良いので、listViewのようなものを使用したり、既存のテキストビューを再利用したりできるのではないでしょうか。
Chansuk 2013

回答:


211

の代わりにsetBackgroundColor、背景のドローアブルを取得してその色を設定します。

v.setBackgroundResource(R.drawable.tags_rounded_corners);

GradientDrawable drawable = (GradientDrawable) v.getBackground();
if (i % 2 == 0) {
  drawable.setColor(Color.RED);
} else {
  drawable.setColor(Color.BLUE);
}

また、あなたの中にパディングを定義することができますtags_rounded_corners.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="4dp" />
  <padding
    android:top="2dp"
    android:left="2dp"
    android:bottom="2dp"
    android:right="2dp" />
</shape> 

正解です。strockでも機能しましたが、colorDrawable = resources.getDrawable(R.drawable.x_sd_circle);のようなものを使用してこれを作成できますか?colorDrawable.setColorFilter(color、PorterDuff.Mode.SRC_ATOP); 国境がなければ ボーダーの場合は、PorterDuff.Modeを知らせて、ストロークの色が変わらないようにすることができます
Akhil Dad

XMLを介して背景色を追加する方法は?
Lenin Raj Rajasekaran 2015年

2
「v」がTextViewである場合、v.getBackground()は「java.lang.ClassCastException:android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.GradientDrawable」をキャストします。
sonavolob 2016

@sonavolobあなたは正しい。ClassCastExceptionが発生します
Adnan

完璧なソリューション!ありがとうございました!
ボット2016

124

丸みを帯びた角を設定し、ランダムな背景色をビューに追加するための完全なプログラム的アプローチ 私はコードをテストしていませんが、あなたはアイデアを理解しています。

 GradientDrawable shape =  new GradientDrawable();
 shape.setCornerRadius( 8 );

 // add some color
 // You can add your random color generator here
 // and set color
 if (i % 2 == 0) {
  shape.setColor(Color.RED);
 } else {
  shape.setColor(Color.BLUE);
 }

 // now find your view and add background to it
 View view = (LinearLayout) findViewById( R.id.my_view );
 view.setBackground(shape);

ここでは、グラデーションドローアブルを使用しています。これは、そのようなメソッドを提供していないGradientDrawable#setCornerRadiusために利用できるようにするためShapeDrawableです。


13
shape.setCornerRadii(corners); その非常に便利
umesh

14
PaintDrawable代わりに使用することを検討してくださいGradientDrawable。丸みを帯びた角とグラデーションよりも適切と思われる単一の色のみをサポートします。
Cimlman 2016年

2
これはうまくいきます!Xamarinで使用します。 var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
ピエール

それはAPIの最低レベル16必要であることをニースの迅速な解決が、ノート
未知のDev

片側だけのコーナー半径を設定する方法は?
Anonymous-E

10

これを行う最も速い方法は次のとおりです。

GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, //set a gradient direction 
            new int[] {0xFF757775,0xFF151515}); //set the color of gradient
gradientDrawable.setCornerRadius(10f); //set corner radius

//Apply background to your view
View view = (RelativeLayout) findViewById( R.id.my_view );
if(Build.VERSION.SDK_INT>=16)
     view.setBackground(gradientDrawable);
else view.setBackgroundDrawable(gradientDrawable);    


5

ストロークがない場合は、使用できます

colorDrawable = resources.getDrawable(R.drawable.x_sd_circle); 

colorDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

しかし、これはストロークの色も変更します


39
これを使うつもりでしたが、脳卒中です。
Tim Malseed 2015

2

拡張機能を使用した例を次に示します。これは、ビューの幅と高さが同じであることを前提としています。

ビューのサイズを取得するには、レイアウト変更リスナーを使用する必要があります。次に、このようなビューでこれを呼び出すことができますmyView.setRoundedBackground(Color.WHITE)

fun View.setRoundedBackground(@ColorInt color: Int) {
    addOnLayoutChangeListener(object: View.OnLayoutChangeListener {
        override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {

            val shape = GradientDrawable()
            shape.cornerRadius = measuredHeight / 2f
            shape.setColor(color)

            background = shape

            removeOnLayoutChangeListener(this)
        }
    })
}

1

任意のアイテム(レイアウト、テキストビュー)の色を動的に変更できます。以下のコードを試して、レイアウトでプログラム的に色を設定してください

activity.javaファイル内


String quote_bg_color = "#FFC107"
quoteContainer= (LinearLayout)view.findViewById(R.id.id_quotecontainer);
quoteContainer.setBackgroundResource(R.drawable.layout_round);
GradientDrawable drawable = (GradientDrawable) quoteContainer.getBackground();
drawable.setColor(Color.parseColor(quote_bg_color));

ドローアブルフォルダーにlayout_round.xmlを作成する

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimaryLight"/>
    <stroke android:width="0dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

activity.xmlファイルのレイアウト

<LinearLayout
        android:id="@+id/id_quotecontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

----other components---

</LinearLayout>


1

@cimlmanのコメントをトップレベルの回答にコピーして、より見やすくします。

PaintDrawable(Color.CYAN).apply {
  setCornerRadius(24f)
}

参考:(ShapeDrawableおよびそのサブタイプ、PaintDrawable)はデフォルトの固有の幅と高さ0を使用します。ドローアブルがユースケースに表示されない場合は、手動で寸法を設定する必要があります。

PaintDrawable(Color.CYAN).apply {
  intrinsicWidth = -1
  intrinsicHeight = -1
  setCornerRadius(24f)
}

-1Drawableに固有の幅と高さ(Source)がないことを示す魔法の定数です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.