Android布局 - 相对于屏幕大小设置圆角半径

时间:2014-03-23 13:33:03

标签: java android xml layout

我正在使用以下内容作为布局的背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF" />
    <corners android:radius="20dip"/>
    <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" />
</shape>

但是在4英寸800x480屏幕上的圆角度与在4.7英寸1280x720屏幕上看起来非常不同。有没有办法设置相对于屏幕的半径?

1 个答案:

答案 0 :(得分:3)

一个很好的问题,我不知道用XML做一个简洁的方法(如果使用dip值不够),但是你可以用编程方式创建你的drawable并根据屏幕大小做一些数学来实现你想要的

// Create a drawable
GradientDrawable shape = new GradientDrawable();
// Get the screen size
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
// Do some math to get the radius value to scale
int radius = (int) Math.round(width * height / 100000);
// Set the corner radius
shape.setCornerRadius(radius);
// Apply shape as background
setBackground(shape);

因此对于1280x800屏幕,这将是宽度*高度= 1024000除以100000舍入为您提供10px半径。但是在800x480的屏幕上,半径为4px。但是,这并没有考虑屏幕的物理尺寸,因此,如果这是一个问题,您可以获得以英寸为单位的物理尺寸:

DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
double x = Math.pow(dm.widthPixels/dm.xdpi,2);
double y = Math.pow(dm.heightPixels/dm.ydpi,2);
double inches = Math.sqrt(x+y);

然后您也可以将此值计算在内,例如:

int radius = (int) Math.round(width * height * inches / 500000);

现在对于1280x800 4&#34;屏幕这将是宽度*高度* 4 = 4096000除以500000圆角为您提供8px半径。在800x480 10&#34;屏幕这将是宽*高* 10 = 4096000除以500000圆角,这也为您提供8px半径。

我知道这是一个肮脏的黑客,你可能需要调整数学以使其完美地扩展,但我相信这是实现缩放半径的唯一方法。