如何以编程方式更改应用程序大小,使用DIP而不是PX

时间:2013-08-07 08:24:09

标签: android size density-independent-pixel

我已经搜索过并找到了非常多的答案,但没有一个会显示它们是如何插入到活动中的。

我的活动有一个tabsadapter和viewpager(fragmentpageradapter)。而已。我已将其设置为对话框,如此

    <style name="Theme.PopupTheme" parent="android:Theme.Holo.Light.Dialog">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">false</item>
    <item name="android:windowActionBar">true</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:padding">2sp</item>
    <item name="android:divider">@drawable/transparent</item>

现在,这个工作正常,只是它占据了显示器的全尺寸,侧面和底部几乎没有任何透明度。此活动没有布局,只有viewpager xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

因此我依赖于以编程方式调整应用程序的大小。我发现我只能通过设置像素来​​管理这个(我的技术水平)。如果它适用于某个设备,它看起来不错,但是与我的S3相比,我的Nexus 10上的应用看起来很糟糕,反之亦然,这取决于我设置的像素数量。

如何以dip编程方式执行此操作?

4 个答案:

答案 0 :(得分:0)

我认为没有办法直接在dip中设置它。

您可以使用此方法将dip转换为px,并使用结果调整视图大小。

private static float scale = 0;
...
public static int dps2pixels(int dps, Context context) {
    if (0 == scale) {
        scale = context.getResources().getDisplayMetrics().density;
    }
    return (int) (dps * scale + 0.5f);
}

答案 1 :(得分:0)

有一个名为TypedValue.applyDimensions(int, float, DisplayMetrics)的现有实用程序方法可以执行此操作。

以下是如何使用它:

// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
(float) 123.4, getResources().getDisplayMetrics());

您可以使用其他类型的列表,包括我在上面链接的页面中找到的COMPLEX_UNIT_SP, COMPLEX_UNIT_PT。如果排除(int)类型转换,则会得到浮点数。

我遇到了同样的问题,并通过探索代码找到了这个。

答案 2 :(得分:0)

以下代码是按照屏幕尺寸以progamatically方式添加进度条。也许你可以从这段代码中得到一些提示:

mProgressBar = (ProgressBar) findViewById(R.id.progress);

DisplayMetrics metrics = this.getResources().getDisplayMetrics();
int displayWidth = metrics.widthPixels;
int displayHeight = metrics.heightPixels;
int width = 0;
int topMargin = 0;
int leftRightMargin = 0;

float deviceWidth = (float)displayWidth/metrics.xdpi;
float perct = deviceWidth*76/100;
float finalWidth = perct*metrics.xdpi;

float deviceHeight = displayHeight/metrics.ydpi;

if(metrics.density == 1)
    perct = deviceHeight*16/100;
else if(metrics.density == 2)
    perct = deviceHeight*20/100;
else if(metrics.density == 1.5)
    perct = deviceHeight*18/100;

float finaltopMargin = perct*metrics.ydpi;

perct = deviceWidth*12/100;
float finalLeftMargin = perct*metrics.xdpi;

width = (int)finalWidth;
topMargin = (int)finaltopMargin;
leftRightMargin = (int)finalLeftMargin;

android.widget.RelativeLayout.LayoutParams params =  (android.widget.RelativeLayout.LayoutParams) new  android.widget.RelativeLayout.LayoutParams(width, width);

//params.setMargins(leftRightMargin, topMargin, 0, 0);
mProgressBar.setLayoutParams(params);

答案 3 :(得分:0)

将像素转换为倾角,反之亦然,然后根据屏幕大小应用于计算。试试这个,它应该有所帮助:

Pixel to dip:

float scale = context.getResources().getDisplayMetrics().density;
int pixel = (int) (pixel * scale + 0.5f);

倾向于像素:

int dip = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
                getApplicationContext().getResources()
                        .getDisplayMetrics());