割合に応じて背景をグラデーションする
Androidで背景のグラデーションをプログラミングで実現したいのですが、コンポーネントの途中まででグラデーションを完了させたい場合どうすればよいのでしょうか?グラデーションを途中で停止するという意味ではなく、コンポーネントのサイズの途中まででグラデーションを遣り切るという意味です。
下記の画像のようなことをXMLの定義ではなく、プログラミングで動的にやってみたいということです。
Web検索しても、それらしい情報が見つけられませんでした。正当な方法も思いつかず、、、。苦肉の策ですが、下記のようにGradientDrawable#setColors
の色の指定自体を、少しずつ色を変化させるのが手っ取り早いと思いました。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getTextView(R.id.foo0).setBackground(getGradientDrawable(5,0));//グラデーションなし getTextView(R.id.foo1).setBackground(getGradientDrawable(5,1));//左から2割だけでグラデーションする getTextView(R.id.foo2).setBackground(getGradientDrawable(5,2));//左から4 getTextView(R.id.foo3).setBackground(getGradientDrawable(5,3));//左から6 getTextView(R.id.foo4).setBackground(getGradientDrawable(5,4));//左から8 getTextView(R.id.foo5).setBackground(getGradientDrawable(5,5));//全体でグラデーションする } private TextView getTextView(int rsId) { return (TextView)this.findViewById(rsId); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private GradientDrawable getGradientDrawable(int size, int ratio) { GradientDrawable drawable = new GradientDrawable(); drawable.mutate(); drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT); int[] colors = new int[size]; for (int i = 0; i < size; i++) { colors[i] = Color.rgb( i < ratio ? 255/ratio*i : 255, 255, i < ratio ? 255/ratio*i : 255 ); } drawable.setColors(colors); return drawable; }