2010-12-15 13 views
5

संभव डुप्लिकेट:
Double Tap -> Zoom on Android MapView?डबल क्लिक करें/नल मानचित्र ज़ूम (एंड्रॉयड)

मैं एक Activity कि MapActivity फैली है। मैं Google मानचित्र का उपयोग करता हूं।
मुझे डबल क्लिक या डबल टैपिंग द्वारा ज़ूम इन करने की आवश्यकता है।

क्या कोई इस से मेरी सहायता कर सकता है?

मैंने पहले ही नीचे देखा है, लेकिन वे नहीं हैं जो मैं ढूंढ रहा हूं।

Double Tap -> Zoom on Android MapView?

Fling gesture detection on grid layout

मैंने महसूस किया कि onTouchListener केवल एक बार बुलाया जा रहा है, यही कारण है कि इतना है कि है?

private class GestureReactor extends SimpleOnGestureListener { 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     System.out.println("inside onDouble"); 
     controller.zoomInFixing((int) e.getX(), (int) e.getY()); 
     return super.onDoubleTap(e); 
    } 
} 

और

private GestureDetector detector; 
+0

तब यह क्या है कि आप ढूंढ रहे हैं, क्योंकि वे लिंक जो आप पूछते हैं वह करते हैं। – iarwain01

+0

नहीं वे नहीं, वे फ्लाईंग के बारे में बात करते हैं। */*/* –

+3

'ऑनफ्लिंग' के बजाय' ऑनडब्लूटीटी 'का उपयोग करके प्रोग्रामर के लिए एक बहुत ही आसान गोद लेने होना चाहिए, है ना? – WarrenFaith

उत्तर

3

चूंकि आप एक कॉपी-पेस्ट जवाब चाहिए, देखो here:

// set Gesture 
detector = new GestureDetector(new GestureReactor()); 
mapView.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     System.out.println("Inside onTouch"); 
     return detector.onTouchEvent(event); 
    } 
}); 

मैं निजी वर्ग की है।

संपादित करें:

मेरे public class MainMap extends MapActivity मैं एक क्षेत्र private MyMapView mv;

कहा जाता है मैं तो एक वर्ग जो MapView इस तरह फैली बनाया: public class MyMapView extends MapView

तो आप बस एक नई कक्षा बनाते हैं जो extends MapView, वहां दिए गए लिंक को कॉपी करके पेस्ट करें, और अपनी गतिविधि में class का उपयोग करें जो extends MapActivity है।

+1

सबसे पहले मैं आपकी मदद के लिए धन्यवाद देता हूं, दूसरी बात यह है कि आप कॉपी-पेस्ट कोड के लिए im lookikng कैसे पता लगाया। सबसे तीसरा मैं आपको बताता हूं कि 3.15 घंटों के बाद खोज करें, और कोशिश करें, यह एक छोटा सवाल है। –

+0

कोई अन्य सुझाव? मेरी कक्षा MapActivity से बढ़ा दी गई है। –

+0

@ वारंड संपादित करें :-) – iarwain01

3

मैं एक कस्टम दृश्य के साथ MapView का विस्तार और का उपयोग कर कि आपके आवेदन भर के इस समाधान प्यार है। MapView में टच जेस्चर को अवरुद्ध करने के लिए एक फ़ंक्शन है जिसका उपयोग आप कुछ डबल क्लिक वूडू करने के लिए कर सकते हैं। यदि आपके आवेदन में एक से अधिक मानचित्र हैं, तो यह DRY रहने का एक शानदार तरीका है।

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.ViewConfiguration; 

import com.google.android.maps.MapView; 

public class MyMapView extends MapView { 
    private long lastTouchTime = -1; 

    public MyMapView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
      long thisTime = System.currentTimeMillis(); 
      if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) { 
       // Double tap 
       this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); 
       lastTouchTime = -1; 
      } else { 
       // Too slow :) 
       lastTouchTime = thisTime; 
      } 
     } 

     return super.onInterceptTouchEvent(ev); 
    } 
} 

से this guy

0

मैं के रूप में कई अन्य लोगों के काम करने के लिए था कि यह मुझे mapView = (MyMapView) findViewById(R.id.mapview); कास्ट करने के लिए कहा जा रहा है कि सबसे अच्छा समाधान मुझे मिल गया Double Tap Zoom in GoogleMaps Activity पर उत्तर के आधार पर किया गया था की अनुमति नहीं होगी के रूप में http://nocivus.posterous.com/double-clicktap-detection-on-a प्राप्त करने में असमर्थ था:

myLocationOverlay = new MyLocationOverlay(this, mapView); 

MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay() { 
    private long systemTime = System.currentTimeMillis(); 

    @Override 
    public boolean onTouchEvent(MotionEvent event, MapView mapView) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if ((System.currentTimeMillis() - systemTime) < ViewConfiguration.getDoubleTapTimeout()) { 
       mapController.zoomInFixing((int) event.getX(), (int) event.getY()); 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
      systemTime = System.currentTimeMillis(); 
      break; 
     } 

     return false; 
    } 
}; 
3

मुझे बीबोडेनमिलर के समान समस्या थी जहां सबकुछ ठीक काम करता था जब तक कि मुझे नव निर्मित वर्ग में नहीं डाला जाता। mapView = (MyMapView) findViewById (R.id.mapview); लगातार एक अपवाद फेंक देंगे।

समाधान XML लेआउट को बदलने का है जहां हम अनुकूलित मानचित्र दृश्य प्रदर्शित कर रहे हैं।

<?xml version="1.0" encoding="utf-8"?> 
<com.google.android.maps.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mapview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:apiKey="Hidden for obvious reasons" 
/> 

समस्या में निहित है कि "com.google.android.maps.MapView" विशेष रूप से एक MapView होने के रूप में दृश्य से तय: यदि आप एक वेनिला MapView का उपयोग करते हैं आपके XML लेआउट कुछ इस तरह है। आपको इसे अपने अनुकूलित मानचित्र दृश्य के साथ परिभाषित करने की आवश्यकता है। यह इस तरह और अधिक दिखता है।

<?xml version="1.0" encoding="utf-8"?> 
<jocquej.PackageName.MyMapView 
    ... 
/> 
2

मैं भी एक उत्तर/उदाहरण खोज रहा हूं, लेकिन कहीं भी काम करने वाला कोड नहीं मिला।

अंत में, यहाँ कोड है कि मेरे लिए काम कर रहा है:

MyMapActivity.java

public class MyMapActivity extends MapActivity implements OnGestureListener, 
OnDoubleTapListener{ 

private MapView mapView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mapView = (MapView)findViewById(R.id.mapView); 

} 
@Override 
public boolean onDoubleTap(MotionEvent e) { 
    int x = (int)e.getX(), y = (int)e.getY();; 
    Projection p = mapView.getProjection(); 
    mapView.getController().animateTo(p.fromPixels(x, y)); 
    mapView.getController().zoomIn(); 
    return true; 
} 
//Here will be some autogenerated methods too 

OnDoubleTap.java

public class OnDoubleTap extends MapView { 

    private long lastTouchTime = -1; 

    public OnDoubleTap(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 

     long thisTime = System.currentTimeMillis(); 
     if (thisTime - lastTouchTime < 250) { 

     // Double tap 
     this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); 
     lastTouchTime = -1; 

     } else { 

     // Too slow 
     lastTouchTime = thisTime; 
     } 
    } 

    return super.onInterceptTouchEvent(ev); 
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

     <azizbekyan.andranik.map.OnDoubleTap 
      android:id="@+id/mapView" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:enabled="true" 
      android:clickable="true" 
      android:apiKey="YOUR_API_KEY" />   
</LinearLayout> 

अपने apiKey के साथ android:apiKey मान को प्रतिस्थापित करने के लिए मत भूलना।

संबंधित मुद्दे