프로그래밍 방식으로 모서리를 둥글게하고 임의의 배경색을 설정하는 방법


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

드로어 블과 색상이 겹 치길 바랐지만 그렇지 않습니다. 내가 두 번째로 실행하는 것이 결과 배경입니다.

런타임까지 배경색이 결정되지 않는다는 점을 염두에두고이 뷰를 프로그래밍 방식으로 만드는 방법이 있습니까?

편집 : 테스트를 위해 지금은 빨간색과 파란색으로 만 바꿉니다. 나중에 사용자가 색상을 선택할 수 있습니다.

편집하다:

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를 사용하거나 기존 textview를 재사용 할 수 있는지 궁금합니다.
Chansuk 2013-08-23

답변:


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> 

Perect answe! strock에서도 작동했지만 colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); 같은 것을 사용하여 만들 수 있습니다. colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); 국경이 없다면. 하지만 테두리의 경우 PorterDuff.Mode를 알려 주시면 획 색상이 변경되지 않습니다
Akhil Dad

XML을 통해 배경색을 추가하는 방법은 무엇입니까?
Lenin Raj Rajasekaran

2
"v"가 TextView 인 경우 v.getBackground ()는 "java.lang.ClassCastException : android.graphics.drawable.StateListDrawable을 android.graphics.drawable.GradientDrawable로 캐스팅 할 수 없습니다"를 캐스팅합니다. 이것이 실제로 '13 년에 다시 작동 했습니까?
sonavolob

@sonavolob 당신이 맞아요. 그것은 ClassCastException이 있습니다
아드 난

완벽한 솔루션! 감사합니다!
Bot

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

2
이것은 잘 작동합니다! Xamarin에서 사용합니다. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre

이 API의 최소 레벨 16이 필요하다는 니스 빠른 해결책하지만, 참고
알 수없는 데브는

한쪽에만 모서리 반경을 설정하는 방법은 무엇입니까?
Anonymous-E 19

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.