2

ズーム可能でパン可能なマップ(単なるビットマップ画像)を表示するAndroidアプリケーションを開発しようとしています。これにより、ユーザーはマップ上の特定のポイントをクリックすることもできます。

私はそのようなアプリを実装するための最も効果的な方法を見つけるのに苦労しています。他の多くの方法(Webviews、OpenLayersを含む)を試した後、(少なくともこのサイトによれば)最良の方法は、CanvasでSurfaceViewを使用することのようです。私がこれまでに持っているコードは、インターネット全体で見つけたスニペットからつなぎ合わされているため、クラッシュするだけです。とにかく、私が達成しようとしていることのいくつかのアイデアを与えることを期待して、ここにそれを含めました:

public class Main extends Activity {

private Bitmap bmp; 
    private SurfaceView surfaceView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView)findViewById(R.id.surface);
        bmp = BitmapFactory.decodeResource(getResources(),
             R.drawable.testmapbmp);
        //decode the bitmap file

        Canvas canvas = new Canvas(bmp);
        //create a canvas from the bitmap, then display it in surfaceview
        surfaceView.draw(canvas);
    }
}

これは、アプリケーションに必要な機能を実現するための最良の方法ですか?または、特にマップのクリック可能なセクションを実装するなど、後で問題が発生する可能性がある場合は、より良い方法があります。

以前にこのようなものを作成したことがある人の助けが本当に必要なので、問題についての考えを深めることができますが、助け/ポインター/ヒントをいただければ幸いです。

ありがとう

4

1 に答える 1

2

あなたのコードは本当に正しくありません。

通常、独自のカスタムビューを作成する必要がある場合にこの種の操作を実行する場合(ViewまたはSurfaceViewを継承することにより)。Viewサブクラスでは、メソッドonDraw(Canvas)をオーバーライドし、canvasメソッドの1つを使用してキャンバスにビットマップを描画する必要があります。

パン可能およびピンチズーム可能にするには、 ScrollerクラスとScaleGestureDetectorクラスを使用する必要があります。通常、パンまたはスケーリングは、キャンバスのメソッド(回転、スケーリング、変換)を使用して、キャンバスにアフィン変換を適用することによって行われます。

SurfaceViewとViewの違いは、SurfaceViewでは別のスレッドから直接描画できることです。つまり、ある種のレンダリングループを整理して、そこから描画することができます。シンプルなゲームやアニメーション効果に適しています。ビットマップを描画するためには、これはやり過ぎであり、Viewをサブクラス化する方がはるかに簡単だと思います。

もし私があなたなら、これこれから始めます。

于 2013-03-25T14:04:14.680 に答える