ক্যামেরা এবং ভিউ

প্ল্যাটফর্ম বেছে নিন: Android iOS JavaScript

Maps SDK for Android-এ ম্যাপ সহজ জেসচারের মাধ্যমে টিল্ট ও রোটেট করা যায়, যার ফলে ব্যবহারকারীরা তাদের প্রয়োজন অনুযায়ী ম্যাপের ওরিয়েন্টেশন অ্যাডজাস্ট করতে পারেন। যেকোনও জুম লেভেলে, আপনি ম্যাপ প্যান করতে পারেন বা খুব কম লেটেন্সি সহ এর পার্সপেক্টিভ পরিবর্তন করতে পারেন, কারণ ভেক্টর-ভিত্তিক ম্যাপ টাইলগুলি ছোট ফুটপ্রিন্ট ব্যবহার করে।

কোডের নমুনা

GitHub-এ ApiDemos রিপোজিটরি-তে একটি স্যাম্পেল আছে যা ক্যামেরা ফিচার দেখায়:

ভূমিকা

ওয়েবে Google Maps-এর মতো, Maps SDK for Android আপনার ডিভাইসের স্ক্রিনে (একটি সমতল তল) মার্কেটার প্রজেকশন ব্যবহার করে পৃথিবীর পৃষ্ঠ (একটি গোলক) দেখায়। পূর্ব ও পশ্চিম দিকে, ম্যাপ অসীমভাবে পুনরাবৃত্তি হয় কারণ পৃথিবী নির্বিঘ্নে নিজের চারপাশে ঘুরে যায়। উত্তর ও দক্ষিণ দিকে ম্যাপটি আনুমানিক ৮৫ ডিগ্রি উত্তর এবং ৮৫ ডিগ্রি দক্ষিণে সীমাবদ্ধ।

মনে রাখবেন: মারকেটার প্রজেকশনের দ্রাঘিমাংশ বরাবর প্রস্থ সীমিত কিন্তু অক্ষাংশ বরাবর উচ্চতা অসীম। আমরা বেস ম্যাপের ছবি মার্কেটর প্রজেকশন ব্যবহার করে প্রায় +/- ৮৫ ডিগ্রিতে "কাট অফ" করি যাতে ফলাফল হিসেবে পাওয়া ম্যাপের আকার বর্গাকার হয়, এর ফলে টাইল বেছে নেওয়ার লজিক আরও সহজ হয়।

Maps SDK for Android-এর সাহায্যে আপনি ম্যাপের ক্যামেরা পরিবর্তন করে ম্যাপে ব্যবহারকারীর ভিউপয়েন্ট পরিবর্তন করতে পারবেন।

ক্যামেরায় পরিবর্তন করলে, আপনার যোগ করা মার্কার, ওভারলে বা অন্যান্য গ্রাফিক্সে কোনও পরিবর্তন হবে না, তবে নতুন ভিউতে আরও ভালোভাবে ফিট করার জন্য আপনি নিজের যোগ করা আইটেমে পরিবর্তন করতে চাইতে পারেন।

আপনি ম্যাপে ইউজার জেসচার শুনতে পারেন বলে, ব্যবহারকারীর অনুরোধের উত্তরে আপনি ম্যাপ পরিবর্তন করতে পারেন। যেমন, কলব্যাক পদ্ধতি OnMapClickListener.onMapClick() ম্যাপে একবার ট্যাপ করার প্রতিক্রিয়া জানায়। যেহেতু পদ্ধতিটি ট্যাপ লোকেশনের অক্ষাংশ ও দ্রাঘিমাংশ রিসিভ করে, তাই আপনি সেই পয়েন্টে প্যান বা জুম করে উত্তর দিতে পারবেন। মার্কারের বাবেলে ট্যাপ করার প্রতিক্রিয়া জানাতে বা মার্কারের উপর ড্র্যাগ জেসচারের প্রতিক্রিয়া জানাতে একই ধরনের পদ্ধতি উপলভ্য।

এছাড়াও, আপনি ক্যামেরা মুভমেন্টের জন্য শুনতে পারেন, যাতে ক্যামেরা মুভ করা শুরু করলে, বর্তমানে মুভ করলে বা মুভ করা বন্ধ করলে আপনার অ্যাপ একটি বিজ্ঞপ্তি পায়। বিস্তারিত জানতে, ক্যামেরা পরিবর্তন সংক্রান্ত ইভেন্ট-এর নির্দেশিকা দেখুন।

ক্যামেরার পজিশন

ম্যাপ ভিউকে একটি ক্যামেরা হিসেবে মডেল করা হয়েছে যা একটি সমতল প্লেনের দিকে নিচের দিকে তাকিয়ে আছে। ক্যামেরার পজিশন (এবং সেই কারণে ম্যাপের রেন্ডারিং) নিম্নলিখিত প্রপার্টি দ্বারা নির্দিষ্ট করা হয়: টার্গেট (অক্ষাংশ/দ্রাঘিমাংশ লোকেশন), দিক, টিল্ট, এবং জুম।

ক্যামেরা প্রপার্টি ডায়াগ্রাম

টার্গেট (লোকেশন)

ক্যামেরা টার্গেট হল ম্যাপের কেন্দ্রের লোকেশন, যা অক্ষাংশ ও দ্রাঘিমাংশ স্থানাঙ্ক হিসেবে নির্দিষ্ট করা হয়।

অক্ষাংশ -৮৫ থেকে ৮৫ ডিগ্রির মধ্যে হতে পারে। এই রেঞ্জের উপরে বা নিচে থাকা ভ্যালু এই রেঞ্জের মধ্যে থাকা সবচেয়ে কাছের ভ্যালুর সাথে ক্ল্যাম্প করা হবে। যেমন, অক্ষাংশ ১০০ হিসেবে উল্লেখ করলে, ভ্যালু ৮৫ হিসেবে সেট করা হবে। দ্রাঘিমাংশ -১৮০ থেকে ১৮০ ডিগ্রির মধ্যে হয়। এই রেঞ্জের উপরে বা নিচের ভ্যালু এমনভাবে র‍্যাপ করা হবে যাতে সেগুলি (-১৮০, ১৮০) রেঞ্জের মধ্যে পড়ে। যেমন, ৪৮০, ৮৪০ এবং ১২০০ সবই ১২০ ডিগ্রিতে র‍্যাপ করা হবে।

বেয়ারিং (ওরিয়েন্টেশন)

ক্যামেরা বিয়ারিং কম্পাসের দিক নির্দেশ করে, যা ম্যাপের উপরের প্রান্তের সাথে সামঞ্জস্য রেখে প্রকৃত উত্তর দিক থেকে ডিগ্রিতে পরিমাপ করা হয়। আপনি যদি ম্যাপের কেন্দ্র থেকে ম্যাপের উপরের প্রান্ত পর্যন্ত একটি উল্লম্ব রেখা আঁকেন, তাহলে বিয়ারিংটি প্রকৃত উত্তরের সাপেক্ষে ক্যামেরার হেডিংয়ের (ডিগ্রিতে পরিমাপ করা) সাথে মিলে যায়।

০ বিয়ারিংয়ের অর্থ হল ম্যাপের উপরের অংশটি প্রকৃত উত্তর দিক নির্দেশ করে। বেয়ারিং ভ্যালু ৯০ হলে ম্যাপের উপরের অংশ পূর্ব দিক (কম্পাসে ৯০ ডিগ্রি) নির্দেশ করে। ১৮০ ভ্যালু মানে ম্যাপের উপরের দিকটি দক্ষিণ দিকে নির্দেশ করে।

Maps API আপনাকে ম্যাপের কম্পাস পরিবর্তন করতে দেয়। যেমন, গাড়ি চালানোর সময় চালক প্রায়ই রোড ম্যাপটি ঘুরিয়ে নেন যাতে সেটি তার ভ্রমণের দিকের সাথে সারিবদ্ধ হয়, আবার হাইকাররা ম্যাপ ও কম্পাস ব্যবহার করার সময় সাধারণত ম্যাপটি এমনভাবে সেট করেন যাতে একটি উল্লম্ব রেখা উত্তর দিকে নির্দেশ করে।

টিল্ট (ভিউয়িং অ্যাঙ্গেল)

টিল্ট, ম্যাপের কেন্দ্রবিন্দুর ঠিক উপরে একটি আর্কে ক্যামেরার অবস্থান নির্ধারণ করে, যা নাদির (ক্যামেরার ঠিক নিচে নির্দেশ করা দিক) থেকে ডিগ্রিতে পরিমাপ করা হয়। ০ ভ্যালু মানে ক্যামেরা একদম নিচের দিকে তাক করা আছে। ০-এর থেকে বেশি মান এমন ক্যামেরার সাথে সম্পর্কিত যা দিগন্তের দিকে নির্দিষ্ট সংখ্যক ডিগ্রিতে পিচ করা হয়েছে। আপনি দেখার অ্যাঙ্গেল পরিবর্তন করলে, ম্যাপটি পার্সপেক্টিভে দেখা যায়, যেখানে দূরের ফিচারগুলি ছোট এবং কাছের ফিচারগুলি বড় দেখায়। নিম্নলিখিত ছবিতে এটি দেখানো হয়েছে।

নিচের ছবিতে, দেখার অ্যাঙ্গেল হল ০ ডিগ্রি। প্রথম ছবিতে এর একটি রেখাচিত্র দেখানো হয়েছে; ১ পজিশন হল ক্যামেরার পজিশন এবং ২ পজিশন হল ম্যাপের বর্তমান পজিশন। এর নিচে ফলাফল হিসেবে ম্যাপ দেখানো হয়।

১৮ জুম লেভেলে, ০ ডিগ্রি ভিউয়িং অ্যাঙ্গেলে পজিশন করা ক্যামেরা সহ ম্যাপের স্ক্রিনশট।
ক্যামেরার ডিফল্ট ভিউয়িং অ্যাঙ্গেল সহ ম্যাপ দেখানো হয়েছে।
ডায়াগ্রাম যা ক্যামেরার ডিফল্ট পজিশন দেখায়, সরাসরি ম্যাপ পজিশনের উপরে, ০ ডিগ্রি কোণে।
ক্যামেরার ডিফল্ট ভিউয়িং অ্যাঙ্গেল।

নিচের ছবিতে, দেখার অ্যাঙ্গেল হল ৪৫ ডিগ্রি। লক্ষ্য করুন যে ক্যামেরাটি মাথার ঠিক উপরে (০ ডিগ্রি) এবং মাটি (৯০ ডিগ্রি)-র মধ্যে একটি বৃত্তচাপ বরাবর অর্ধেক পথ সরে যায়, ৩ পজিশনে। ক্যামেরা এখনও ম্যাপের কেন্দ্রবিন্দুতে পয়েন্ট করে আছে, কিন্তু 4 পজিশনে লাইন দ্বারা দেখানো এলাকাটি এখন দেখা যাচ্ছে।

১৮ জুম লেভেলে ৪৫ ডিগ্রি ভিউয়িং অ্যাঙ্গেলে ক্যামেরা পজিশন করা ম্যাপের স্ক্রিনশট।
৪৫ ডিগ্রি ভিউয়িং অ্যাঙ্গেল সহ ম্যাপ দেখানো হয়েছে।
ডায়াগ্রাম, যা দেখায় যে ক্যামেরার ভিউয়িং অ্যাঙ্গেল ৪৫ ডিগ্রিতে সেট করা আছে, জুম লেভেল এখনও ১৮-তে সেট করা আছে।
ক্যামেরা ভিউয়িং অ্যাঙ্গেল ৪৫ ডিগ্রি।

এই স্ক্রিনশটের ম্যাপটি এখনও আসল ম্যাপের মতো একই পয়েন্টে কেন্দ্র করে আছে, তবে ম্যাপের উপরের দিকে আরও ফিচার দেখা যাচ্ছে। আপনি ৪৫ ডিগ্রির বেশি কোণ বাড়ালে, ক্যামেরা এবং ম্যাপের অবস্থানের মধ্যে থাকা ফিচারগুলি আনুপাতিকভাবে বড় দেখায়, যখন ম্যাপের অবস্থানের বাইরের ফিচারগুলি আনুপাতিকভাবে ছোট দেখায়, যার ফলে একটি ত্রিমাত্রিক এফেক্ট তৈরি হয়।

জুম করুন

ক্যামেরার জুম লেভেল ম্যাপের স্কেল নির্ধারণ করে। জুম লেভেল বেশি হলে স্ক্রিনে আরও বেশি বিবরণ দেখা যায়, আবার জুম লেভেল কম হলে স্ক্রিনে পৃথিবীর আরও বেশি অংশ দেখা যায়। জুম লেভেল ০-তে, ম্যাপের স্কেল এমন হয় যে সমগ্র পৃথিবীর প্রস্থ প্রায় ২৫৬dp (density-independent pixels) হয়।

জুম লেভেল ১ বাড়ালে স্ক্রিনে পৃথিবীর প্রস্থ দ্বিগুণ হয়ে যায়। তাই জুম লেভেল N-এ, পৃথিবীর প্রস্থ আনুমানিক ২৫৬ * ২N dp। যেমন, জুম লেভেল ২-এ, সমগ্র বিশ্ব আনুমানিক ১০২৪ডিপি চওড়া।

জুম লেভেল পূর্ণসংখ্যা না হলেও চলবে। ম্যাপে অনুমোদিত জুম লেভেলের রেঞ্জ টার্গেট, ম্যাপের ধরন ও স্ক্রিনের সাইজ সহ একাধিক বিষয়ের উপর নির্ভর করে। রেঞ্জের বাইরে থাকা যেকোনও সংখ্যাকে পরবর্তী সবচেয়ে কাছাকাছি বৈধ মানে পরিবর্তন করা হবে, যা সর্বনিম্ন জুম লেভেল বা সর্বোচ্চ জুম লেভেল হতে পারে। নিচের তালিকায় প্রতিটি জুম লেভেলে আপনি আনুমানিক কতটা বিস্তারিত দেখতে পাবেন তা দেখানো হয়েছে:

  • ১: বিশ্ব
  • ৫: স্থলভাগ/মহাদেশ
  • ১০: শহর
  • ১৫: রাস্তা
  • ২০: বিল্ডিং
নিচের ছবিতে বিভিন্ন জুম লেভেলের ভিজ্যুয়াল দেখানো হয়েছে:
৫ জুম লেভেলে ম্যাপের স্ক্রিনশট
জুম লেভেল ৫-এ একটি ম্যাপ।
১৫ জুম লেভেলে ম্যাপের স্ক্রিনশট
জুম লেভেল ১৫-এ ম্যাপ।
২০ জুম লেভেলে ম্যাপের স্ক্রিনশট
জুম লেভেল ২০-এ একটি ম্যাপ।

ক্যামেরা সরানো হচ্ছে

Maps API আপনাকে ম্যাপে বিশ্বের কোন অংশ দেখা যাবে তা পরিবর্তন করার অনুমতি দেয়। ক্যামেরার পজিশন পরিবর্তন করে এটি করা হয় (ম্যাপ সরানোর পরিবর্তে)।

ক্যামেরা পরিবর্তন করার সময়, আপনি ক্যামেরা মুভমেন্টের ফলে হওয়া পরিবর্তন অ্যানিমেট করার বিকল্প পাবেন। অ্যানিমেশন বর্তমান ক্যামেরা অ্যাট্রিবিউট এবং নতুন ক্যামেরা অ্যাট্রিবিউটের মধ্যে ইন্টারপোলেট করে। এছাড়াও, আপনি অ্যানিমেশনের সময়সীমা নিয়ন্ত্রণ করতে পারবেন।

ক্যামেরার পজিশন পরিবর্তন করতে, আপনি ক্যামেরা কোথায় সরাতে চান তা CameraUpdate ব্যবহার করে নির্দিষ্ট করতে হবে। Maps API আপনাকে CameraUpdateFactory ব্যবহার করে বিভিন্ন ধরনের CameraUpdate তৈরি করার অনুমতি দেয়। এইসব বিকল্প উপলভ্য:

জুম লেভেল পরিবর্তন করা এবং সর্বনিম্ন/সর্বাধিক জুম সেট করা

CameraUpdateFactory.zoomIn() এবং CameraUpdateFactory.zoomOut() আপনাকে একটি CameraUpdate দেয় যা জুম লেভেল 1.0-এ পরিবর্তন করে, যেখানে অন্যান্য সব প্রপার্টি একই থাকে।

CameraUpdateFactory.zoomTo(float) আপনাকে একটি CameraUpdate দেয় যা অন্যান্য সব প্রপার্টি একই রেখে জুম লেভেলকে প্রদত্ত মানে পরিবর্তন করে।

CameraUpdateFactory.zoomBy(float) এবং CameraUpdateFactory.zoomBy(float, Point) আপনাকে একটি CameraUpdate দেয় যা প্রদত্ত ভ্যালু অনুযায়ী জুম লেভেল বাড়ায় (বা কমায়, যদি ভ্যালু নেগেটিভ হয়)। পরেরটি স্ক্রিনে প্রদত্ত পয়েন্টকে এমনভাবে ফিক্স করে যাতে এটি একই লোকেশনে (অক্ষাংশ/দ্রাঘিমাংশ) থাকে এবং তাই এটি করার জন্য ক্যামেরার লোকেশন পরিবর্তন করতে পারে।

আপনি হয়ত পছন্দসই সর্বনিম্ন এবং/অথবা সর্বাধিক জুম লেভেল সেট করাকে উপযোগী বলে মনে করতে পারেন। যেমন, আপনার অ্যাপ যদি কোনও আকর্ষণীয় স্থানের চারপাশে একটি নির্দিষ্ট এলাকা দেখায় বা আপনি যদি সীমিত সংখ্যক জুম লেভেল সহ একটি কাস্টম টাইল ওভারলে ব্যবহার করেন, তাহলে ব্যবহারকারীর অভিজ্ঞতা নিয়ন্ত্রণ করতে এটি কার্যকর।

Kotlin

map.setMinZoomPreference(6.0f)
map.setMaxZoomPreference(14.0f)

      

Java

map.setMinZoomPreference(6.0f);
map.setMaxZoomPreference(14.0f);

      

মনে রাখবেন, কিছু টেকনিক্যাল কারণে API ব্যবহারকারীদের খুব বেশি বা খুব কম জুম করার অনুমতি নাও দিতে পারে। যেমন, স্যাটেলাইট বা ভূদৃশ্যের সর্বাধিক জুম বেস ম্যাপ টাইলের চেয়ে কম হতে পারে।

ক্যামেরার পজিশন পরিবর্তন করা হচ্ছে

সাধারণ পজিশন পরিবর্তনের জন্য দুটি সুবিধাজনক পদ্ধতি আছে। CameraUpdateFactory.newLatLng(LatLng) আপনাকে একটি CameraUpdate দেয় যা ক্যামেরার অক্ষাংশ ও দ্রাঘিমাংশ পরিবর্তন করে, যদিও অন্যান্য সব প্রপার্টি অপরিবর্তিত থাকে। CameraUpdateFactory.newLatLngZoom(LatLng, float) আপনাকে একটি CameraUpdate দেয় যা ক্যামেরার অক্ষাংশ, দ্রাঘিমাংশ এবং জুম পরিবর্তন করে, তবে অন্যান্য সব প্রপার্টি অপরিবর্তিত রাখে।

ক্যামেরার পজিশন পরিবর্তন করার ক্ষেত্রে সম্পূর্ণ ফ্লেক্সিবিলিটির জন্য, CameraUpdateFactory.newCameraPosition(CameraPosition) ব্যবহার করুন যা আপনাকে একটি CameraUpdate দেয় যা ক্যামেরাকে প্রদত্ত পজিশনে নিয়ে যায়। new CameraPosition() ব্যবহার করে সরাসরি অথবা new CameraPosition.Builder() ব্যবহার করে CameraPosition.Builder-এর মাধ্যমে CameraPosition পাওয়া যেতে পারে।

প্যানিং (স্ক্রল করা)

CameraUpdateFactory.scrollBy(float, float) আপনাকে একটি CameraUpdate দেয় যা ক্যামেরার অক্ষাংশ এবং দ্রাঘিমাংশ এমনভাবে পরিবর্তন করে যাতে ম্যাপটি নির্দিষ্ট সংখ্যক পিক্সেল দ্বারা সরানো যায়। x-এর মান পজিটিভ হলে ক্যামেরা ডানদিকে সরে যায়, ফলে ম্যাপ বাঁদিকে সরে গেছে বলে মনে হয়। y-এর পজিটিভ ভ্যালুর কারণে ক্যামেরা নিচের দিকে সরে যায়, যাতে ম্যাপটি উপরের দিকে সরে গেছে বলে মনে হয়। বিপরীতভাবে, x-এর নেগেটিভ মান ক্যামেরাকে বাঁদিকে সরায়, যাতে ম্যাপ ডানদিকে সরেছে বলে মনে হয় এবং y-এর নেগেটিভ মান ক্যামেরাকে উপরের দিকে সরায়। ক্যামেরার বর্তমান ওরিয়েন্টেশনের সাপেক্ষে স্ক্রল করা হয়। যেমন, ক্যামেরার বিয়ারিং ৯০ ডিগ্রি হলে, পূর্ব দিক "উপরে" হবে।

সীমানা স্থির করা

ম্যাপের বাউন্ড সেট করা হচ্ছে

কখনও কখনও ক্যামেরা এমনভাবে সরানো দরকার যাতে সর্বাধিক সম্ভাব্য জুম লেভেলে আগ্রহের সম্পূর্ণ এলাকা দেখা যায়। যেমন, আপনি যদি ব্যবহারকারীর বর্তমান লোকেশন থেকে পাঁচ মাইলের মধ্যে থাকা সব পেট্রোল পাম্প দেখাতে চান, তাহলে আপনি ক্যামেরা এমনভাবে সরাতে পারেন যাতে সেগুলি স্ক্রিনে দেখা যায়। এটি করতে, প্রথমে স্ক্রিনে যে LatLngBounds দেখাতে চান তা হিসেব করুন। আপনি তারপরে CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding) ব্যবহার করে এমন একটি CameraUpdate পেতে পারেন যা ক্যামেরার পজিশন এমনভাবে পরিবর্তন করে যাতে প্রদত্ত LatLngBounds ম্যাপের মধ্যে সম্পূর্ণভাবে ফিট করে, নির্দিষ্ট করা প্যাডিং (পিক্সেল অনুযায়ী) বিবেচনা করে। ফেরত আসা CameraUpdate নিশ্চিত করে যে প্রদত্ত বাউন্ড এবং ম্যাপের প্রান্তের মধ্যে ব্যবধান (পিক্সেলে) কমপক্ষে নির্দিষ্ট প্যাডিংয়ের সমান হবে। মনে রাখবেন, ম্যাপের টিল্ট ও বেয়ারিং, দুটিই ০ হবে।

Kotlin

val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0), // SW bounds
    LatLng((-10.0), 154.0), // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))

      

Java

LatLngBounds australiaBounds =
        new LatLngBounds(
                new LatLng(-44, 113), // SW bounds
                new LatLng(-10, 154) // NE bounds
                );
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));

      

কোনও এলাকার মধ্যে ম্যাপকে কেন্দ্র করা

কিছু ক্ষেত্রে, আপনি হয়তো একদম শেষ সীমানা অন্তর্ভুক্ত করার পরিবর্তে কোনও সীমার মধ্যে আপনার ক্যামেরা সেন্টার করতে চাইবেন। যেমন, কোনও দেশের উপর ক্যামেরা ফোকাস করা এবং একই সাথে জুম লেভেল অপরিবর্তিত রাখা। এই ক্ষেত্রে, আপনি একই ধরনের পদ্ধতি ব্যবহার করতে পারেন, LatLngBounds তৈরি করে এবং LatLngBounds-এর সাথে CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) ব্যবহার করে।getCenter()টি পদ্ধতি। getCenter() পদ্ধতি LatLngBounds-এর ভৌগোলিক কেন্দ্র ফেরত দেবে।

Kotlin

val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0), // SW bounds
    LatLng((-10.0), 154.0), // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))

      

Java

LatLngBounds australiaBounds =
        new LatLngBounds(
                new LatLng(-44, 113), // SW bounds
                new LatLng(-10, 154) // NE bounds
                );
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));

      

newLatLngBounds(boundary, width, height, padding) পদ্ধতির ওভারলোড আপনাকে একটি আয়তক্ষেত্রের জন্য পিক্সেলে প্রস্থ এবং উচ্চতা নির্দিষ্ট করতে দেয়, যার উদ্দেশ্য হল এগুলি ম্যাপের ডাইমেনশনের সাথে সামঞ্জস্যপূর্ণ। আয়তক্ষেত্রটি এমনভাবে পজিশন করা হয় যাতে এর কেন্দ্র ম্যাপের ভিউয়ের কেন্দ্রের সাথে একই হয় (যাতে নির্দিষ্ট করা ডাইমেনশন ম্যাপের ভিউয়ের ডাইমেনশনের সাথে একই হলে, আয়তক্ষেত্রটি ম্যাপের ভিউয়ের সাথে মিলে যায়)। প্রয়োজনীয় প্যাডিংয়ের কথা মাথায় রেখে, ফেরত আসা CameraUpdate ক্যামেরাটিকে এমনভাবে সরাবে যাতে নির্দিষ্ট করা LatLngBounds স্ক্রিনের কেন্দ্রে, প্রদত্ত আয়তক্ষেত্রের মধ্যে, সর্বাধিক সম্ভাব্য জুম লেভেলে থাকে।

মনে রাখবেন: ম্যাপের লেআউট তৈরি হওয়ার পরে ক্যামেরা সরানোর জন্য CameraUpdate ব্যবহার করতে হলে, newLatLngBounds(boundary, padding) তৈরি করার জন্য শুধু সহজ পদ্ধতি ব্যবহার করুন। লেআউট করার সময়, API ম্যাপের ডিসপ্লে বাউন্ডারি গণনা করে যা বাউন্ডিং বক্স সঠিকভাবে প্রজেক্ট করার জন্য প্রয়োজন। তুলনামূলকভাবে, আপনি যেকোনও সময় newLatLngBounds(boundary, width, height, padding) আরও জটিল পদ্ধতি দ্বারা রিটার্ন করা CameraUpdate ব্যবহার করতে পারবেন, এমনকি ম্যাপের লেআউট তৈরি হওয়ার আগেও, কারণ API আপনার পাস করা আর্গুমেন্ট থেকে ডিসপ্লে বাউন্ডারি গণনা করে।

ব্যবহারকারীর প্যানিং নির্দিষ্ট এলাকায় সীমাবদ্ধ করা হচ্ছে

উপরের পরিস্থিতিতে, আপনি ম্যাপের বাউন্ডারি সেট করেন কিন্তু ব্যবহারকারী তারপরেও এই বাউন্ডারির বাইরে স্ক্রল বা প্যান করতে পারেন। পরিবর্তে, আপনি ম্যাপের ফোকাল পয়েন্টের (ক্যামেরা টার্গেট) অক্ষাংশ/দ্রাঘিমাংশ কেন্দ্র বাউন্ডারি সীমাবদ্ধ করতে চাইতে পারেন যাতে ব্যবহারকারীরা শুধুমাত্র এই বাউন্ডারির মধ্যে স্ক্রল এবং প্যান করতে পারেন। যেমন, কোনও শপিং সেন্টার বা এয়ারপোর্টের রিটেল অ্যাপ, ম্যাপকে নির্দিষ্ট সীমার মধ্যে সীমাবদ্ধ রাখতে চাইতে পারে, যাতে ব্যবহারকারীরা সেই সীমার মধ্যেই স্ক্রল ও প্যান করতে পারেন।

Kotlin

// Create a LatLngBounds that includes the city of Adelaide in Australia.
val adelaideBounds = LatLngBounds(
    LatLng(-35.0, 138.58), // SW bounds
    LatLng(-34.9, 138.61), // NE bounds
)

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds)

      

Java

// Create a LatLngBounds that includes the city of Adelaide in Australia.
LatLngBounds adelaideBounds =
        new LatLngBounds(
                new LatLng(-35.0, 138.58), // SW bounds
                new LatLng(-34.9, 138.61) // NE bounds
                );

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds);

      

নিচের ডায়াগ্রাম থেকে এমন একটি পরিস্থিতি দেখানো হয়েছে যেখানে ক্যামেরার টার্গেট ভিউ-পোর্টের থেকে সামান্য বড় একটি এলাকায় সীমাবদ্ধ করা হয়েছে। ব্যবহারকারী স্ক্রল ও প্যান করতে পারবেন, তবে ক্যামেরার টার্গেট যেন বাউন্ডেড এলাকার মধ্যে থাকে। ক্রস চিহ্নটি ক্যামেরার টার্গেটকে দেখায়:

ডায়াগ্রাম ভিউপোর্টের চেয়ে বড় ক্যামেরা LatLngBounds দেখাচ্ছে।

ম্যাপ সবসময় ভিউপোর্ট পূরণ করে, এমনকি এর ফলে ভিউপোর্ট যদি এমন এলাকা দেখায় যা নির্দিষ্ট সীমার বাইরে। যেমন, আপনি যদি ক্যামেরা টার্গেটকে বাউন্ডেড এরিয়ার কোনও কোণে পজিশন করেন, তাহলে কোণের বাইরের এরিয়া ভিউপোর্টে দেখা যাবে, কিন্তু ব্যবহারকারীরা সেই এরিয়াতে আর স্ক্রল করতে পারবেন না। নিচের ডায়াগ্রামটি এই পরিস্থিতি ব্যাখ্যা করে। ক্রস চিহ্নটি ক্যামেরা টার্গেটকে দেখায়

ডায়াগ্রামটি ক্যামেরা LatLngBounds-এর নিচে ডানদিকের কোণে ক্যামেরা টার্গেটের অবস্থান দেখাচ্ছে।

নিচের ডায়াগ্রামে, ক্যামেরা টার্গেটের খুব সীমিত বাউন্ড আছে, যা ব্যবহারকারীকে ম্যাপ স্ক্রল বা প্যান করার খুব কম সুযোগ দেয়। ক্রস চিহ্নটি ক্যামেরার টার্গেটকে দেখায়:

ডায়াগ্রাম দেখাচ্ছে যে ক্যামেরার LatLngBounds ভিউপোর্টের থেকে ছোট।

ক্যামেরা ভিউ আপডেট করা হচ্ছে

ম্যাপে CameraUpdate প্রয়োগ করতে, আপনি ক্যামেরা ঝটপট সরাতে অথবা মসৃণভাবে অ্যানিমেট করতে পারবেন। প্রদত্ত CameraUpdate-এর মাধ্যমে ক্যামেরাটি সাথে সাথে সরাতে, আপনি GoogleMap.moveCamera(CameraUpdate)-এ কল করতে পারেন।

আপনি ব্যবহারকারীর অভিজ্ঞতা আরও আনন্দদায়ক করে তুলতে পারেন, বিশেষ করে ছোটখাটো পরিবর্তনের ক্ষেত্রে, পরিবর্তনটি অ্যানিমেট করে। কল করার পরিবর্তে এটি করতে GoogleMap.moveCamera কল করুন GoogleMap.animateCamera। ম্যাপটি নতুন অ্যাট্রিবিউটে মসৃণভাবে সরে যাবে। এই পদ্ধতির সবচেয়ে বিস্তারিত ফর্ম, GoogleMap.animateCamera(cameraUpdate, duration, callback), তিনটি আর্গুমেন্ট অফার করে:

cameraUpdate
CameraUpdate ক্যামেরা কোথায় সরাতে হবে তা বর্ণনা করছে।
callback
এমন একটি অবজেক্ট যা GoogleMap.CancellableCallback প্রয়োগ করে। টাস্ক ম্যানেজ করার জন্য এই সাধারণ ইন্টারফেস দুটি পদ্ধতি নির্ধারণ করে `onCancel()` এবং `onFinished()`। অ্যানিমেশনের জন্য, নিম্নলিখিত পরিস্থিতিতে পদ্ধতিগুলি কল করা হয়:
onFinish()
অ্যানিমেশন কোনও বাধা ছাড়াই সম্পূর্ণ হলে ইনভোক করা হয়।
onCancel()

অ্যানিমেশন বিঘ্নিত হলে কল করা হয় stopAnimation() অথবা নতুন ক্যামেরা মুভমেন্ট শুরু করা হয়।

এছাড়াও, আপনি GoogleMap.stopAnimation() নম্বরে কল করলে এটি হতে পারে।

duration
অ্যানিমেশনের কাঙ্ক্ষিত সময়সীমা, মিলিসেকেন্ডে, int হিসেবে।

ক্যামেরা সরানোর কিছু সাধারণ উপায় নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে।

Kotlin

val sydney = LatLng(-33.88, 151.21)
val mountainView = LatLng(37.4, -122.1)

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f))

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn())

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null)

// Construct a CameraPosition focusing on Mountain View and animate the camera to that position.
val cameraPosition = CameraPosition.Builder()
    .target(mountainView) // Sets the center of the map to Mountain View
    .zoom(17f) // Sets the zoom
    .bearing(90f) // Sets the orientation of the camera to east
    .tilt(30f) // Sets the tilt of the camera to 30 degrees
    .build() // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))

      

Java

LatLng sydney = new LatLng(-33.88, 151.21);
LatLng mountainView = new LatLng(37.4, -122.1);

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15));

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn());

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

// Construct a CameraPosition focusing on Mountain View and animate the camera to that
// position.
CameraPosition cameraPosition =
        new CameraPosition.Builder()
                .target(mountainView) // Sets the center of the map to Mountain View
                .zoom(17) // Sets the zoom
                .bearing(90) // Sets the orientation of the camera to east
                .tilt(30) // Sets the tilt of the camera to 30 degrees
                .build(); // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));