모양 색상을 동적으로 변경하는 방법은 무엇입니까?
나는 가지고있다
<?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"
/>
이제 웹 서비스 호출에서 얻은 정보에 따라이 모양이 색상을 변경하기를 원합니다. 따라서 웹 서비스 호출에서 수신 한 색상에 따라 노란색 또는 녹색 또는 빨간색 일 수 있습니다.
도형의 색상을 어떻게 바꿀 수 있습니까? 이 정보를 바탕으로?
이렇게 간단하게 수정할 수 있습니다
GradientDrawable bgShape = (GradientDrawable)btn.getBackground();
bgShape.setColor(Color.BLACK);
나를 위해 getBackground
a GradientDrawable
대신을 반환 했기 때문에 충돌이 발생했습니다 ShapeDrawable
.
그래서 나는 이것을 다음과 같이 수정했다 :
((GradientDrawable)someView.getBackground()).setColor(someColor);
이것은 초기 xml 리소스로 저에게 효과적입니다.
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);
위의 결과 : http://i.stack.imgur.com/hKUR7.png
Java로 자신 만의 모양을 만들 수 있습니다. Page Controler와 같은 iPhone 에서이 작업을 수행하고 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);
}
도움이 되었기를 바랍니다. 그 레즈 파비안
LayerDrawable bgDrawable = (LayerDrawable) button.getBackground();
final GradientDrawable shape = (GradientDrawable)
bgDrawable.findDrawableByLayerId(R.id.round_button_shape);
shape.setColor(Color.BLACK);
circle.xml (드로어 블)
<?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>
나열한 것
<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"/>
활동 중
circleColor = (ImageView) view.findViewById(R.id.circleColor);
int color = Color.parseColor("#00FFFF");
((GradientDrawable)circleColor.getBackground()).setColor(color);
Maybe someone else need to change color in the XML without create multiple drawables like I needed. Then make a circle drawable without color and then specify backgroundTint for the ImageView.
circle.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
</shape>
And in your layout:
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/circle"
android:backgroundTint="@color/red"/>
Edit:
There is a bug regarding this method that prevents it from working on Android Lollipop 5.0 (API level 21). But have been fixed in newer versions.
This solution worked for me using the 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)
If you have an imageView like this:
<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"/>
which give it a drawable shape as src, you can use this code to change shape's color:
ImageView iv = (ImageView)findViewById(R.id.color_button);
GradientDrawable bgShape = (GradientDrawable)iv.getDrawable();
bgShape.setColor(Color.BLACK);
My shape 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>
My activity 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" />
My activity java :
TextView testText = (TextView) findViewById(R.id.test_text);
((GradientDrawable)testText.getBackground()).setStroke(10,Color.BLACK);
Result picture : result
I try Ronnie's answer, and my app crashed. Then I check my drawable xml. It looks like this:
<selector >...</selector>
. I changed it to this:(also changed attributes)
<shape> ... </shape>
It works.
For those who encounter the same problem.
The simplest way to fill the shape with the Radius is:
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);
drawable_rectangle.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>
TextView
<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));
참고URL : https://stackoverflow.com/questions/7164630/how-to-change-shape-color-dynamically
'IT' 카테고리의 다른 글
요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. (0) | 2020.06.26 |
---|---|
로컬 컴퓨터의 PHP 서버? (0) | 2020.06.26 |
Swift3에서 URL을 여는 방법 (0) | 2020.06.26 |
UnderscoreJS를 사용하여 배열에서 항목 제거 (0) | 2020.06.26 |
jQuery를 사용하여 텍스트 상자에 입력 한 텍스트 길이를 어떻게 얻을 수 있습니까? (0) | 2020.06.26 |