IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

割合に応じて背景をグラデーションする

Androidで背景のグラデーションをプログラミングで実現したいのですが、コンポーネントの途中まででグラデーションを完了させたい場合どうすればよいのでしょうか?グラデーションを途中で停止するという意味ではなく、コンポーネントのサイズの途中まででグラデーションを遣り切るという意味です。

下記の画像のようなことをXMLの定義ではなく、プログラミングで動的にやってみたいということです。

f:id:naotoogawa:20150519000502p:plain

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;
    }