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


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.