Làm thế nào để thay đổi màu sắc linh hoạt?


136

Tôi có

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
    <solid
       android:color="#FFFF00" />
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
</shape>

<TextView
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"
/>

Vì vậy, bây giờ tôi muốn hình dạng này thay đổi màu sắc dựa trên thông tin tôi nhận được từ một cuộc gọi dịch vụ web. Vì vậy, nó có thể có thể là màu vàng hoặc màu xanh lá cây hoặc màu đỏ hoặc bất cứ điều gì tùy thuộc vào màu sắc tôi nhận được từ cuộc gọi serivce web.

Làm thế nào tôi có thể thay đổi màu sắc của hình dạng? Dựa vào thông tin này?


3
Như được chỉ định bởi phương thức @Couitchy View.getBackground()trả về a GradientDrawablevà không phải là nguyên nhân ShapeDrawablekhiến ứng dụng bị sập khi chạy, do không hợp lệ khi cố gắng lấy tham chiếu và đặt màu lập trình. [Tài liệu hình dạng Android] ( developer.android.com/guide/topics/resource/ từ ) nêu rõ: TÀI LIỆU TÍNH TOÁN TÍNH TOÁN: Con trỏ tài nguyên đến aGradientDrawable .
Luis Quijada

Câu trả lời:


300

Bạn có thể sửa đổi nó đơn giản như thế này

GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);

9
Btn.getBackground là gì?
chobo2

16
Tôi nhận được java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.ShapeDrawablekhi thử đề nghị này.
prolink007

2
Không hoạt động. Bạn sẽ nhận được một lỗi cast. Cần một bản sửa lỗi hoặc một câu trả lời khác được chấp nhận
ndenta

6
Điều này chỉ hoạt động tốt. Các ý kiến ​​trước đây là lỗi thời kể từ khi câu trả lời đã được chỉnh sửa!
W3hri

4
shoul sử dụng GradientDrawable bgShape = (GradientDrawable) btn.getBackground (). getCản ();
naveed148

60

Đối với tôi, nó bị sập vì getBackgroundtrả lại a GradientDrawablethay vì a ShapeDrawable.

Vì vậy, tôi đã sửa đổi nó như thế này:

((GradientDrawable)someView.getBackground()).setColor(someColor);

42

Điều này làm việc cho tôi, với tài nguyên xml ban đầu:

example.setBackgroundResource(R.drawable.myshape);
GradientDrawable gd = (GradientDrawable) example.getBackground().getCurrent();
gd.setColor(Color.parseColor("#000000"));
gd.setCornerRadii(new float[]{30, 30, 30, 30, 0, 0, 30, 30});
gd.setStroke(2, Color.parseColor("#00FFFF"), 5, 6);

Kết quả của những điều trên: http://i.stack.imgur.com/hKUR7.png


Đây là câu trả lời chính xác. Cả hai câu trả lời nêu trên đều không hiệu quả với tôi. Tôi đang nhận được ngoại lệ trên cả hai.
Sanal Varghese

10

Bạn có thể xây dựng các hình dạng của riêng bạn trong Java. Tôi đã làm điều này cho một chiếc iPhone như Page Controler và vẽ các hình dạng trong Java:

/**
 * Builds the active and inactive shapes / drawables for the page control
 */
private void makeShapes() {

    activeDrawable = new ShapeDrawable();
    inactiveDrawable = new ShapeDrawable();
    activeDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);
    inactiveDrawable.setBounds(0, 0, (int) mIndicatorSize,
            (int) mIndicatorSize);

    int i[] = new int[2];
    i[0] = android.R.attr.textColorSecondary;
    i[1] = android.R.attr.textColorSecondaryInverse;
    TypedArray a = this.getTheme().obtainStyledAttributes(i);

    Shape s1 = new OvalShape();
    s1.resize(mIndicatorSize, mIndicatorSize);
    Shape s2 = new OvalShape();
    s2.resize(mIndicatorSize, mIndicatorSize);

    ((ShapeDrawable) activeDrawable).getPaint().setColor(
            a.getColor(0, Color.DKGRAY));
    ((ShapeDrawable) inactiveDrawable).getPaint().setColor(
            a.getColor(1, Color.LTGRAY));

    ((ShapeDrawable) activeDrawable).setShape(s1);
    ((ShapeDrawable) inactiveDrawable).setShape(s2);
}

hi vọng điêu nay co ich. Greez Fabian


7

Có lẽ ai đó cần thay đổi màu sắc trong XML mà không cần tạo nhiều bản vẽ như tôi cần. Sau đó tạo một vòng tròn có thể vẽ mà không có màu và sau đó chỉ định backgroundTint cho ImageView.

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
</shape>

Và trong cách bố trí của bạn :

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@drawable/circle"
    android:backgroundTint="@color/red"/>

Biên tập:

Có một lỗi liên quan đến phương pháp này khiến nó không hoạt động trên Android Lollipop 5.0 (API cấp 21). Nhưng đã được sửa trong các phiên bản mới hơn.


5
    LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
    final GradientDrawable shape = (GradientDrawable)
            bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
    shape.setColor(Color.BLACK);

Round_button_shape nên xác định ở đâu trong tệp hình xml?
Jayesh

5

circle.xml (có thể vẽ)

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid
    android:color="#000"/>

<size
    android:width="10dp"
    android:height="10dp"/>
</shape>

bố trí

<ImageView
      android:id="@+id/circleColor"
      android:layout_width="15dp"
       android:layout_height="15dp"
      android:textSize="12dp"
       android:layout_gravity="center"
       android:layout_marginLeft="10dp"
      android:background="@drawable/circle"/>

trong hoạt động

   circleColor = (ImageView) view.findViewById(R.id.circleColor);
   int color = Color.parseColor("#00FFFF");
   ((GradientDrawable)circleColor.getBackground()).setColor(color);

Không phải là một hoàn hảo, nhưng đã giúp tôi có được giải pháp.
Rakesh Yadav

2

Giải pháp này hiệu quả với tôi khi sử dụng android sdk v19:

//get the image button by id
ImageButton myImg = (ImageButton) findViewById(R.id.some_id);

//get drawable from image button
GradientDrawable drawable = (GradientDrawable) myImg.getDrawable();

//set color as integer
//can use Color.parseColor(color) if color is a string
drawable.setColor(color)

2

Nếu bạn có một imageView như thế này:

   <ImageView
    android:id="@+id/color_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:src="@drawable/circle_color"/>

cung cấp cho nó một hình dạng có thể vẽ là src, bạn có thể sử dụng mã này để thay đổi màu sắc của hình dạng:

ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);

1

Hình dạng của tôi xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid  android:color="@android:color/transparent" />
<stroke android:width="0.5dp" android:color="@android:color/holo_green_dark"/>
</shape>

Hoạt động của tôi xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="cn.easydone.test.MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
    <TextView
        android:id="@+id/test_text"
        android:background="@drawable/bg_stroke_dynamic_color"
        android:padding="20dp"
        android:text="asdasdasdasd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Hoạt động của tôi java:

 TextView testText = (TextView) findViewById(R.id.test_text);
 ((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);

Kết quả hình ảnh: kết quả


1

Cách đơn giản nhất để điền vào hình dạng với Bán kính là:

XML:

<TextView
    android:id="@+id/textView"
    android:background="@drawable/test"
    android:layout_height="45dp"
    android:layout_width="100dp"
    android:text="Moderate"/>

Java:

(textView.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);

0

Tôi thử câu trả lời của Ronnie và ứng dụng của tôi bị sập. Sau đó, tôi kiểm tra xml drawable của tôi. Nó trông như thế này:

<selector >...</selector>

. Tôi đã thay đổi nó thành này: (cũng thay đổi thuộc tính)

<shape> ... </shape>

Nó hoạt động.

Đối với những người gặp phải vấn đề tương tự.


0

drawable_ronymous.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="@android:color/transparent" />

    <stroke
        android:width="1dp"
        android:color="#9f9f9f" />

    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

Xem văn bản

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/drawable_rectangle"
    android:gravity="center"
    android:padding="10dp"
    android:text="Status"
    android:textColor="@android:color/white"
    android:textSize="20sp" />


public static void changeRectangleColor(View view, int color) {
    ((GradientDrawable) view.getBackground()).setStroke(1, color);
}    

changeRectangleColor(textView, ContextCompat.getColor(context, R.color.colorAccent));

0

Bạn có thể sử dụng một bộ chuyển đổi liên kết (Kotlin) để đạt được điều này. Tạo một lớp bộ điều hợp ràng buộc có tên ChangeShapeColor như bên dưới

@BindingAdapter("shapeColor")

// Method to load shape and set its color 

fun loadShape(textView: TextView, color: String) {
// first get the drawable that you created for the shape 
val mDrawable = ContextCompat.getDrawable(textView.context, 
R.drawable.language_image_bg)
val  shape =   mDrawable as (GradientDrawable)
// use parse color method to parse #34444 to the int 
shape.setColor(Color.parseColor(color))
 }

Tạo một hình dạng có thể vẽ trong thư mục res / drawable. Tôi đã tạo ra một vòng tròn

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<solid android:color="#anyColorCode"/>

<size
    android:width="@dimen/dp_16"
    android:height="@dimen/dp_16"/>
</shape>

Cuối cùng giới thiệu nó đến quan điểm của bạn

  <TextView>
   .........
  app:shapeColor="@{modelName.colorString}"
 </Textview>
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.