フリープログラマー日記

iOS,アンドロイド開発を気ままにしながら生きてるおじさんのブログです。

第20回 setMarginがどこかに消えた!

ボタンを貼り付けました。
と言っても、見た目だけです。
なぜかというと、以前はあったはずのsetMarginが出てこない。Viewを生成し、setMerginを使おうとしても出てこない・・・謎。
今回、左ボタンは、左側のマージンを指定、右ボタンは、右側のマージン指定と考えていたのですが、この方法でボタンを配置するのは諦めました。

この謎は未だ解決していません。今までマージンを使ってやったことがないので、本当のところは良くわかりません。XMLで指定したら楽なのかもしれませんが。

そこで、2つの解決策を考えてみました。
ひとつ目は以前よく使ってた方法で、見えないViewを基準に配置し、その両側に、ボタンを配置する方法。
もう一つは、ひとつのビューを設置し、座標を計算して、ボタンに見えるように配置する方法。
できてしまえば、ボタンを貼り付けても、ビューにボタンを描いても中身は変わらないのですが。

f:id:momonga117:20180517192242p:plain

なんだかんだと考えて、2番目の方法を採用してみました。理由の一つは、プログラム上、一つのクラスにまとめることができたので、処理が書きやすくなったかなと思っています。

f:id:momonga117:20180517185206p:plain

出来上がったのがこちら。
体裁はだいたい同じになりました。
プログラムですが、呼び出す側がこちら。

        // ビューのサイズは下から横幅の15%
        EntryButtons buttons = new EntryButtons(getContext(),myWidth,myWidth*15/100);
        RelativeLayout.LayoutParams buttonsParams = new LayoutParams(
                myWidth,myWidth*15/100
        );
        buttonsParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        buttonsParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

        addView(buttons,buttonsParams);

そして呼び出される側として新しいクラスを導入しました。

public class EntryButtons extends View {

    // エントリー画面の下部の2個のボタンを作る
    private String button1Text = "メニューに戻る";
    private String button2Text = "走者選択終了";

    // このビューのサイズ
    private final int myWidth;
    private final int myHeight;


    public EntryButtons(Context context, int width, int height) {
        super(context);
        myWidth = width;
        myHeight = height;
    }

    public void firstButton() {
        button1Text = "メニューに戻る";
        button2Text = "走者選択終了";
        invalidate();
    }

    public void secondButton() {
        button1Text = "走者選択へ";
        button2Text = "決定する";
        invalidate();
    }

    @Override
    public void draw(Canvas canvas) {

        super.draw(canvas);
        Paint paint = new Paint();

        // グリーンの長方形
        paint.setColor(Color.argb(255,50,150,50));

        // 長方形のサイズを計算
        final Rect button1Rect = new Rect(
                myWidth*7/100, 0,myWidth*47/100, myHeight*2/3
        );
        final Rect button2Rect = new Rect(
                myWidth*53/100, 0,myWidth*93/100, myHeight*2/3
        );

        // 長方形を描く
        canvas.drawRect(button1Rect,paint);
        canvas.drawRect(button2Rect,paint);

        // 文字入れ
        paint.reset();
        paint.setColor(Color.WHITE);
        paint.setTextSize(myHeight*0.3f);
        paint.setTextAlign(Paint.Align.CENTER);

        canvas.drawText(button1Text,myWidth*0.27f,myHeight*0.43f,paint);
        canvas.drawText(button2Text,myWidth*0.73f,myHeight*0.43f,paint);
    }
}

途中にある2つのメソッド(firstButtonとsecondButton)は画面の切り替え時に、文字だけ変えてしまおうという手抜きですが、表示すべき文字を置き換えて、invalidate();を発行すると、drawで書き換えてくれる仕組みです。

自分で言うのもなんだけど、なんか、日曜大工的な感じがして「楽しんでるならいいんじゃない?」って思ってしまいます。

次はいよいよ、スクロールビューの設置に入ります。