Androidカスタムコントロールでの単位変換
2561 ワード
カスタムコントロールを作成するときに単位変換が必要になることがよくあります.このとき、このよく知られているツールクラスであるDisplayUtilがカスタムコントロールに表示されます.
DisplayUtilソース
しかし、時にはcopyというツール類がおっくうになることもあります.その後、Android Frameworkは対応するツールクラスを提供していることがわかりました.
この方法は、入力された
前の栗はこう書いていました.
筆者は、カスタムコントロールは多くのコードを増やしたが、
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は対応するツールクラスを提供していることがわかりました.
TypedValue
のapplyDimension()
メソッド: /**
*
* @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が多くなったと考えている.