2011-03-08 6 views
4

XML 리소스에서 드로어 블을 사용할 수 있으며 해당 드로어 블을 사용하지만 그라디언트 색상을 동적으로 설정하고 싶습니다. Android - 드로어 블 그라디언트를 동적으로 설정하십시오.

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners 
     android:radius="3dip"> 
    </corners> 
    <gradient 
     android:angle="90" 
     android:type="linear" 
     android:startColor="#FFFFFFFF" 
     android:centerColor="#FFFF0000" 
     android:endColor="#FFFF0000"> 
    </gradient> 
</shape> 

지금 내가 런타임에 드로어 블을 받고 GradientDrawable로 캐스팅하고, 색상을 설정하는 방법을 사용하여 동적으로 색상을 만들 수있을 것이라고 생각 : 지금까지 나는 이런 식으로 뭔가가있다. 그러나 GradientDrawable에는 이러한 메서드가 없으며 생성자에서 색만 설정할 수 있습니다. 나는 그라데이션의 다른 모든 측면을 설정할 수 있기 때문에 이것이 이상하다는 것을 알게됩니다. onDraw()를 재정의하고 직접 그라디언트를 수행하는 것보다 쉬운 방법이 있습니까? 내가 사용하려고하는 클래스 중 일부는 매우 잘 문서화되어 있지 않습니다.

답변

0

뷰의 배경 드로잉을 동적으로 설정할 수 있습니다.

view.setBackgroundDrawable (R.drawable.your_drawable_id);

0

리소스는 주로 정적이며 수정이 허용되지 않습니다. 일부 리소스 유형을 사용하면 변경 가능한 복사본을 "복제"할 수 있습니다. GradientDrawable을 사용하면 contstuctor의 색상을 설정할 수 있기 때문에 (런타임에서 색상을 동적으로 제어하거나 더 나은 방법으로 자원에서 고정 된 수의 배경 중 하나를 선택하려는 경우 내부적으로 색상을 생성해야 함) . 위에서 언급 한 것처럼 런타임에 배경을 설치하려면 setBackgroundDrawable()을 사용하십시오. 판단을 통과 할 필요가 없습니다. Get-R-Done!

+0

참고 GradientDrawable 지금 setColors을 지원 : http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#setColors 16. –

+0

굉장한 확실히 API 레벨 등을 ([] INT) 헤즈 업! –

0

이 같은 GradientDrawable 클래스를 확인하십시오

public class RoundedDrawable extends GradientDrawable { 

     public RoundedDrawable(int shape, int solidColor, int strokeWidth, 
    int strokeColor, float[] fourRadii) { 

      this.mutate(); 
      this.setShape(shape); 
      this.setColor(solidColor); 
      this.setStroke(strokeWidth, strokeColor); 
      this.setCornerRadii(fourRadii); 
     } 
    } 

지금과 같이 당신의 활동에서 이것을 사용

공용 클래스 AAActivity는 활동 {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_transaction_layout); 

    RoundedDrawable customBg; 

    RelativeLayout relList = (RelativeLayout) findViewById(R.id.relList); 
    float radii[]={5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f}; 
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#FFFFFF"), 
      2, Color.parseColor("#8C8C8C"),radii); 
    relList.setBackgroundDrawable(customBg); 

    LinearLayout linearItemsRow = (LinearLayout) findViewById(R.id.linearItemsRow); 
    float[] rowRadii={5.0f, 5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f}; 
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#CBCBCB"), 
      0, 0, rowRadii); 
    linearItemsRow.setBackgroundDrawable(customBg); 


} 

}

확장

희망이 도움이 될 것입니다.

관련 문제