Cách lập trình làm tròn các góc và đặt màu nền ngẫu nhiên


114

Tôi muốn làm tròn các góc của dạng xem và cũng thay đổi màu của dạng xem dựa trên nội dung trong thời gian chạy.

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

Tôi đã hy vọng thiết lập có thể vẽ và màu sắc sẽ chồng lên nhau, nhưng họ không làm như vậy. Bất kỳ cái nào tôi thực hiện thứ hai là nền kết quả.

Có cách nào để tạo chế độ xem này theo chương trình, lưu ý rằng màu nền sẽ không được quyết định cho đến khi chạy không?

chỉnh sửa: Bây giờ tôi chỉ hoán đổi giữa màu đỏ và màu xanh lam để thử nghiệm. Sau đó, màu sắc sẽ được người dùng lựa chọn.

biên tập:

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>

Tất nhiên màu nền và ảnh nền sẽ đè lên nhau. Bạn đang cố gắng đạt được điều gì? Là tags_rounded_cornersgì?
Alex MDC

Bạn có thể hiển thị thêm mã? Nó có vẻ ổn, vì vậy tôi tự hỏi bạn có thể sử dụng loại listView hoặc sử dụng lại textview hiện có.
Chansuk

Câu trả lời:


211

Thay vào đó setBackgroundColor, hãy truy xuất nền có thể vẽ và đặt màu của nó:

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

Ngoài ra, bạn có thể xác định vùng đệm trong 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! nó cũng hoạt động với strock, nhưng chúng ta có thể làm điều này bằng cách sử dụng một cái gì đó như colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (màu, PorterDuff.Mode.SRC_ATOP); nếu chúng ta không có biên giới. Nhưng trong trường hợp của biên giới, bạn có thể cho tôi biết PorterDuff.Mode để màu đột quỵ sẽ không thay đổi
Akhil Dad

Làm cách nào để thêm màu nền cũng thông qua XML?
Lenin Raj Rajasekaran

2
Nếu "v" là TextView thay vì v.getBackground () sẽ truyền "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable không thể truyền sang android.graphics.drawable.GradientDrawable" Điều này có thực sự hoạt động trở lại vào năm '13 không?
sonavolob

@sonavolob bạn nói đúng. nó cung cấp cho ClassCastException
Adnan

Giải pháp hoàn hảo! Cảm ơn bạn!
Bot

124

Phương pháp tổng thể có lập trình để đặt các góc tròn và thêm màu nền ngẫu nhiên vào Chế độ xem. Tôi đã không thử nghiệm mã, nhưng bạn có thể hiểu được.

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

Ở đây chúng tôi đang sử dụng gradient drawable để chúng tôi có thể sử dụng GradientDrawable#setCornerRadiusShapeDrawableKHÔNG cung cấp bất kỳ phương pháp nào như vậy.


13
shape.setCornerRadii (các góc); nó rất hữu ích
umesh

14
Cân nhắc sử dụng PaintDrawablethay vì GradientDrawable. Nó hỗ trợ các góc tròn và chỉ có một màu duy nhất có vẻ thích hợp hơn là một màu gradient.
Cimlman

2
Điều này hoạt động tốt! Tôi sử dụng nó trong Xamarin. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre

Giải pháp nhanh chóng tuyệt vời, nhưng lưu ý rằng nó yêu cầu API tối thiểu Cấp 16
Nhà phát triển không xác định

Làm thế nào để đặt bán kính góc chỉ cho một mặt?
Anonymous-E,

10

Tôi nghĩ cách nhanh nhất để làm điều này là:

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

9

Bạn có thể đạt được điều đó tốt hơn bằng cách sử dụng DrawableCompat như thế này:

Drawable backgroundDrawable = view.getBackground();             
DrawableCompat.setTint(backgroundDrawable, newColor);

5

Nếu bạn không bị đột quỵ, bạn có thể sử dụng

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

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

nhưng điều này cũng sẽ thay đổi màu nét vẽ


39
Tôi đã định sử dụng cái này, nhưng tôi đang bị đột quỵ.
Tim Malseed

2

Đây là một ví dụ sử dụng tiện ích mở rộng. Điều này giả sử chế độ xem có cùng chiều rộng và chiều cao.

Cần sử dụng trình nghe thay đổi bố cục để có được kích thước chế độ xem. Sau đó, bạn chỉ có thể gọi điều này trên một chế độ xem như thế nàymyView.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

Bạn có thể tự động thay đổi màu sắc của bất kỳ mục nào (bố cục, chế độ xem văn bản). Hãy thử mã bên dưới để đặt màu theo lập trình trong bố cục

trong tệp 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));

tạo layout_round.xml trong thư mục có thể vẽ

<?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>

bố cục trong tệp 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

Sao chép nhận xét của @ cimlman thành câu trả lời cấp cao nhất để dễ hiển thị hơn:

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

FYI: ShapeDrawable(và kiểu phụ của nó, PaintDrawable) sử dụng chiều rộng và chiều cao nội tại mặc định là 0. Nếu có thể vẽ không hiển thị trong usecase của bạn, bạn có thể phải đặt kích thước theo cách thủ công:

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

-1là một hằng số ma thuật cho biết rằng một Drawable không có chiều rộng và chiều cao nội tại của chính nó ( Nguồn ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.