365連休

にわかのandroidとかの開発メモ。

Android Studioでアスペクト比を表すクラスを作ってみた

HashMapのキーにアスペクト比を設定したくて作ってみた。

Map<Aspect, HashSet<Camera.Size>>

↑こういうのをしたい

 

コピペは自己責任で。

バグっても責任取れませんので。

 

Javaの事はよく知らないので、比較はfloatじゃなく100倍したintを使用。

コンストラクタでアスペクト比を計算して、クラス変数で保持するとなお良さそう。

改良はこれを読んでいる貴方への課題ということで。

 

equals()とhashCode()さえオーバーライドすればいいみたい。

JavaならAndroid以外でも動く?かも

 

 

import java.io.Serializable;

/** アスペクト比を表すクラス、インスタンス化したら変更はできないつくり */
public class Aspect extends Object implements Serializable {
    private static final long serialVersionUID = 1L;

    //実際のwidth, heightは重要でないためprivate
    private int w;
    private int h;

    //一般的なアスペクト比
    public static final int A_235_1 = 235;
    public static final int A_18_9 = 200;
    public static final int A_16_9 = 178;
    public static final int A_16_10 = 160;
    public static final int A_3_2 = 150;
    public static final int A_SQRT2_1 = 141;
    public static final int A_4_3 = 133;
    public static final int A_5_4 = 125;
    public static final int A_1_1 = 100;

    /**
     * @param w 長辺
     * @param h 短辺
     */
    public Aspect(int w, int h){
        this.w = w;
        this.h = h;
    }
    /** アスペクト比を小数第2位で丸めた数値 */
    public float getRoundAspect(){
        return (float)Math.round((float)w/h*100)/100;
    }
    /** アスペクト比を小数第2位で丸めた文字列 */
    public String getRoundAspectString(){
        return String.format("w/h=%.2f", (float)w/h);
    }
    /** アスペクト比を100倍して四捨五入した値 */
    public int getRoundAspect100(){
        return Math.round((float)w/h*100);
    }
    @Override
    public String toString(){
        switch(this.getRoundAspect100()){
            case Aspect.A_235_1:return "2.35:1";
            case Aspect.A_18_9:return "18:9";
            case Aspect.A_16_9:return "16:9";
            case Aspect.A_16_10:return "16:10";
            case Aspect.A_3_2:return "3:2";
            case Aspect.A_SQRT2_1:return "Paper";
            case Aspect.A_4_3:return "4:3";
            case Aspect.A_5_4:return "5:4";
            case Aspect.A_1_1:return "1:1";
            default:return this.getRoundAspectString();
        }
    }

    /** 同一のアスペクト比かどうか */
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Aspect)) { //nullもはじかれる
            return false;
        }
        return this.getRoundAspect100() == ((Aspect) obj).getRoundAspect100();
    }

    /** 同一のアスペクト比かどうか */
    public boolean equals(int pW, int pH) {
        return this.equals(new Aspect(pW, pH));
    }

    /** return getRoundAspect100() */
    @Override
    public int hashCode() {
        return this.getRoundAspect100();
    }

}