9

半年ほど前にAndroid開発を始めた「初心者」です。私はこのトピックに非常に熱心で、いくつかの本を読みました。

それらの本によって、私はAndroid のしくみについて多くのことを理解することができました。しかし、今私に欠けているのは…経験です。そこで私は、巨大な地下鉄路線図を表示することを目標とするプロジェクトに貢献することにしました。もちろん、プロジェクトの目標はもっと広いですが、それについて話すことはこの質問には関係ありません。

マップは、アプリケーションのパッケージにオフラインで保存されます。

何を使う?

  • 私のアプリケーションの地図は Google マップとほとんど関係がないため、Google マップは使用できません。
  • 単純な ImageView を使用してマップを表示することは「不可能」です。ズーム、パンなどがサポートされておらず、これを自分でコーディングすることは私の能力をはるかに超えているためです。
  • 私が見つけた唯一の良い回避策は、ズームとパンがサポートされているため、WebView を使用することです。

また、大きな画像を 1 つだけ使用してもうまくいきません。画像の品質が極端に低下します。

問題は何ですか

  • 画像が 1300px を超えると Android が自動的に品質を下げるため、単一の画像を使用することはできません (上記のリンクを参照)。
  • 最小 2000 ピクセルの解像度でマップを表示したい ( xhdpi画面は 1280 ピクセル幅の画面に画像全体を表示しますが、ズームもできるようにしたい)。
    • APK のファイルサイズが大幅に増加する限り、複数密度のイメージ ( ldpimdpihdpi、およびxhdpiデバイスの異なるバージョン) を使用することはできません…</li>
  • マップを 5 つの異なるタイルに分割し、すべての画面密度に対して 1 つの画像のみを使用することで、 WebView のパフォーマンスがひどいことを除けば、すべてが悪くないように見えます。

その最後のソリューションのコード

巨大なマップを 5 つの異なるマップ タイルに分割します。これらは基本的に横向きの四角形です。それらすべて (map[1-5].jpg) と HTML ファイル (map.html) を ./assets/ フォルダーに入れます。HTML ファイルのコードは次のとおりです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Huge map</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <meta name="viewport" content="user-scalable=yes, height=device-height, target-densityDpi=device-dpi">

    <style type="text/css">
    html, body, p, img { margin: 0; }
    img { border: 0; }
    p { height: 100%; min-height: 100%; }
    </style>
</head>
<body>
<p><!-- Displaying a 2000×2000px map -->
    <img src="file:///android_asset/map1.jpg" alt=""><br> <!-- 2000×408px -->
    <img src="file:///android_asset/map2.jpg" alt=""><br> <!-- 2000×408px -->
    <img src="file:///android_asset/map3.jpg" alt=""><br> <!-- 2000×408px -->
    <img src="file:///android_asset/map4.jpg" alt=""><br> <!-- 2000×408px -->
    <img src="file:///android_asset/map5.jpg" alt=""> <!-- 2000×368px -->
</p>
</body>
</html>

次に、これを Java コードにロードして、レイアウト (WebView にすぎません) に適用します。

import me.diti.test.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MapActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map); // ./res/layout/map.xml with a <WebView>

        WebView mWebView = (WebView) findViewById(R.id.mapWebView); // The WebView’s id is mapWebView

        WebSettings webSettings = mWebView.getSettings();
            webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); // Attempt at getting better performance…
            webSettings.setAppCacheEnabled(false); // Offline map: no need for cache
            webSettings.setLoadWithOverviewMode(true);
            webSettings.setUseWideViewPort(true);
            webSettings.setSupportZoom(true);
            webSettings.setBuiltInZoomControls(true);

        mWebView.setInitialScale(100);
        mWebView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

        mWebView.loadUrl("file:///android_asset/map.html"); // We load the map (includes 5 big images)

    }

/* This is a minimal “working” example, no need for menu inflation and activity handling */

アプリの実行

私の質問

優れたパフォーマンスと比較的使いやすい巨大なカスタム マップを表示するための最良の方法は何ですか? 私の解決策は受け入れられますか? 欠陥を修正する方法は?そのすべて (カスタム マップ、WebView のパフォーマンス) に関する StackOverflow の質問をたくさん読みましたが、どれも役に立ちませんでした。

どうぞよろしくお願いいたします。

4

2 に答える 2

1

ズームやパンなどはサポートされていないため、単純なImageViewを使用してマップを表示することは「不可能」であり、これを自分でコーディングすることは私の能力をはるかに超えています。

このImageViewようなパンとズーム用のサードパーティのコードを見つけることができますが、それはおそらくあなたを助けません。

優れたパフォーマンスと比較的使いやすい、巨大なカスタムマップを表示するための最良の方法は何ですか?

タイルベースのマップビューアを使用します。OSMDroidはこれをある程度サポートしています。

于 2012-05-06T14:42:33.320 に答える
1

大きな画像をタイルに分割することは良いアプローチだと思いますが、5 つの画像よりもさらに多くの画像を使用する必要があると思います。10x10 グリッドで 100 個の 200x200 画像 (または 8x8 グリッドで 64 個の 250x250 画像など) に分割してみてください。次に、 a を使用<table>して既存の に表示しますWebView

<table cellpadding="0" cellspacing="0" border="0">
    <tr>
        <td><img src="file:///android_asset/map00.00.jpg" border="0"></td>
        <td><img src="file:///android_asset/map00.01.jpg" border="0"></td>
        ...
        <td><img src="file:///android_asset/map00.09.jpg" border="0"></td>
    </tr>
    <tr>
        <td><img src="file:///android_asset/map01.00.jpg" border="0"></td>
        <td><img src="file:///android_asset/map01.01.jpg" border="0"></td>
        ...
        <td><img src="file:///android_asset/map01.09.jpg" border="0"></td>
    </tr>
    ...
</table>
于 2012-05-06T15:11:40.667 に答える