প্রোগ্রামিকভাবে লেআউটপ্যারামগুলিতে ঘনত্ব-স্বাধীন পিক্সেল হিসাবে উচ্চতা সেট করুন


123

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

উত্তর:


271

আপনার ডিপ মানটি পিক্সেলগুলিতে রূপান্তর করতে হবে:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

আমার জন্য এটি কৌশল করে।


10
আমি মনে করি যে getActivity ()। GetResferences ()। GetDimesion (রিসোর্সআইডি) সঠিক রূপান্তরকারী ক্রিয়াকলাপগুলি করে।
— StErMi

3
আমার জন্য কাজ করে, তবে এটির থেকে আলাদা হয় ... যদি আমি এক্সএমএল ব্যবহার করে উপরের পদ্ধতিটি ব্যবহার করে কোনও চিত্রভিউয়ের প্রস্থ / উচ্চতা নির্ধারণ করি। এক্সএমএলে আমি 85 ডিপি সেট করেছি যখন উপরের পদ্ধতির একই আকারের উত্পাদন করতে "75" প্রয়োজন। কোন ধারণা কেন?
— শির্ক

1
@ ডার্ক সম্ভবত আপনি যখন প্রগ্রেটিকভাবে সেট করেন তখন কোনও প্যাডিং / মার্জিন সমস্যা থাকে (সাধারণত আপনি কোড সেট করার সময় নিজেকে প্যাডিং নির্দিষ্ট করতে হবে)। এক্সএমএল বা কোডে ডিপি সেট করার মধ্যে কোনও পার্থক্য থাকা উচিত নয়।
— টিয়াগো

11
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

এইভাবে ফাংশনটি কল করুন,

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);

এটা ... আসলেই ভুল। আপনি কেবল স্থির সংখ্যক ঘনত্বকে সমর্থন করতে কঠোর কোড করেছেন। আপনি যদি ঘনত্বের স্কেলিং ফ্যাক্টরটি দিয়ে স্কেল করতে চান তবে কেবল বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / উপিল / by দিয়ে গুণ করুন যাও (আকার * মেট্রিক্স.ডেনসিটিডিপি) / ডিসপ্লেমেট্রিক্স.ডেনএসটি_ডিএফএলটি হিসাবে একই হবে।
— হ্যাকবড

1
হ্যাঁ আপনার নতুন উত্তর যুক্তিসঙ্গত। বা আমি যেমন বলেছি, কেবলমাত্র মেট্রিক্স.ডেনসিটি দিয়ে গুণ করুন। এটা যে জন্য হয়।
— হ্যাকবড

6

যেহেতু এটি একাধিকবার ব্যবহৃত হতে পারে:

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}

রূপান্তর হারটি ব্যবহার করাকে আমি আরও ব্যবহারিক বলে মনে করেছি, কারণ সাধারণত একাধিক মান রূপান্তর করতে হয়। রূপান্তর হার যেহেতু পরিবর্তন হয় না, তাই এটি প্রক্রিয়াজাতকরণের কিছুটা সময় সাশ্রয় করে।

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}

5

এখানে আমার স্নিপেট:

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}

কোথায় DisplayMetrics metrics = getResources().getDisplayMetrics()


0

উত্তরযুক্ত সমাধানটি আমার পক্ষে কাজ করে নি, দর্শনটির উচ্চতা এখনও বন্ধ ছিল। আমি এটি দিয়ে শেষ করেছি, যা ভালভাবে কাজ করে:

protected int dp2px(int dp){
    final float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

এবং আপনি যদি অন্যভাবে রাউন্ড চান তবে পিক্সেলগুলি ডিপি ...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.