বিভিন্ন স্ক্রিন আকারে ফিট করে অ্যান্ড্রয়েড গেম


11

আমি এমন একটি অ্যান্ড্রয়েড গেম তৈরি করছি যা কেবল পোর্ট্রেট স্ক্রিনে রয়েছে ation আমি যখন এটি আমার ফোনে চালিত করি তখন এটি দুর্দান্ত কাজ করে, তবে যখন আমি এটি কোনও ট্যাবলেটে চালিত করি, পর্দার আকার বড় হলেও, সমস্ত বিটম্যাপ একই আকারের হয়। বিটম্যাপগুলি বিভিন্ন আকারের স্ক্রিনেও একই অনুপাত বজায় রাখার কোনও উপায় আছে কি?

উত্তর:


11

আপনি যদি না AbsoluteLayout ব্যবহার করেন (সাধারণত খুব খারাপ ধারণা, আপনি আপনার লেআউটটি x / y স্থানাঙ্কগুলি ব্যবহার করে ডিজাইন করেন, যা কেবল এটির নকশা করা ডিভাইসের সাথে উপযুক্ত হবে) এটি হওয়া উচিত নয় - অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি স্বয়ংক্রিয়ভাবে ডিভাইসের স্ক্রিন-আকারের সাথে সামঞ্জস্য করে । তবে আপনি যা বর্ণনা করেন তা থেকে (লেআউটটি টেবিল স্ক্রিনের সাথে সামঞ্জস্য করে না) মনে হচ্ছে AbsoluteLayout এখানে সমস্যা হতে পারে।

আপনার লেআউট এক্সএমএল ফাইলগুলিতে আপনি নিখুঁত বিন্যাসগুলি ব্যবহার করছেন না তা নিশ্চিত করুন (এটি কোনও ধরণের দৃশ্যে সুস্পষ্ট স্থানাঙ্ক / প্রস্থ / উচ্চতা নির্ধারণ করে)। পরিবর্তে ব্যবহার বিবেচনা করুন:

  • লিনিয়ারলআউট - অনুভূমিকভাবে বা উল্লম্বভাবে একাধিক দর্শন স্ট্যাক করে
  • ফ্রেমলআউট - সাধারণত একটি শিশু থাকে
  • রিলেটিভলআউট - একে অপরের তুলনায় বাচ্চাদের সারিবদ্ধ করুন
  • TableLayout - একটি টেবিল ভিত্তিক বিন্যাস
  • স্ক্রোলভিউ - এতে একটি শিশু আইটেম থাকতে পারে (যেমন লিনিয়ারলআউট) এবং আপনাকে এর সামগ্রীটি স্ক্রোল করতে দেয়

... যাই হোক না কেন আপনার উদ্দেশ্য সেরা।

আপনি যদি অ্যান্ড্রয়েডে নতুন হন তবে গুগল একটি দুর্দান্ত টিউটোরিয়াল সরবরাহ করে যা উপরে উল্লিখিত বিভিন্ন লেআউট প্রকারের সাথে পরিচয় করিয়ে দেয়। আরও টিউটোরিয়াল এখানে পাওয়া যাবে

আপনার এপিআই লেভেল প্রাসঙ্গিক হবে (আপনি অ্যান্ড্রয়েড 2.x বা 4.x ব্যবহার করছেন কিনা তা জানার জন্য - আমি স্মার্টফোনগুলির জন্য এটি উপলভ্য নয় বলে আমি 3.x ধরে নিই না) আপনার সমস্যার কারণটি সনাক্ত করতে পারে।

আপনি সেট করে পোর্ট্রেট মোডে আপনার অ্যাপ্লিকেশনটিকে বাধ্য করছেন:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set screen orientation for this dialog to portrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

... আপনার ক্রিয়াকলাপে যা গেমের দর্শনগুলি প্রদর্শন করে?

আপনি কীভাবে আপনার দৃষ্টিভঙ্গি বিন্যাস করছেন সে সম্পর্কে আরও তথ্য সরবরাহ করুন (আপনি নিজের ক্রিয়াকলাপটি পরবর্তী সময়ে যে লেআউটটি সজ্জিত করছেন তার জন্য আপনি কী এক্সএমএল ব্যবহার করছেন, বা আপনি আপনার কার্যকলাপে কোড-লেআউটিং ব্যবহার করছেন ইত্যাদি ....)? তদ্ব্যতীত: আপনি কি স্মার্টফোনে এবং ট্যাবলেট আকারের এমুলেটরটিতে আপনার অ্যাপ্লিকেশনটি চালানোর চেষ্টা করেছিলেন? যদি হ্যাঁ হয়, তাহলে সমস্যাটি কি স্থির থাকে?


আপডেট: বিটম্যাপস কীভাবে স্কেল করা যায়

ওপি জিজ্ঞাসা করেছিল যে তিনি তার খেলায় কীভাবে বিটম্যাপটি ব্যবহার করছেন তা স্কেল করতে পারে। একটি বিকল্প (ওপি'র সেটআপ সম্পর্কে আমি সমস্ত জানি): সারফেসহোল্ডার.ক্যালব্যাক যে আপনি আপনার গেমটি প্রদর্শন করতে ওভাররাইড করছেন এবং যার উপর আপনি সমস্ত বিটম্যাপস রেন্ডার করেছেন ... এর একটি পদ্ধতি রয়েছে:

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

এই পদ্ধতিটি আপনাকে আপনার পৃষ্ঠের প্রস্থ / উচ্চতা দেয়, সুতরাং আপনি এখন ব্যবহার করতে পারেন:

Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

থেকে বিটম্যাপ বর্গ । আপনি যে পৃষ্ঠটি আঁকছেন তার আকারের অনুপাতে আপনার চিত্রগুলি পুনরায় আকার দিতে।

আপনাকে যা করতে হবে তা হ'ল: যদি আপনি কোনও প্রদত্ত স্ক্রিনাইজ সম্পর্কিত আপনার বিটম্যাপের মাত্রাগুলি জানেন তবে উদাহরণস্বরূপ আপনার স্মার্টফোনের স্ক্রিন-আকার। তারপরে আপনি স্কেলড বিটম্যাপসের লক্ষ্য মাত্রা গণনা করতে পারেন। এখানে গণিত (একটি উদাহরণে আবৃত):

বলুন আপনার 25x50 (প্রস্থের দৈর্ঘ্য) মাত্রা সহ একটি বিটম্যাপ এ রয়েছে যা 100x200 (প্রস্থের দৈর্ঘ্য) মাত্রা সহ পর্দায় প্রদর্শিত হয়। স্ক্রিন আকারের জন্য (100x200) বিটম্যাপের সঠিক মাত্রা রয়েছে - এখন আপনি যদি আরও বড় স্ক্রিনে বিটম্যাপটি প্রদর্শন করতে চান তবে আপনার প্রয়োজন:

  • বিটম্যাপ আকারের জন্য স্কেল ফ্যাক্টর গণনা করুন
  • বিটম্যাপের দিক অনুপাত বজায় রাখুন (যাতে এটি বিকৃত হয় না)

বলুন যে বৃহত্তর স্ক্রিনটি 200x300 (প্রস্থের দৈর্ঘ্য) তখন প্রস্থের স্কেল-ফ্যাক্টরটি হ'ল:

200(target screen width)/100(default screen width) = 2

সুতরাং বিটম্যাপের প্রস্থ এবং উচ্চতা মানের জন্য 2 হ'ল আমাদের স্কেল-ফ্যাক্টর, যেহেতু আমাদের বিটম্যাপের দিক অনুপাত বজায় রাখা দরকার, আমরা কেবল বিটম্যাপের প্রস্থ এবং উচ্চতা দিয়ে স্কেল ফ্যাক্টরকে গুণ করতে পারি:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

সুতরাং উপর থেকে আমাদের বিটম্যাপ এ এবং উল্লিখিত সূত্রটি ব্যবহার করে বিটম্যাপের নতুন মাত্রাগুলি হবে: 50x100 (প্রস্থের দৈর্ঘ্য) কারণ:

 2*25(width) = 50 height
 2*50(height) = 100 height

এখনই যে আমরা আমাদের বিটম্যাপের নতুন আকারটি জানি আমরা কেবল উল্লিখিত এপিআই কলটি ব্যবহার করি এবং শূন্যস্থান পূরণ করুন:

   Bitmap.createScaledBitmap (myBitmap, 50, 100, false)

উপরের উদাহরণে মাইবিটম্যাপটি আসল বিটম্যাপ এ যা 25x50 মাত্রা ছিল এবং উপরের কোড-স্নিপেট ব্যবহার করে 50x100 এ স্কেল করা হয়েছে।


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

  • আপনি কি অ্যান্ডেঞ্জাইন বা ইউনিটির মতো গেম ইঞ্জিন ব্যবহার করছেন ?
  • আপনি কি xML এ আপনার লেআউট লিখছেন? যদি হ্যাঁ, আপনার গেমের সামগ্রীটি সরবরাহ করার জন্য আপনার মূল-বিন্যাসটি কী?
  • আপনি উল্লেখ করেছেন যে আপনি সারফেসহোল্ডার.ক্যালব্যাক প্রয়োগ করছেন? সারফেসচেনজেডের মেথড কলটিতে প্রদত্ত প্রস্থ / উচ্চতা আপনাকে পৃষ্ঠের আকার দেয় - আপনার অ্যাপটি যখন কোনও স্মার্টফোন বা ট্যাবলেটে চালায় তখন কি এটি একই আকার হয়?
  • আপনার যদি সারফেসভিউতে কোনও অ্যাক্সেস রয়েছে (বা যেটি সার্ফেসহোল্ডারটির সাথে সংযুক্ত রয়েছে whatever কলব্যাকটি যা আপনি প্রয়োগ করছেন), তাই আমরা নির্ধারণ করতে পারি যে এটিই সেই অ্যাপ্লিকেশনটির আকারটিকে স্মার্টফোনের আকারে দৃ setting়তার সাথে সেট করে কিনা।
  • বিভিন্ন পর্দার রেজোলিউশনের সাথে এমুলেটরটিতে একই আকার পরিবর্তন-সমস্যাগুলি কি ঘটে?

একটি সাধারণ সন্দেহ: প্রতিটি স্মার্টফোনের স্ক্রিনের আকার এক রকম হয় না, প্রকৃতপক্ষে স্ক্রিনের বিভিন্ন আকার রয়েছে, যা আমাকে অবাক করে তোলে: আপনি কি কখনও নিজের স্ক্রিনের চেয়ে আলাদা স্ক্রিনের আকারের একটি স্মার্টফোনে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করেছিলেন? কারণ - এটি আপনার পর্দার সাথে মানানসই, তবে কোনও ট্যাবলেট নয়, আমাকে অবাক করে দেয় যে এই মাত্রাগুলি কখন এবং কখন সেট করে। কারণ আমি সন্দেহ করি যে কোনও অ্যাপ্লিকেশন সমস্ত স্মার্টফোন-স্ক্রিন-আকারের সাথে সামঞ্জস্য করতে পারে, তবে ট্যাবলেট আকারগুলিতে নয় - বেশি অর্থবোধ করবে না (কারণ তাদের কম-বেশি তাদের উপর একই অ্যান্ড্রয়েড কোর চলমান রয়েছে, এসএক্স, 3 এর মধ্যে কিছু পার্থক্য রয়েছে। x এবং 4.x একদিকে) আপনি এমন একটি কাঠামো ব্যবহার করছেন যা সমর্থন করে না (যে কারণেই - সম্ভবত আপনাকে ট্যাবলেট সমর্থন অতিরিক্ত বা যাই হোক না কেন) ট্যাবলেট আকারের পর্দার আকারগুলি কিনতে হবে। এ কারণেই এটি জেনে রাখা সত্যিই গুরুত্বপূর্ণ, অ্যাপটি কেবলমাত্র আপনার ফোনে সঠিকভাবে আকার দেয় কিনা, বা অন্যান্য স্মার্টফোনেও। অ্যাপ্লিকেশন কীভাবে একটি নির্দিষ্ট ফোনের স্ক্রিন আকারের মধ্যে সীমাবদ্ধ থাকতে পারে তার একমাত্র উপায় আমি অ্যাবসুলিউলআউট এবং উইজেট ইত্যাদির জন্য সাধারণত পরম মাত্রা ব্যবহার করে ...


আপডেট: স্কেলিং এক্স / ওয়াই স্থানাঙ্ক

আপনার বিটম্যাপের অবস্থানটি পর্দার আকারের সাথে সামঞ্জস্য করতে, নীচের মতো কিছু কাজ করা উচিত:

  • স্ক্রিনের মাত্রা: 100/200 (প্রস্থ / উচ্চতা)
  • বিটম্যাপের অবস্থান: x = 50 / y = 100

এখন, আপনি যদি স্ক্রিনের আকার বৃদ্ধি করেন তবে আপনাকে সেই x / y মানগুলি বরাবর স্কেল করতে হবে:

  • স্ক্রিনের মাত্রা: 200/400 (প্রস্থ / উচ্চতা)

স্কেল ফ্যাক্টরটি 2 হবে, কারণ প্রস্থ এবং উচ্চতা সমানভাবে দুটি দ্বারা বৃদ্ধি পেয়েছে। সুতরাং মাত্রা হবে ...

  • বিটম্যাপের অবস্থান: x = 100 / y = 200

আরেকবার চেষ্টা করুন - প্রস্থ / উচ্চতার জন্য বিভিন্ন স্কেল ফ্যাক্টর সহ এবার

  • স্ক্রিনের মাত্রা: 100/150 (প্রস্থ / উচ্চতা)
  • বিটম্যাপের অবস্থান: x = 50 / y = 50

নতুন টার্গেটের পর্দা যদি 150/250 হয় তবে গণনাগুলি হ'ল:

  • প্রস্থ = টার্গেটউইথ / অরিজিনাল প্রস্থ = 1.5 এর জন্য স্কেল ফ্যাক্টর
  • উচ্চতার জন্য স্কেল ফ্যাক্টর = টার্গেটহাইট / আসল হাইট = 1.666 ... (পিরিয়ড)

এখন আমাদের x / y স্থানাঙ্কগুলি স্কেল করতে হবে, এক্সটি প্রস্থ-স্কেল ব্যবহার করে মাপানো হবে এবং উচ্চতা-স্কেলটি ব্যবহার করে উচ্চতা মাপানো হবে, ফলাফল এখানে:

  • এক্স = অরিজিনাল * 1.5 = 75
  • y = অরিজিনাল * 1.666 .. (পিরিয়ড) = 83.333 ... (পিরিয়ড)

সুতরাং নতুন স্ক্রিনের মাত্রা এবং মাপা x / y স্থানাঙ্কগুলি হ'ল:

  • প্রস্থ = 150
  • উচ্চতা = 250
  • x = 75
  • y = 83,333 ... (পিরিয়ড)

একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে, স্কেলিং বিটম্যাপের জন্য অ্যালগরিদমটি হ'ল:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

আমার গেমটি এমন একটি গেম প্যানেল ব্যবহার করে যা সারফেসহোল্ডার.ক্যালব্যাক প্রসারিত করে (এটি কোনও এক্সএমএল ফাইলটিতে থাকে যা একটি ক্রিয়াকলাপ বলে। এটি কি সমস্যার অংশ হতে পারে?
ব্যবহারকারী1404512

@ user1404512 একটি সারফেসহোল্ডার.ক্যালব্যাকটি সাধারণত একটি সারফেসভিউয়ের সাথে যুক্ত থাকে - এবং এটি আপনার সারফেসহোল্ডারটিতে ফ্রেমলাইআউট ইত্যাদি যেমন অন্য কোনও লেআউটে এম্বেড করা থাকে তবে কীভাবে সার্ফেসভিউ কনফিগার করা হয়েছে (প্রস্থ / উচ্চতা) তার উপরও নির্ভর করে। সেখানে কলব্যাক back একটি পদ্ধতি হওয়া উচিত: সর্বজনীন শূন্য পৃষ্ঠতল পরিবর্তিত (সারফেসহোল্ডার ধারক, ইন ফর্ম্যাট, প্রস্থ, প্রস্থ, উচ্চতা) প্রস্থ এবং উচ্চতা স্ক্রিনে কী আঁকা হচ্ছে তার আকার হওয়া উচিত - যা আপনার ক্ষেত্রে ট্যাবলেট এবং স্মার্টফোনে একই রকম হতে পারে - আপনি তা যাচাই করেন?
এজেন্টকনপফ

হ্যাঁ, আমার মনে হয় আমার এটি বলা উচিত: আমি যখন এটি আমার ট্যাবলেটে চালিত করি, পর্দার আকার বড় হলেও, সমস্ত বিটম্যাপগুলি একই আকার। বিটম্যাপগুলি বিভিন্ন আকারের স্ক্রিনেও একই অনুপাত বজায় রাখার কোনও উপায় আছে কি?
ব্যবহারকারীর 404512

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

না, আমি গেম ইঞ্জিন ব্যবহার করছি না। আমার এক্সআরএলতে আমার লেআউট আছে এবং আমার এক্সএমএল ফাইলে আমার একটি সারফেসহোল্ডার রয়েছে all ক্যালব্যাক যা পুরো স্ক্রিন। ধারকের প্রস্থ এবং উচ্চতা স্ক্রীন থেকে স্ক্রিনে পরিবর্তিত হয়। আমি মনে করি যে আমার সমস্যাটি হ'ল আমি এক্স এবং ওয়াই সমন্বয়যুক্ত বিটম্যাপগুলি আঁকছি, তবে বিটম্যাপগুলির স্কেলটি পর্দা থেকে পর্দায় একই থাকে same এই সমাধানের জন্য কোনো উপায় আছে কি? আগাম অনেক ধন্যবাদ!
ব্যবহারকারী1404512

3

অ্যান্ড্রয়েড.কম এ একটি ভাল এবং প্রাসঙ্গিক নিবন্ধ রয়েছে: http://developer.android.com/guide/practices/screens_support.html

এই রেফারেন্স আপনাকে পর্দার আকার, পর্দার ঘনত্ব এবং রেজোলিউশনের মাধ্যমে বাছাই করতে সহায়তা করে। লক্ষ্যটি হ'ল "ঘনত্বের স্বাধীনতা" অর্জন করতে অ্যান্ড্রয়েড এপিআইগুলি ব্যবহার করা যাতে আপনার ব্যবহারকারী ইন্টারফেসের উপাদানগুলি এবং গ্রাফিকগুলি বিভিন্ন ডিভাইসে ভাল দেখতে পারে look

মনে রাখবেন যে আপনার কাছে আপনি বিন্যাস এবং উপস্থিতি পরীক্ষা করছি যখন এমুলেটর Android এর জন্য ভার্চুয়াল ডিভাইস বিভিন্ন কনফিগারেশনের তৈরি করতে পারেন: http://developer.android.com/guide/developing/devices/emulator.html


0

এখানে অন্ধকারে একটি শট। উল্লম্ব এবং অনুভূমিকভাবে পিতামাতাকে পূরণ করার জন্য আপনি কি মাস্টার বিন্যাসটি সেট করেছেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.