Map3 のものをそのままコピーした[2024.1.25]。
android:theme="@style/Theme.Map3" を android:theme="@style/Theme.Map4" に変更した。
@drawable/ic_map_blue24は Map3 のものを Map4 にコピーした。
位置情報取得サービスは後ほど実装するので、ひとまずは、コメントアウトした。
<!--service android:name=".LocationUpdatesService" android:enabled="true" android:exported="false"/-->
以上でエラーは取れた。
Map3 のものをそのままコピーした[2024.1.25]。
class Map extends View はまだ実装していないので、ひとまず、コメントアウトした。
<!--com.example.map4.Map android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" /-->
ここで、タブレットに繋いで、USBデバッグを開始した。
多くのエラー(15)が出るが、まずは最初のエラーに対応する。 Map3 と同様に、compileSdk、targetSdk を 32 から 34 に変更した。
これで最初の画面は表示された。
1. Dependency 'androidx.appcompat:appcompat-resources:1.6.1' requires libraries and applications that depend on it to compile against version 33 or later of the Android APIs. :app is currently compiled against android-32. Recommended action: Update this project to use a newer compileSdkVersion of at least 33, for example 33.
メニューを Map3 から Map4 にコピーした。ここで使われているアイコンを Map3 から Map4 にコピーした。
メニューを表示するには、MainActivityにコードが必要である。
現段階では以下の通りである。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
レイアウト画面は setContentView(R.layout.activity_main) によって表示される。 ツールバーの表示方法は他にもあるかも知れないが、Map3 と同じ方法をとった。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.my_toolbar, menu); MenuCompat.setGroupDividerEnabled(menu, true); return true; } }
ボタンやメニュー項目のタップに反応して、対応する処理を行うには、別途、コードが必要であるが、 その必要性が生じたときに追加する。
レイアウトに地図を表示する View を置く。コメントアウトしたものを有効に戻す。 class Mapに地図表示に関わるデータやコードが置かれる。
描画処理は onDraw に記述する。
public class Map extends View { public Map(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 描画処理 } }
だんだん複雑になるため、ここで、最初のプログラムを記載しておく。 プログラムは MainActivity と Map の二つだけである。
zoom は 18 で固定であるが、X、Y座標は指を動かせば変わり、画面中心のタイル座標を 画面左下に表示するようになっている。
OSMバイナリレコード形式を大幅に変更するため、メモリ使用量や処理時間を計測するための 下準備を行っている。
public class MainActivity extends AppCompatActivity { private Map map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = findViewById(R.id.map_view); // Mapインスタンス生成 map.textViewBottom = findViewById(R.id.bottom_view); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.my_toolbar, menu); MenuCompat.setGroupDividerEnabled(menu, true); return true; } } public class Map extends View { TextView textViewTop, textViewBottom, ele_view, speed_view, copyright; static int PX = 256; // タイルの画素数 int zoom = 18; int CX=(232825*PX), CY=(103226*PX); // 地図中心タイル座標(単位:画素) private int currTX = -1, currTY = -1; // 地図中心タイル座標(単位:タイル) private int MarkX = -1, MarkY = -1; // クライアントウィンドウ座標(画素単位) public Map(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 描画処理 if (CX/PX != currTX || CY/PX != currTY) { String str = zoom + "_" + (currTX=CX/PX) + "_" + (currTY=CY/PX); textViewBottom.setText(str); } // 画面中央のタイル座標を表示する } @Override public boolean onTouchEvent(MotionEvent motionEvent) { int eX = (int) motionEvent.getX(); int eY = (int) motionEvent.getY(); switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: MarkX = eX; MarkY = eY; break; case MotionEvent.ACTION_MOVE: if (MarkX < 0) break; CX -= eX - MarkX; // 指/マウスを動きに応じて CY -= eY - MarkY; // 地図の中心座標を変更する MarkX = eX; MarkY = eY; break; case MotionEvent.ACTION_UP: MarkX = -1; MarkY = -1; break; default: return false; } invalidate(); // onDrawが呼び出される return true; } }
アプリの現在のメモリ使用量を表示するようにした。 現時点では 4MB であった。地図データはまだ一切ないため、当然の値である。
この後、OSMバイナリレコードなどを読み込んだ時、どれくらいの大きさになるかを調べる。