質問: window.getDecorView(); view.setSystemUiVisibility(visibility); } } ``` と置き、ナビゲーションバーを引っ込めました。 次に、activity_main.xmlにオリジナルビューを配置し、このクラスの定義を、 ``` public class originalView extends View { Paint paint=new Paint(); private float val=0; public originalView(Context context) { super(context); } public originalView(Context context, AttributeSet attrs) { super(context, attrs); } public originalView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // このへんで初期化処理 } @Override protected void onDraw(Canvas canvas) { if(val==0) { val=canvas.getHeight()/16.0f; } paint.setColor(Color.WHITE); canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(),paint); int x,y; paint.setColor(Color.RED); //正方形を描き、画面に敷き詰める。画面の際に線を引かない for(y=1;y<16;y++) canvas.drawLine(0,y*val,canvas.getWidth(),y*val,paint); for(y=1;y<9;y++) canvas.drawLine(y*val,0,y*val,canvas.getHeight(),paint); //各グリッドに×を描画 for(y=0;y<16;y++) { for(x=0;x<9;x++) { canvas.drawLine(x*val,y*val,(x+1)*val,(y+1)*val,paint); canvas.drawLine((x+1)*val,y*val,x*val,(y+1)*val,paint); } } } } ``` と置いて、正方形で画面を敷き詰め、各マスに×を描画しました。 しかし、なぜか、最下段と最も右の列の×が、画面際と接することがありません。 誤差が発生しているようです。 しかも、色むらがあり、線の色が均等ではありません。 上記のスクリーンショットは、下記の図の通りです。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/3f356977692400aaef3a548b9a654f4a.jpeg) valの型をdoubleにしても同じでした。 どうすれば、この誤差を解消し、正方形で敷き詰めることができますか。 プログラムを走らせた実機はHUAWEI mate9です。 宜しくお願い申し上げます。
回答: > > 最下段と最も右の列の×が、画面際と接することがありません > > 誤差が発生している > > > 16:9を想定してコーディングされているようですが その想定が正しくない結果だと思います 考えられる原因としては 1) HUAWEI mate9のLCDサイズが? android端末が全て16:9とは限らない 例えば Pixel 2XL は1:2です(iPhone X に対抗しているのでしょうか) リンク内容 2) 物理的なLCDのサイズ、real display areaのフル画面表示になっていない Navigation bar が残っているのではないでしょうか setSystemUiVisibility()にはこれくらい必要では ``` int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE ; ``` リンク内容 実際どうなっているか canvas.getWidth() canvas.getHeight() のログを取って確認してみましょう ここは実際の縦横を計算して端末ごとに合うようにするべきところでしょうか > > 色むらがあり、線の色が均等ではありません > > > 1 pixelはRGBなど通常3色が集まって白のpixelになっているため 物理的な構造を考える必要が多々出てきます この位置のズレはまたLCDメーカーによって異なる可能性もあります(配置の違い) それをどの程度端末のシステムで吸収しているかは計り知れない ``` val=canvas.getHeight()/16.0f; ``` 1pixel以下の小数点になるのが良いかか悪いか Androidにはあまり関係ないところでしょう 解決案としては 1) 1 pixelのラインにしているのが問題を複雑にしているので storokewidth を2pixel, 3pixelにするのが手っ取り早い 解像度が高いLCDであれば見た目の影響があまりない ``` paint.setStrokeWidth(2); ``` paintの設定などダイナミックでないものはコンストラクタで設定するほうが onDraw()よりはいいでしょう 1) Dipに換算してかつ整数を使う 例えば正方形にきっちりこだわる時は DPIあるいはDIPを取得してそれをもとに計算した方がいいかもしれません ただ見た目大きく異なるケースでなければここまでしなくてもいいかもしれません