2013-07-09 4 views
14

나는 이미지를 표시하고 탐색하고 작업을 수행 할 수있는 이미지의 다른 부분에서 사용자 탭을 할 수있는 방법을 찾고 있는데요 이미지 맵으로 사용.안드로이드 이미지 맵. - .svg를 표시하고 (터치 존)

터치 한 부분을 확인하기 위해 invisible color map을 사용하는 것이 좋습니다. 나는 또한 선택 영역을 강조하려는 때문에

하지만, 난 벡터를 사용하여 생각했다. svg 파일을 이미지보기 here에 렌더링하는 멋진 라이브러리가 있지만 감동을 처리하지 못합니다.
밖에있는 라이브러리가 있습니까? 아니면 이렇게하는 더 똑똑한 방법?

는 (나는 또한 밖으로 this project 확인하지만 파일을 .svg 삼키지하고 내 벡터 이미지는 손으로 모든 데이터를 삽입하는 데 너무 복잡)

+0

방법 터치를 처리 한 후 좌표를 사용하여 이미지를 강조 할 수있는 iamge보기의 맨 위에 오버레이를 만드는 방법에 대해? – blganesh101

+0

기본적으로 webviews가있을 때 svgs 만 필요하다면 danbrough의 대답으로 집에 돌아와 말라 버릴까요? – Tom

답변

12

재미있는 문제! 내가 언급 한 도서관의 조합을 사용할 수 없다고 확신하지는 않습니다. 내가 할 것이 무엇

는 프로그래밍 방식 SVG 파일에서 읽을 처음 사용 SVG-안드로이드입니다. SVG-Android를 보면 최종 제품이 Drawable의 하위 클래스 인 PictureDrawable으로 반환됩니다.

SVG 그래픽 처리 완료 직후 ImageView.setImageDrawable을 사용하여 방금 생성 한 PictureDrawable으로 ImageView을로드 할 수 있습니다. 그럼 난 원래의 질문에 연결된 "Images with Clickable Areas" 구현의 기초로 그 ImageView을 사용하고 싶습니다.

은 솔직히 가장 어려운 부분은 SVG-안드로이드가 제대로 작동하려면 받고있을 것이라고 생각 (나는 그것으로 조금 해본 적이, 그리고 조금 까다로운이다). 그러나 SVG 생성 드로어 블과 클릭 가능한 영역을 결합하는 데 많은 어려움이 없을 것이라고 생각합니다. 이는 기본 이미지의 소스를 간단히 변경 한 것입니다.

행운을 빈다.

+0

SVG를 분리하여 별도의 이미지를 만들어 오버레이로 표시하고이를 사용하여 손 잡을 수 있습니다. – andy256

+0

가능합니다. 유일한주의 사항은 클릭 할 수있는 영역이 다른 클릭 가능한 영역을 중첩하지 않고 ImageView에서 "줄 바꿈"할 수있을만큼 충분히 멀리 있거나 사각형이어야한다는 것입니다. 이미지의 불투명 한 부분 만 클릭 할 수 있으면 멋지다. 그러면 오버레이 방식을 사용할 수 있습니다. 터치하는 픽셀을 처리하기 위해 라이브러리를 약간만 작성하면 가능합니다. 그것은 실제적으로 즉시 실용적이지 않더라도, 실제로 차가운 작은 도전 일 것입니다. – Brian

+0

getPixel (event.getX(), event.getY())을 호출하고 샘플링 된 색상의 알파 값을 확인하면 안 되나요? (onTochListener에서) 저의 유일한 관심사는 약 20 개의 터치 존을 가지고 심각한 오버 드로를 생성한다는 것입니다. 각 이미지를 오버레이를 줄이기 위해 "bonding-box-sized"사각형으로 자르면 작동하지만, 모든 화면의 농도 차이가있는 조각들 : 두통 : – pumpkee

6

이 당신이 물건의 종류가 확실하지를 후 그러나 여기하는 것은 안드로이드 웹보기에서 클릭 활성화 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 파일에서 안드로이드 코드로 콜백을 할 수 있도록 노출 자바 스크립트 인터페이스 안드로이드와 재 작업 같은 예이다.

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

예, 잠재력이 있습니다. 자바 기본 요소를 자바 스크립트로 다시 전달할 수도 있습니다. 부끄러움을 자바 스크립트에 직접 호출 할 수 없습니다. –

+2

다음은 줌 및 팬 컨트롤이있는 svg 기반지도에 대한 자습서입니다. http://www.petercollingridge.co.uk/interactive-svg-components/pan-and-zoom-control –