Android 모양 색상을 프로그래밍 방식으로 설정
정확한 답변에 도움이 되기를 바라며 질문을 더 쉽게 하기 위해 편집하고 있습니다.
다음이 있다고 말합니다.oval
모양:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="#FFFF0000"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
활동 클래스 내에서 색을 프로그래밍 방식으로 설정하려면 어떻게 해야 합니까?
메모응답이 다음 시나리오를 포함하도록 업데이트되었습니다.background
의 예입니다.ColorDrawable
이것을 지적해 주신 타일러 파프에게 감사드립니다.
그리기 가능한 그림은 타원형이며 이미지 보기의 배경입니다.
Get theDrawable
부터imageView
사용.getBackground()
:
Drawable background = imageView.getBackground();
일반적인 용의자와 대조:
if (background instanceof ShapeDrawable) {
// cast to 'ShapeDrawable'
ShapeDrawable shapeDrawable = (ShapeDrawable) background;
shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
// cast to 'GradientDrawable'
GradientDrawable gradientDrawable = (GradientDrawable) background;
gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
// alpha value may need to be set again after this call
ColorDrawable colorDrawable = (ColorDrawable) background;
colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}
압축 버전:
Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}
Null 검사는 필요하지 않습니다.
하지만, 당신은 사용해야 합니다.mutate()
다른 곳에서 사용되는 경우 수정하기 전에 그리기 가능합니다. (기본적으로 XML에서 로드된 그리기 가능은 동일한 상태를 공유합니다.)
현재보다 간단한 해결책은 모양을 배경으로 사용한 다음 다음을 통해 색을 프로그래밍 방식으로 변경하는 것입니다.
view.background.setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP)
포터 더프를 참조하십시오.사용 가능한 옵션의 모드입니다.
업데이트(API 29):
위의 방법은 API 29 이후로 더 이상 사용되지 않으며 다음으로 대체됩니다.
view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
사용 가능한 옵션은 혼합 모드를 참조하십시오.
다음과 같이 수행:
ImageView imgIcon = findViewById(R.id.imgIcon);
GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
backgroundGradient.setColor(getResources().getColor(R.color.yellow));
이 질문은 얼마 전에 답변이 있었지만 코틀린 확장 기능으로 다시 작성하여 현대화할 수 있습니다.
fun Drawable.overrideColor(@ColorInt colorInt: Int) {
when (this) {
is GradientDrawable -> setColor(colorInt)
is ShapeDrawable -> paint.color = colorInt
is ColorDrawable -> color = colorInt
}
}
사용해 보십시오.
public void setGradientColors(int bottomColor, int topColor) {
GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]
{bottomColor, topColor});
gradient.setShape(GradientDrawable.RECTANGLE);
gradient.setCornerRadius(10.f);
this.setBackgroundDrawable(gradient);
}
자세한 내용은 이 링크를 확인하십시오.
도움을 바라다
이것이 같은 문제를 가진 누군가에게 도움이 되기를 바랍니다.
GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)
//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);
Vikram의 답변을 확장하면, 만약 당신이 재활용품과 같은 동적 뷰를 색칠하고 있다면….그러면 색상을 설정하기 전에 mutate()를 호출하는 것이 좋습니다.이 작업을 수행하지 않으면 공통 그리기 가능한 뷰(예: 배경)도 변경되거나 색상이 지정됩니다.
public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {
if (background instanceof ShapeDrawable) {
((ShapeDrawable) background.mutate()).getPaint().setColor(color);
} else if (background instanceof GradientDrawable) {
((GradientDrawable) background.mutate()).setColor(color);
} else if (background instanceof ColorDrawable) {
((ColorDrawable) background.mutate()).setColor(color);
}else{
Log.w(TAG,"Not a valid background type");
}
}
이것이 저에게 효과가 있는 해결책입니다...그것을 다른 질문에도 썼습니다.모양 색을 동적으로 변경하는 방법은 무엇입니까?
//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)
저는 틴트 색상을 설정하면 Shape Drawable에서 작동하는 것 외에는 아무 것이 없습니다.
Drawable background = imageView.getBackground();
background.setTint(getRandomColor())
Android 5.0 API 필요 21
위의 답변에 기반한 My Kotlin 확장 함수 버전과 호환:
fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
val muted = this.mutate()
when (muted) {
is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
else -> Log.d("Tag", "Not a valid background type")
}
}
도형을 반지름으로 채우는 간단한 방법은 다음과 같습니다.
(view.getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
제가 너무 늦었나 봐요.하지만 당신이 코틀린을 사용한다면요.이런 방법이 있습니다.
var gd = layoutMain.background as GradientDrawable
//gd.setCornerRadius(10)
gd.setColor(ContextCompat.getColor(ctx , R.color.lightblue))
gd.setStroke(1, ContextCompat.getColor(ctx , R.color.colorPrimary)) // (Strokewidth,colorId)
즐기세요...
이것은 도움이 될 수 있습니다.
1.모양 색상을 처음에 투명으로 설정합니다.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="@android:color/transparent"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
모양을 보기의 배경으로 설정
원하는 색상을 다음과 같이 설정합니다.
Drawable bg = view.getBackground(); bg.setColorFilter(Color.parseColor("#Color"), PorterDuff.Mode.ADD);
어댑터에서 이 작업을 수행해야 했지만 위의 솔루션이 작동하지 않거나 >= 안드로이드 버전 10이 필요했습니다.아래의 코드가 나에게 효과가 있었습니다!
val drawable = DrawableCompat.wrap(holder.courseName.background)
DrawableCompat.setTint(drawable, Color.parseColor("#4a1f60"))
C# Xamarin을 사용하는 사람이라면 누구나 Vikram의 스니펫을 기반으로 한 방법이 있습니다.
private void SetDrawableColor(Drawable drawable, Android.Graphics.Color color)
{
switch (drawable)
{
case ShapeDrawable sd:
sd.Paint.Color = color;
break;
case GradientDrawable gd:
gd.SetColor(color);
break;
case ColorDrawable cd:
cd.Color = color;
break;
}
}
커스텀 드로잉 가능한 단색을 변경하는 가장 좋은 방법은 코틀린을 위한 것입니다.
(findViewById<TextView>(R.id.testing1).getBackground()).setColorFilter(Color.parseColor("#FFDE03"), PorterDuff.Mode.SRC_IN);
우리는 이 코틀린 함수를 만들 수 있습니다.
fun View.updateViewBGSolidColor(colorString: String) {
when (val background: Drawable = this.background) {
is ShapeDrawable -> {
background.paint.color = Color.parseColor(colorString)
}
is GradientDrawable -> {
background.setColor(Color.parseColor(colorString))
}
is ColorDrawable -> {
background.color = Color.parseColor(colorString)
}
}
}
다음과 같이 사용합니다.
yourTextView.updateViewBGSolidColor("#FFFFFF")
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[] {0xFF616261,0xFF131313});
gd.setCornerRadius(0f);
layout.setBackgroundDrawable(gd);
compileSdkVersion 33을 사용한 2023년의 경우 현재 가장 많이 투표된 답변이 어떤 식으로든 효과가 있었습니다.제 모양은 복잡한 뷰를 위한 단순한 둥근 테두리입니다.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<stroke
android:width="2dp"
android:color="@color/white"/>
<corners
android:bottomRightRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"
android:bottomLeftRadius="10dp"/>
</shape>
모양은 다음과 같이 설정됩니다.background
라는 이름의 에서.VScroll
의 색상이 ▁in▁▁color▁i다▁and▁to▁set▁adapted▁so니▁the▁answer습에 색상을 설정했습니다.Fragment
:
val lineBackground = binding.vScroll.background as GradientDrawable
lineBackground.setStroke(5,Color.parseColor(line.color))
에▁where디line.color
는 다과진 16수문 값입니다와 같은 입니다.#FFFFFF
의 int 값에 값stroke width
되어 있기 에 픽셀단위설있정으로로합므니로 .dp
적당한 크기로
언급URL : https://stackoverflow.com/questions/17823451/set-android-shape-color-programmatically
'programing' 카테고리의 다른 글
주어진 HTML을 사용하여 동적으로 iframe 만들기 (0) | 2023.08.04 |
---|---|
asp.net c# http에서 https로 리디렉션 (0) | 2023.08.04 |
Android에서 토스트의 위치를 변경하는 방법은 무엇입니까? (0) | 2023.08.04 |
스프링 부트 보안 - 우체부가 401을 무단으로 제공합니다. (0) | 2023.08.04 |
디렉토리 구조에서 가장 큰 10개의 파일을 찾는 방법 (0) | 2023.08.04 |