

下記のようなプログラムで正方形が表示されるのですが、どの端末で見ても同じ大きさの正方形を描きたいのですがどのようにすればよいでしょうか？

0.1mm単位までは気にしませんがおおよそ同じくらいの大きさにしたいです。  
今だと端末ごとのpdxによって大きさがきまってしまいます。良い方法があればご連絡ください。

[code]

    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.view.View;
    
    
    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new CanvasV(this));
        }
    }
    
    
    public class CanvasV extends View {
        private int rectW = 200;
        private int rectH = 200;
        private Rect rect;
        private Paint paint;
    
        public CanvasV(Context context) {
            super(context);
            rect = new Rect();
            paint = new Paint();
            paint.setColor(0xFF008800);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeWidth(10);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawRect(rect, paint);
            rect.set(10, 10, rectW, rectH);
            invalidate();
        }
    }
    
[/code]

環境はAndroidStudioを使っています。


CC BY-SA 3.0
2015-04-21T13:45:42.047
9396
2015-04-21T14:18:47.770
2015-04-21T14:06:34.733
8000
8823
question
android
Androidで同じ長さの図形を描く


`dp`単位を使いましょう。  
<http://developer.android.com/intl/ja/guide/practices/screens_support.html#density-
independence>

端末によって、ピクセル密度(1インチにいくつピクセルが詰まっているか)が異なります。これが、機種によって大きさが変わる原因です。

Androidでは、`Density-independent pixel (dp)`という単位が用意されています。計算式はdp = ピクセル数 x (160
/
ピクセル密度)です。これは、160dpi(1インチに160ドット詰まっている)を基準とした単位で、ピクセル密度に依存せず、どの端末でみても同じ大きさになる単位です。

レイアウトXMLでは単位を付けることができますが、Javaコードの中ではピクセル単位で指定するので、次のようなコードでdp単位をピクセル単位にします。（先ほどの公式ドキュメントにあります）

[code]

    // The gesture threshold expressed in dp
    private static final float GESTURE_THRESHOLD_DP = 16.0f;
    
    // Get the screen's density scale
    final float scale = getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);
    
[/code]


CC BY-SA 3.0
2015-04-21T14:18:47.770
9401
2015-04-21T14:18:47.770
845
9396
answer