フリープログラマー日記

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

第4回 swift & javaで正方形を描くプログラム

いやー、プログラムって本当に楽しいですね〜

今日のお題は、「正方形を描く」です。
今回作って見たのは単純なものです。
見た目を合わせるために、サイズは短辺の20%としています。
もちろんこれだけであれば、ストーリーボードを使ったり、
XMLファイルを編集するだけでもできるのですが、
複雑な画面を作り込んでいくためには、
「プログラムが必要」というのが私の結論なわけです。


f:id:momonga117:20180505153722p:plain

では、ソースコードを公開しますね。

まず、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に代入してはダメって怒られます。
整数演算をしておく必要があるっていうことですね。

レイアウトのやり方はiOSAndroidではかなり違うので
あんまり、たくさんのUIView(View)をおくのは避けたいところです。