Androidカスタムコントロールでの単位変換

2561 ワード

カスタムコントロールを作成するときに単位変換が必要になることがよくあります.このとき、このよく知られているツールクラスであるDisplayUtilがカスタムコントロールに表示されます.
 private void init(Context context, AttributeSet attrs) {
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DotViewLayout);
    //    indicator    10dp
    mIndicatorSpace = typedArray.getInt(R.styleable.DotViewLayout_indicator_space,
        DisplayUtil.dip2px(context, 10));

DisplayUtilソース
public class DisplayUtil {

    public static int px2dip(Context context, float px) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f);
    }

    public static int dip2px(Context context, float dp) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }
}

しかし、時にはcopyというツール類がおっくうになることもあります.その後、Android Frameworkは対応するツールクラスを提供していることがわかりました.TypedValueapplyDimension()メソッド:
    /**
     * 
     * @param unit The unit to convert from.
     * @param value The value to apply the unit to.
     * @param metrics Current display metrics to use in the conversion -- 
     *                supplies display density and scaling information.
     */
    public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

この方法は、入力されたvalue値を標準サイズに変換し、DisplayUtilに依存することなく、カスタムコントロールを使用することができます.
前の栗はこう書いていました.
mIndicatorSpace = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,getResources().getDisplayMetrics());

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DotViewLayout);
//    indicator    10dp
mIndicatorSpace = typedArray.getInt(R.styleable.DotViewLayout_indicator_space,mIndicatorSpace);

筆者は、カスタムコントロールは多くのコードを増やしたが、DisplayUtilへの依存を減らした(ははは、DisplayUtilを貼る必要はない)、私たちのカスタムコントロールのリリース時もcleanが多くなったと考えている.