質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

324閲覧

カスタムビューのcanvasの高さを等分したのに、描画すると誤差がでる。

valval

総合スコア43

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/04/14 13:20

編集2018/04/17 10:51

お世話になります。

MainActivityに

java

1public class MainActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 } 6 7 @Override 8 protected void onResume() 9 { 10 11 super.onResume(); 12 //ナビゲーションバー等を引っ込める 13 int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ; 14 Window window = getWindow(); 15 View view = window.getDecorView(); 16 view.setSystemUiVisibility(visibility); 17 } 18}

と置き、ナビゲーションバーを引っ込めました。
次に、activity_main.xmlにオリジナルビューを配置し、このクラスの定義を、

java

1 2public class originalView extends View { 3 4 Paint paint=new Paint(); 5 private float val=0; 6 7 public originalView(Context context) { 8 super(context); 9 } 10 11 public originalView(Context context, AttributeSet attrs) { 12 super(context, attrs); 13 } 14 15 public originalView(Context context, AttributeSet attrs, int defStyleAttr) { 16 super(context, attrs, defStyleAttr); 17 18 // このへんで初期化処理 19 20 } 21 @Override 22 protected void onDraw(Canvas canvas) { 23 if(val==0) 24 { 25 val=canvas.getHeight()/16.0f; 26 } 27 paint.setColor(Color.WHITE); 28 canvas.drawRect(0,0,canvas.getWidth(),canvas.getHeight(),paint); 29 int x,y; 30 paint.setColor(Color.RED); 31 32 //正方形を描き、画面に敷き詰める。画面の際に線を引かない 33 for(y=1;y<16;y++) 34 canvas.drawLine(0,y*val,canvas.getWidth(),y*val,paint); 35 36 for(y=1;y<9;y++) 37 canvas.drawLine(y*val,0,y*val,canvas.getHeight(),paint); 38 39    //各グリッドに×を描画 40 for(y=0;y<16;y++) 41 { 42 for(x=0;x<9;x++) 43 { 44 canvas.drawLine(x*val,y*val,(x+1)*val,(y+1)*val,paint); 45 canvas.drawLine((x+1)*val,y*val,x*val,(y+1)*val,paint); 46 } 47 } 48 } 49}

と置いて、正方形で画面を敷き詰め、各マスに×を描画しました。

しかし、なぜか、最下段と最も右の列の×が、画面際と接することがありません。
誤差が発生しているようです。
しかも、色むらがあり、線の色が均等ではありません。
上記のスクリーンショットは、下記の図の通りです。

イメージ説明

valの型をdoubleにしても同じでした。
どうすれば、この誤差を解消し、正方形で敷き詰めることができますか。

プログラムを走らせた実機はHUAWEI mate9です。

宜しくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/04/16 13:55

その状態のスクリーンショットを載せていただけませんか?
valval

2018/04/17 10:48

ご返事をありがとうございます。スクリーンショットを本文に掲示しました。
guest

回答1

0

ベストアンサー

最下段と最も右の列の×が、画面際と接することがありません

誤差が発生している

16:9を想定してコーディングされているようですが
その想定が正しくない結果だと思います

考えられる原因としては

HUAWEI mate9のLCDサイズが?

android端末が全て16:9とは限らない
例えば Pixel 2XL は1:2です(iPhone X に対抗しているのでしょうか)
リンク内容

物理的な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()よりはいいでしょう

Dipに換算してかつ整数を使う
例えば正方形にきっちりこだわる時は
DPIあるいはDIPを取得してそれをもとに計算した方がいいかもしれません
ただ見た目大きく異なるケースでなければここまでしなくてもいいかもしれません

投稿2018/04/29 02:32

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

valval

2018/04/29 08:40

わかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問