Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में गूगल मैप पर टच और उसकी स्थिति कैसे डिटेक्ट करें

Google Maps SDK में कैमरा चेंज लिस्टनर्स के माध्यम से मैप इंटरेक्शन डिटेक्ट करना

Google Maps Android SDK सीधा "ऑन मैप क्लिक" लिस्टनर प्रदान नहीं करता (मार्कर क्लिक के अलावा)। इसके बजाय, OnCameraMoveStartedListener, OnCameraMoveListener, OnCameraIdleListener का उपयोग करके यूजर जेस्चर (पैन, जूम, टैप) डिटेक्ट किए जा सकते हैं।

पूर्वापेक्षाएँ

  1. Google Cloud Console में Maps SDK for Android सक्षम करें
  2. API Key प्राप्त करें
  3. build.gradle में निर्भरता जोड़ें
dependencies {
    implementation 'com.google.android.gms:play-services-maps:18.2.0'
}

चरण 1: Google Maps Activity बनाएं

Android Studio: New → Google → Google Maps Activity चुनें। यह स्वचालित रूप से Manifest में मेटा-डेटा और लेआउट जोड़ता है।

चरण 2: लेआउट फ़ाइल

res/layout/activity_maps.xml:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity" />

चरण 3: MapsActivity में कैमरा लिस्टनर्स

package com.app.sample;

import android.os.Bundle;
import android.widget.Toast;
import androidx.fragment.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements
        OnMapReadyCallback,
        GoogleMap.OnCameraMoveStartedListener,
        GoogleMap.OnCameraMoveListener,
        GoogleMap.OnCameraMoveCanceledListener,
        GoogleMap.OnCameraIdleListener {

    private GoogleMap mMap;
    private boolean isUserGesture = false;

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

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // प्रारंभिक मार्कर और कैमरा
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("सिडनी में मार्कर"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 10));

        // कैमरा लिस्टनर्स रजिस्टर करें
        mMap.setOnCameraMoveStartedListener(this);
        mMap.setOnCameraMoveListener(this);
        mMap.setOnCameraMoveCanceledListener(this);
        mMap.setOnCameraIdleListener(this);

        // मार्कर क्लिक लिस्टनर (बोनस)
        mMap.setOnMarkerClickListener(marker -> {
            Toast.makeText(this, "मार्कर क्लिक: " + marker.getTitle(), Toast.LENGTH_SHORT).show();
            return false; // डिफ़ॉल्ट इन्फो विंडो दिखाएं
        });

        // मैप क्लिक लिस्टनर (API 17+ में जोड़ा गया)
        mMap.setOnMapClickListener(latLng -> {
            Toast.makeText(this, String.format("मैप क्लिक: %.6f, %.6f", latLng.latitude, latLng.longitude), Toast.LENGTH_SHORT).show();
        });

        // मैप लॉन्ग क्लिक
        mMap.setOnMapLongClickListener(latLng -> {
            mMap.addMarker(new MarkerOptions().position(latLng).title("नया मार्कर"));
        });
    }

    @Override
    public void onCameraMoveStarted(int reason) {
        isUserGesture = (reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE);

        String reasonText;
        switch (reason) {
            case GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE:
                reasonText = "यूजर जेस्चर (पैन/जूम/रोटेट) 👆";
                break;
            case GoogleMap.OnCameraMoveStartedListener.REASON_API_ANIMATION:
                reasonText = "API एनिमेशन (मार्कर क्लिक, माई लोकेशन बटन) 🎯";
                break;
            case GoogleMap.OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION:
                reasonText = "डेवलपर एनिमेशन (animateCamera) 🤖";
                break;
            default:
                reasonText = "अज्ञात कारण (" + reason + ")";
        }

        Toast.makeText(this, "कैमरा मूव शुरू: " + reasonText, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCameraMove() {
        // कैमरा हिल रहा है - बार-बार कॉल होता है
        // यहां भारी प्रोसेसिंग न करें
        if (isUserGesture) {
            // यूजर सक्रिय रूप से मैप खींच रहा है
        }
    }

    @Override
    public void onCameraMoveCanceled() {
        Toast.makeText(this, "कैमरा मूव रद्द", Toast.LENGTH_SHORT).show();
        isUserGesture = false;
    }

    @Override
    public void onCameraIdle() {
        // कैमरा रुक गया - अंतिम स्थिति प्राप्त करें
        if (mMap != null) {
            LatLng center = mMap.getCameraPosition().target;
            float zoom = mMap.getCameraPosition().zoom;

            Toast.makeText(this,
                    String.format("कैमरा रुका: %.6f, %.6f | ज़ूम: %.1f", center.latitude, center.longitude, zoom),
                    Toast.LENGTH_SHORT).show();
        }
        isUserGesture = false;
    }
}

कैमरा मूव कारण (Reason Codes)

कॉन्स्टेंटमानविवरण
REASON_GESTURE1यूजर ने मैप को छुआ/खींचा/पिंच किया
REASON_API_ANIMATION2API एनिमेशन (मार्कर क्लिक, माई लोकेशन, जूम कंट्रोल्स)
REASON_DEVELOPER_ANIMATION3animateCamera(), moveCamera() प्रोग्रामेटिक कॉल

सीधी टच स्थिति प्राप्त करना (OnMapClickListener)

एंड्रॉइड 17+ (API 17) में setOnMapClickListener उपलब्ध है जो सीधे LatLng देता है:

mMap.setOnMapClickListener(latLng -> {
    // latLng में टैप की गई भौगोलिक स्थिति
    double latitude = latLng.latitude;
    double longitude = latLng.longitude;

    // मार्कर जोड़ें
    mMap.addMarker(new MarkerOptions()
            .position(latLng)
            .title("टैप की गई स्थिति")
            .snippet(String.format("Lat: %.6f, Lng: %.6f", latitude, longitude))
    );
});

चरण 4: Google Maps API Key

res/values/google_maps_api.xml (स्वतः उत्पन्न):

<resources>
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_API_KEY_HERE</string>
</resources>

चरण 5: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.app.sample">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:exported="true"
            android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

एडवांस्ड: Projection का उपयोग करके स्क्रीन पिक्सेल ↔ LatLng कनवर्ट करें

// स्क्रीन पिक्सेल से LatLng
Projection projection = mMap.getProjection();
Point screenPoint = new Point(x, y); // टच इवेंट से x, y
LatLng latLng = projection.fromScreenLocation(screenPoint);

// LatLng से स्क्रीन पिक्सेल
Point screenPoint = projection.toScreenLocation(latLng);

कस्टम टच हैंडलिंग के लिए OnTouchListener (जटिल)

mapFragment.getView().setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // टच डाउन - लेकिन मैप भी इसे हैंडल करेगा
        Projection proj = mMap.getProjection();
        LatLng latLng = proj.fromScreenLocation(new Point((int)event.getX(), (int)event.getY()));
    }
    return false; // false = इवेंट आगे पास करें (मैप को)
});
महत्वपूर्ण: OnMapClickListener (API 17+) सबसे सरल तरीका है टैप स्थिति प्राप्त करने का। कैमरा लिस्टनर्स (OnCameraMoveStartedListener आदि) जेस्चर प्रकार और कैमरा स्थिति परिवर्तन ट्रैक करने के लिए हैं। दोनों को एक साथ उपयोग करें।
  1. एंड्रॉइड पर गूगल प्ले डाउनलोड और इंस्टॉल कैसे करें एंड्रॉइड पर गूगल प्ले डाउनलोड और इंस्टॉल कैसे करें

    2012 में लॉन्च होने के बाद से, गूगल प्ले एंड्रॉइड उपयोगकर्ताओं के लिए एक वन-स्टॉप शॉप बन गया है जहां वे ऐप्स, संगीत, गेम, फिल्में और वीडियो, ईबुक और बहुत कुछ डाउनलोड कर सकते हैं। इस सामग्री में से कुछ मुफ्त है जबकि अन्य खरीद के लिए उपलब्ध हैं, साथ ही इंस्टेंट ऐप्स भी हैं जिन्हें आप ऐप इंस्टॉल किए ब

  1. एंड्रॉयड पर Google DNS और OpenDNS का उपयोग कैसे करें एंड्रॉयड पर Google DNS और OpenDNS का उपयोग कैसे करें

    एंड्रॉयड पर DNS बदलना उन लोगों का डोमेन हुआ करता था जिन्होंने अपने डिवाइस रूट किए थे, लेकिन लोकप्रिय ऑपरेटिंग सिस्टम के बाद के पुनरावृत्तियों के साथ यह अब ऐसा नहीं है। ध्यान दें कि यह केवल वाई-फाई नेटवर्क पर काम करता है। DNS सर्वर को सेलुलर नेटवर्क का उपयोग करते समय नहीं बदला जा सकता, क्योंकि इसका

  1. Android बैटरी को रीकैलिब्रेट कैसे करें और बैटरी लाइफ में सुधार करें Android बैटरी को रीकैलिब्रेट कैसे करें और बैटरी लाइफ में सुधार करें

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