第20回 setMarginがどこかに消えた!
ボタンを貼り付けました。
と言っても、見た目だけです。
なぜかというと、以前はあったはずのsetMarginが出てこない。Viewを生成し、setMerginを使おうとしても出てこない・・・謎。
今回、左ボタンは、左側のマージンを指定、右ボタンは、右側のマージン指定と考えていたのですが、この方法でボタンを配置するのは諦めました。
この謎は未だ解決していません。今までマージンを使ってやったことがないので、本当のところは良くわかりません。XMLで指定したら楽なのかもしれませんが。
そこで、2つの解決策を考えてみました。
ひとつ目は以前よく使ってた方法で、見えないViewを基準に配置し、その両側に、ボタンを配置する方法。
もう一つは、ひとつのビューを設置し、座標を計算して、ボタンに見えるように配置する方法。
できてしまえば、ボタンを貼り付けても、ビューにボタンを描いても中身は変わらないのですが。
なんだかんだと考えて、2番目の方法を採用してみました。理由の一つは、プログラム上、一つのクラスにまとめることができたので、処理が書きやすくなったかなと思っています。
出来上がったのがこちら。
体裁はだいたい同じになりました。
プログラムですが、呼び出す側がこちら。
// ビューのサイズは下から横幅の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で書き換えてくれる仕組みです。
自分で言うのもなんだけど、なんか、日曜大工的な感じがして「楽しんでるならいいんじゃない?」って思ってしまいます。
次はいよいよ、スクロールビューの設置に入ります。