2013-07-09 8 views
14

私は画像を表示したり、ユーザが画像の異なる部分をタップして操作したり、操作を行う方法を模索しています。Androidイメージマップ。 - .svgを表示してイメージマップとして使用する(タッチゾーン)

私はinvisible color mapを使用してどのパーツに触れているかを確認することを検討していました。

しかし、私も選択した領域を強調したいので、私はベクトルを使うことを考えていました。 svgファイルを画像ビューhereにレンダリングするための素晴らしいライブラリがありますが、それは触れません。
そこにはライブラリがありますか?これを行うにはどんなスマートな方法ですか?

(私もthis projectをチェックアウトしたが、それは.SVGファイルを飲み込むませんし、私のベクトル画像が手ですべてのデータを挿入するにはあまりにも複雑である)

+0

タッチを処理して座標を使用して画像をハイライトできるiamgeビューの上にオーバーレイを作成する方法はありますか? – blganesh101

+0

基本的にwebviewsがあるときにsvgsだけが必要な場合は、danbroughの答えで家にいて乾いていますか? – Tom

答えて

12

興味深い問題!私はあなたが言及した図書館の組み合わせを使用できないと確信していません。

最初にSVG-Androidを使用してSVGファイルをプログラムで読み込みます。 SVG-Androidを見ると、最終製品がDrawableのサブクラスであるPictureDrawableとして返されるようです。

SVG-Graphicsの処理がSVGグラフィックスの処理を終えた直後に、ImageView.setImageDrawableを使用して、ちょうど生成したPictureDrawableでメインImageViewをロードします。それから私はちょうどその元の質問にリンクした"Images with Clickable Areas"の実装のためのベースとしてそのImageViewを使用したいと思います。

正直なところ、私は、最も難しい部分は、(私はそれを少しプレイしたし、それは少し気難しいです)が正しく動作するようにSVG-のAndroidを取得することになると思います。しかし、SVGで作成されたドロアブルとクリック可能な領域を組み合わせるのが難しいとは思えません。これは、ベースイメージのソースの単純な変更です。

幸運を祈る!

+0

SVGを分割して別々の画像を作成し、オーバーレイとして表示し、それらを使用してタッチをキャッチすることができます。 – andy256

+0

おそらく。唯一の注意点は、クリック可能な領域は、別のクリック可能な領域を重複させずにImageView内で「ラップ」するのに十分な矩形または離れて配置する必要があることです。画像の不透明部分だけがクリック可能であれば涼しいでしょう。あなたは間違いなくオーバレイ手法をとることができます。タッチしているピクセルを処理するための小さなライブラリを作成すると、おそらくそれが可能です。それは実際にはすぐに実用的ではないかもしれないが、実際にはクールな小さな挑戦であろう。 – Brian

+0

getPixel(event.getX()、event.getY())を呼び出したり、サンプリングされた色のアルファ値をチェックしたりしないでください。 (OnTochListenerの)私の唯一の懸念は、約20個のタッチゾーンを使って深刻なオーバードローを作成するということです...オーバードローを減らすために各画像を「ボンディングボックスサイズ」の四角形にカットすると機能するかもしれませんが、すべてのdifferet画面密度...頭痛:)これらの作品の – pumpkee

6

ない、これはあなたがしているものの一種であるかどうかわから後しかし、ここでのAndroidのWebViewでSVGを有効にクリックした例である:

WebView webView = (WebView) findViewById(R.id.webView1); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl("http://www.w3.org/TR/SVG/images/script/script01.svg"); 

それはあなたがクリックして、サークルの変化の大きさができ赤い丸が表示されるはずです。ここで

は、資産フォルダからロードされたSVGと、あなたのSVGファイルからアンドロイドのコードにコールバックを行うためのインターフェースが露出javascriptのアンドロイドで作り直さ同じ例です。

WebView webView; 

    public class WebAppInterface { 
    /** Show a toast from svg */ 
    @JavascriptInterface 
    public void showToast(String toast) { 
     Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show(); 
    } 
    } 

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

    webView = (WebView) findViewById(R.id.webView1); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.addJavascriptInterface(new WebAppInterface(), "Android"); 

    String svg = loadSvg(); 
    webView.loadData(svg, "image/svg+xml", "utf-8"); 
    } 

    String loadSvg() { 
    try { 
     BufferedReader input = new BufferedReader(new InputStreamReader(
      getAssets().open("test.svg"))); 
     StringBuffer buf = new StringBuffer(); 
     String s = null; 
     while ((s = input.readLine()) != null) { 
     buf.append(s); 
     buf.append('\n'); 
     } 
     input.close(); 
     return buf.toString(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    return null; 
    } 

とtest.svgファイル:

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg width="6cm" height="5cm" viewBox="0 0 600 500" 
    xmlns="http://www.w3.org/2000/svg" version="1.1"> 
    <desc>Example script01 - invoke an ECMAScript function from an onclick event 
    </desc> 
    <!-- ECMAScript to change the radius with each click --> 
    <script type="application/ecmascript"> <![CDATA[ 
    function circle_click(evt) { 
     Android.showToast("Hello from SVG"); 
     var circle = evt.target; 
     var currentRadius = circle.getAttribute("r"); 
     if (currentRadius == 100) 
     circle.setAttribute("r", currentRadius*2); 
     else 
     circle.setAttribute("r", currentRadius*0.5); 
    } 
    ]]> </script> 

    <!-- Outline the drawing area with a blue line --> 
    <rect x="1" y="1" width="598" height="498" fill="none" stroke="blue"/> 

    <!-- Act on each click event --> 
    <circle onclick="circle_click(evt)" cx="300" cy="225" r="100" 
      fill="red"/> 

    <text x="300" y="480" 
     font-family="Verdana" font-size="35" text-anchor="middle"> 
    Click on circle to change its size 
    </text> 
</svg> 
+1

素晴らしい創造的な回避策!私はconがwebviewを使用する高価なオーバーヘッドを支払わなければならないと思う。 – Tom

+1

ええ、それは可能性があります。 Javaプリミティブをjavascriptに渡すこともできます。あなたはJavaScriptを直接呼び出すことはできません。 –

+2

ズームとパンコントロール付きのsvgベースのマップのチュートリアルです:http://www.petercollingridge.co。 –

関連する問題