วิธีการเขียนโปรแกรมรอบมุมและกำหนดสีพื้นหลังแบบสุ่ม


115

ฉันต้องการปัดเศษมุมของมุมมองและเปลี่ยนสีของมุมมองตามเนื้อหาในรันไทม์

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

คำตอบ:


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 (สี PorterDuff.Mode.SRC_ATOP); ถ้าเราไม่มีพรมแดน แต่ในกรณีของเส้นขอบคุณสามารถแจ้งให้เราทราบ PorterDuff ได้โหมดเพื่อไม่ให้สีของเส้นขีดเปลี่ยน
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
Adnan

โซลูชั่นที่สมบูรณ์แบบ! ขอบคุณ!
บอท

125

วิธีการแบบเป็นโปรแกรมทั้งหมดเพื่อกำหนดมุมโค้งมนและเพิ่มสีพื้นหลังแบบสุ่มให้กับมุมมอง ฉันยังไม่ได้ทดสอบโค้ด แต่คุณเข้าใจแล้ว

 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 (มุม); มีประโยชน์มาก
umesh

14
พิจารณาใช้PaintDrawableแทนGradientDrawable. รองรับมุมโค้งมนและเพียงสีเดียวซึ่งดูเหมือนจะเหมาะสมกว่าการไล่ระดับสี
Cimlman

2
ใช้งานได้ดี! ฉันใช้ใน Xamarin var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
ปิแอร์

วิธีแก้ปัญหาที่รวดเร็วดี แต่โปรดทราบว่าต้องใช้ API ขั้นต่ำ 16
The Unknown 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

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

FYI: ShapeDrawable(และประเภทย่อยของมันPaintDrawable) ใช้ความกว้างภายในและความสูงเริ่มต้นเป็น 0 หาก drawable ไม่ปรากฏใน usecase ของคุณคุณอาจต้องตั้งค่าขนาดด้วยตนเอง:

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

-1เป็นค่าคงที่เวทย์มนตร์ซึ่งบ่งชี้ว่า Drawable ไม่มีความกว้างและความสูงที่แท้จริงของตัวมันเอง ( Source )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.