kojiko-android’s blog

開発中にハマった時の解決策や、忘れがちなことを残しておきます。

Shapeで真円のボタンをコードで生成する

ボタンの背景に真円を使いたい時、とりあえず簡単に実装したい時に。

f:id:kentaro198477:20171017182545p:plain
iOSの電卓風のボタンです

Buttonを継承したカスタムButtonクラスを作り、以下のメソッドを追加し、onLayout等で呼び出します。

    public void setSolidColor(final int color){

        int w = getWidth();
        int h = getHeight();

        final int r = Math.min(w,h) / 2;

        final int cX = w / 2;
        final int cY = h / 2;

        Shape s = new Shape() {
            @Override
            public void draw(Canvas canvas, Paint paint) {
                paint.setColor(color);
                paint.setAntiAlias(true);
                canvas.drawCircle(cX,cY,r ,paint);
            }
        };

        ShapeDrawable sd = new ShapeDrawable(s);
        RippleDrawable rd = new RippleDrawable(ColorStateList.valueOf(Color.WHITE),sd,sd);
        setBackgroundDrawable(rd);
    }

xmlでリソースを書くことも無く、とりあえず簡単に実装できます。
リップルエフェクトも実装しているので、マテリアル的なタッチフィードバックも実現できています。
また、動的に色を変えたい時も上記のメソッドを呼べばいいので、色のカスタマイズ機能を実装する時も
ドロワーブルを取り出してカラーフィルターをかけて…としなくても良いので簡単だと思います。
等間隔に配置するなど工夫するとよりキレイなデザインになると思うので、いろいろやってみてください。



楕円のボタンなど古臭くて使わないと思うので、真ん丸のリソースくらい簡単に書けるようになってほしいですねぇ。