18

画像を表示したい (スクロールおよびズーム機能を含む)。さらに、いくつかのオーバーレイを画像に動的に追加する必要があります。オーバーレイは、画像内のコンテンツと関係があります。

  • ユーザーがスクロールすると、オーバーレイも移動する必要があります
  • ユーザーがズームした場合、オーバーレイはズームされず、画像に対する相対位置を保持する必要があります

つまり、いくつかのマーカーを使用してマップを実装したいのですが、独自のマップ マテリアルを提供します。

私の主な質問は次のとおりです。どうすればこれを行うことができますか?

これまでに試したこと

  • 基本的なズームおよびスケーリング機能を提供するため、 WebView内に実装しようとしました。ただし、Javascript と HTML を使用せずにオーバーレイを追加することに成功しませんでした (問題を解決するのにあまり便利な方法ではないと思いました)。
  • スクロール/ズーム機能を実装しているプロジェクト(つまりTouchImageView)がありますが、私の観点からは独自のオーバーレイ機能を追加するのがさらに難しくなっています。

質問

私の問題に対する簡単な解決策またはアプローチはありますか?

Androidで実行時にビューを追加および移動する正しい方法は何ですか? (通常、基本的なレイアウトを使用して余白を調整します。これがベスト プラクティスでしょうか?)

誰かが私を正しい方向に向けてくれませんか。

最小。API レベル: 10

4

5 に答える 5

3

Viewクラスを拡張してメソッドをオーバーライドすることをお勧めしますonDrawCanvas APIを見てください。

おそらく次のような onDraw メソッドがあるでしょう:

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.translate(mPosX, mPosY); //position of your actual data
    canvas.scale(mScaleFactor, mScaleFactor); // zoom factor
    map.draw(canvas); //you draw your map here
    canvas.restore(); //go back to saved state 
    //for each marker you have, do the same "save - translate - scale - draw" loop        
}

マーカーをズーム可能にする必要はないため、スケール ステップはおそらく必要ありませんが、マーカーの位置を適切に計算する必要があります。

オブジェクトの数などによっては、マーカーを描画するためのより最適化された方法が必要になる場合があります (たとえば、変更された長方形の領域のみを再描画します)。View.invalidate(Rect)を参照してください

于 2013-01-02T06:09:20.550 に答える
1

ビューをサブクラス化し、ユーザーのジェスチャーを自分で処理しようとしましたか? これは、複雑な動作自体に対する私の最初の選択です。次のようになります。

  • View を拡張するクラスでは、作成時に必要な画像とオーバーレイを Bitmap オブジェクトとしてインスタンス化する必要があります。
  • OnScroll イベントでは、スクロール後に画像とオーバーレイがどのようになるかを計算し、ビットマップを更新して現在のビューを無効にします
  • GestureDetector を使用すると、ピンチ イベントを処理し、ズームイン/ズームアウト イベントをスクロール イベントと同じように扱うことができます。
  • ビットマップを変更した後は、常に無効化を呼び出すことを忘れないでください
  • onDraw メソッド中にビットマップを描画します

StackOverflow には、この個々のタスクに関する資料がたくさんあります。これらのいずれかで追加のヘルプが必要な場合はお知らせください。

于 2012-12-31T13:05:43.233 に答える
1

私はこれがあなたを助けることができると思います

このプロジェクトを参照リンク

それをクリックすると、画像の自動スクロールと画像のズームがあります。

于 2012-12-22T17:40:18.890 に答える
1

このサンプル プロジェクトをチェックしてください https://github.com/jzafrilla/AndroidImageHostpot

于 2013-04-24T12:03:32.983 に答える
1

長い間、私は自分のソリューションに対する正確な答えを見つけました:TileView

マップ ビューの設定:

@Override
protected void onCreate( Bundle savedInstanceState ) {
  super.onCreate( savedInstanceState );
  TileView tileView = new TileView( this );
  tileView.setSize( 2000, 3000 );  // the original size of the untiled image
  tileView.addDetailLevel( 1f, "tile-%d-%d.png");
  setContentView( tileView );
}

マーカーの追加:

tileView.addMarker( someView, 250, 500, -0.5f, -1.0f ); 

ドキュメントからのコード。

于 2016-01-07T13:40:07.247 に答える