質問編集履歴

3 問題点を追記

valval

valval score 16

2018/04/17 19:51  投稿

カスタムビューのcanvasの高さを等分したのに、描画すると誤差がでる。
お世話になります。
MainActivityに
```java
public class MainActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
   }
   @Override
   protected void onResume()
   {
       super.onResume();
       //ナビゲーションバー等を引っ込める
       int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ;
       Window window = getWindow();
       View view = window.getDecorView();
       view.setSystemUiVisibility(visibility);
   }
}
```
と置き、ナビゲーションバーを引っ込めました。
次に、activity_main.xmlにオリジナルビューを配置し、このクラスの定義を、
```java
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);
            }
       }
   }
}
```
と置いて、正方形で画面を敷き詰め、各マスに×を描画しました。
しかし、なぜか、最下段と最も右の列の×が、画面際と接することがありません。
誤差が発生しているようです。
上記の結果は、下記の図の通りです。
しかも、色むらがあり、線の色が均等ではありません。
上記のスクリーンショットは、下記の図の通りです。
![イメージ説明](3f356977692400aaef3a548b9a654f4a.jpeg)
valの型をdoubleにしても同じでした。
どうすれば、この誤差を解消し、正方形で敷き詰めることができますか。
プログラムを走らせた実機はHUAWEI mate9です。
宜しくお願い申し上げます。
  • Java

    15865 questions

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

  • Android Studio

    4303 questions

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

2 書き出した図を提示

valval

valval score 16

2018/04/17 19:48  投稿

カスタムビューのcanvasの高さを等分したのに、描画すると誤差がでる。
お世話になります。
MainActivityに
```java
public class MainActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
   }
   @Override
   protected void onResume()
   {
       super.onResume();
       //ナビゲーションバー等を引っ込める
       int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ;
       Window window = getWindow();
       View view = window.getDecorView();
       view.setSystemUiVisibility(visibility);
   }
}
```
と置き、ナビゲーションバーを引っ込めました。
次に、activity_main.xmlにオリジナルビューを配置し、このクラスの定義を、
```java
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);
            }
       }
   }
}
```
と置いて、正方形で画面を敷き詰め、各マスに×を描画しました。
しかし、なぜか、最下段と最も右の列の×が、画面際と接することがありません。
誤差が発生しているようです。
上記の結果は、下記の図の通りです。  
 
![イメージ説明](3f356977692400aaef3a548b9a654f4a.jpeg)  
 
 
valの型をdoubleにしても同じでした。
どうすれば、この誤差を解消し、正方形で敷き詰めることができますか。
プログラムを走らせた実機はHUAWEI mate9です。
宜しくお願い申し上げます。
  • Java

    15865 questions

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

  • Android Studio

    4303 questions

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

1 対応策を追記

valval

valval score 16

2018/04/15 08:27  投稿

カスタムビューのcanvasの高さを等分したのに、描画すると誤差がでる。
お世話になります。
MainActivityに
```java
public class MainActivity extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
   }
   @Override
   protected void onResume()
   {
       super.onResume();
       //ナビゲーションバー等を引っ込める
       int visibility = View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ;
       Window window = getWindow();
       View view = window.getDecorView();
       view.setSystemUiVisibility(visibility);
   }
}
```
と置き、ナビゲーションバーを引っ込めました。
次に、activity_main.xmlにオリジナルビューを配置し、このクラスの定義を、
```java
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.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);
            }
       }
   }
}
```
と置いて、正方形で画面を敷き詰め、各マスに×を描画しました。
しかし、なぜか、最下段と最も右の列の×が、画面際と接することがありません。
誤差が発生しているようです。
valの型をdoubleにしても同じでした。  
どうすれば、この誤差を解消し、正方形で敷き詰めることができますか。
プログラムを走らせた実機はHUAWEI mate9です。
宜しくお願い申し上げます。
  • Java

    15865 questions

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

  • Android Studio

    4303 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る