অ্যান্ড্রয়েড এবং প্রস্থ এবং উচ্চতা প্রোগ্রামিংভাবে ডিপি ইউনিটে সেট করে


304

আমি করছি:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

ডক্স অনুসারে প্রস্থ এবং উচ্চতার জন্য ইউনিটগুলি (উপরের উভয় 65) "পিক্সেল"। আপনি কীভাবে এটি ডিভাইস স্বাধীন পিক্সেল, বা "ডিপি" হিসাবে বাধ্য করেন?

উত্তর:


541

ডিসপ্লে স্কেল ফ্যাক্টরটি ব্যবহার করে আপনাকে এটিকে ডিপিএস থেকে পিক্সেলে রূপান্তর করতে হবে।

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
সঠিক রূপান্তরটি হ'ল (ইনট) (ডিপিএস * স্কেল + 0.5f)। এই সূত্রটি আমরা পুরো ফ্রেমওয়ার্ক জুড়ে ব্যবহার করি।
রোমেন গাই

8
সূত্রটি ডক্সে রয়েছে। আরও পড়ার জন্য, বিকাশকারী.অ্যান্ড্রয়েড.
com

34
@ রোমাইনগুই, আপনি কি রূপান্তর করতে API এ কোনও ইউটিলিটি ফাংশন যুক্ত করতে dpপারেন px? ধন্যবাদ।
অ্যালিকেলিন-কিলাকা

3
এখানে ডিপিএস কি? আমি "ডিপিএস পেয়ে ভেরিয়েবলের সমাধান করতে পারি না"? কোন ধরণের "ডিপিএস" ঘোষণা করার দরকার ??
দীপক

5
"ডিপিএস" ভেরিয়েবল হ'ল ইনপুট মান যা আপনি রূপান্তর করতে চান।
রবি পুকুর

233

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি এই রূপান্তরটি করার খুব সুন্দর উপায় খুঁজে পেয়েছি।

জাভা

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Kotlin

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
এটি কীভাবে করবেন তা সন্ধানের জন্য ভালভাবে সম্পন্ন হয়েছে। আমি বেশ কয়েক জায়গায় সূত্রটি পুনরাবৃত্তি করার ভক্ত নই! ধন্যবাদ।
darrenp

2
যদি তা না হয় তবে সূত্রটি দিয়ে ফাংশন তৈরি করুন
সায়কা 14

1
@ কেনোবি এটি আপনার জন্য ডিপি থেকে পিএক্স রূপান্তর করে। 65উপরে ডিপি মান আপনাকে পিএক্স রূপান্তরিত চাই
drspaceboo

7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, বর্তমানের নয় যেখানে এই সংখ্যাগুলি (0.5) কোনও স্থান থেকে
যাদুতে

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

38

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

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

এবং আপনার dimens.xML এ থাকবে:

<dimen name="dimen_entry_in_dp">72dp</dimen>

এই ধারণাটি প্রসারিত করে, আপনি কেবলমাত্র 1 ডিপি বা 1 এস্পের মানকে একটি মাত্রিক এন্ট্রি হিসাবে সঞ্চয় করতে পারেন এবং মানটি জিজ্ঞাসা করতে পারেন এবং এটি একটি গুণক হিসাবে ব্যবহার করতে পারেন। এই পদ্ধতির ব্যবহার করে আপনি গণিতের স্টাফ থেকে কোডটি উত্তোলন করবেন এবং গণনা সম্পাদনের জন্য লাইব্রেরিতে নির্ভর করবেন।


মনে রাখবেন যে রিটার্ন মানটি আসলে একটি অন্তর্নিহিত, তাই এটি একটি ফ্লোটে কাস্ট হয়ে যায়।
CorayThan

এটি একটি খারাপ উত্তর কারণ এটি গতিশীল হওয়ার ভাড়া
Johny19

37

সবচেয়ে সহজ উপায় (এবং এপিআই 1 থেকে এমনকি কাজ করে) যা পরীক্ষিত তা হ'ল:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

নথি থেকে:

কাঁচা পিক্সেলের আকার হিসাবে ব্যবহারের জন্য কোনও নির্দিষ্ট সংস্থান আইডির একটি মাত্রিক পুনরুদ্ধার করুন। এটি getDimesion (int) এর সমান, প্রত্যাবর্তিত মানকে আকার হিসাবে ব্যবহারের জন্য পূর্ণসংখ্যার পিক্সেলে রূপান্তর করা ছাড়া। একটি আকার রূপান্তরের মধ্যে বেস মানটি গোল করা হয় এবং একটি শূন্য-ভিত্তিক মান কমপক্ষে একটি পিক্সেল আকারের হয় তা নিশ্চিত করে।

হ্যাঁ এটি মানটিকে গোল করে তবে এটি খুব খারাপ নয় (এলডিপিআই খুব সাধারণ না হলে কেবল এইচডিপিআই এবং এলডিপিআই ডিভাইসে অদ্ভুত মানগুলিতে কিছুটা মূল্য যুক্ত করতে হবে) আমি একটি এক্সএক্সএইচডিপি ডিভাইসে পরীক্ষা করেছিলাম যা 4 ডিপি রূপান্তর করে 16 (পিক্সেল) করে এবং এটি হ'ল সত্য।

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