第4回 swift & javaで正方形を描くプログラム
いやー、プログラムって本当に楽しいですね〜
今日のお題は、「正方形を描く」です。
今回作って見たのは単純なものです。
見た目を合わせるために、サイズは短辺の20%としています。
もちろんこれだけであれば、ストーリーボードを使ったり、
XMLファイルを編集するだけでもできるのですが、
複雑な画面を作り込んでいくためには、
「プログラムが必要」というのが私の結論なわけです。
では、ソースコードを公開しますね。
まず、iOS(swift)から。
AppDelegate. swiftから呼び出すファイルを
Entrance.swiftにしました。
import UIKit class Entrance: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func viewDidAppear(_ animated: Bool) { // UIScreennクラスが端末サイズを持っている let width: CGFloat = UIScreen.main.bounds.size.width let height: CGFloat = UIScreen.main.bounds.size.height // UView インスタンスを作成。 let aSquare = UIView() aSquare.backgroundColor = UIColor.blue // 背景色は青色 // 正方形の一辺の長さは短辺の20%にする let aSideLength: CGFloat = width>height ? height*20/100 : width*20/100 // ビューのサイズを設定 aSquare.frame = CGRect(x: 0, y: 0, width: aSideLength, height: aSideLength) aSquare.center = CGPoint(x: width/2, y: height/2) self.view.addSubview(aSquare) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
続いて、Andoroid(java)のプログラム。
こちらも、MainActivity.javaから呼び出されるファイルを
Entrance.javaとしました。
なお、iOSで、viewDidAppearに当たるものとして
enterMenuという開始ポイントを設定しています。
これは、OnGrovalLayoutListenerの中から呼ばれています。
import android.content.Context; import android.graphics.Color; import android.view.View; import android.widget.RelativeLayout; public class Entrance extends RelativeLayout { public Entrance(Context context) { super(context); this.setBackgroundColor(Color.WHITE); } public void enterMenu(Context context) { // 端末のサイズを取得 final int width = this.getWidth(); final int height = this.getMeasuredHeight(); // View のインスタンスを作成。 View aSquare = new View(context); aSquare.setBackgroundColor(Color.BLUE); // 背景色は青色 // 正方形の一辺の長さは短辺の20%にする final int aSideLength = width>height ? height*20/100 : width*20/100; // Androidではレイアウトパラメーターを使用 LayoutParams aSquareParams = new LayoutParams( aSideLength,aSideLength ); aSquareParams.addRule(CENTER_IN_PARENT); aSquareParams.addRule(CENTER_IN_PARENT); // ビューを画面中央に表示 addView(aSquare, aSquareParams); } }
(参考)MainActivity.java(一部抜粋)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; // レイアウトを作成。 final Entrance entrance = new Entrance(this); setContentView(entrance); // リスナーを設置し、サイズを求める。 mListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { removeListener(entrance.getViewTreeObserver(),mListener); entrance.enterMenu(mContext); } }; entrance.getViewTreeObserver().addOnGlobalLayoutListener(mListener); }
今回の注目は、UIView(View)の作成のところ。
似てるといえば似てるし、違うといえば違う。
色は背景色で指定するもの、
swiftは=あり。プロパティに代入ですか。
aSquare.backgroundColor = UIColor.blue
かたや、javaはメソッド呼び出しですね。
aSquare.setBackgroundColor(Color.BLUE);
一辺の長さを縦横の対応を取るため、短い方の20%にしました。
この両者の三項演算子は、似ていていいです。
ただし、javaで
final int aSideLength = width>height ? height*0.2 : width*0.2;
とやるとダメです。
Duobleをintに代入してはダメって怒られます。
整数演算をしておく必要があるっていうことですね。
レイアウトのやり方はiOSとAndroidではかなり違うので
あんまり、たくさんのUIView(View)をおくのは避けたいところです。