如何根据屏幕设备更改按钮大小?
How to change button size according to screen's device?
我有一个尺寸为 width=216
和 height=110
的按钮,设备屏幕分辨率为 1080 x 1920。当我换到其他设备(更小的分辨率)时,按钮太大了。因此,我需要编写一个函数来根据屏幕的设备分辨率动态更改按钮大小。首先,我将检查目标设备的分辨率,然后根据我当前的设备进行更改。但是,按钮分辨率不正确。我该如何解决?这是我的代码
我的代码在 1080x1920
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
>
<Button
android:id="@+id/btn"
android:layout_width="216dp"
android:layout_height="110dp"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
</LinearLayout>
改为动态方式:
public int WIDTH ;
public int HEIGHT ;
//Get screen resolution
DisplayMetrics metrics = getResources().getDisplayMetrics();
HEIGHT = metrics.heightPixels;
WIDTH= metrics.widthPixels;
int height_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 110, getResources().getDisplayMetrics());
int weight_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 216, getResources().getDisplayMetrics());
int width_linearlayout = Math.round((float)weight_px/1080*WIDTH);
int height_linearlayout = Math.round((float)height_px/1920*HEIGHT);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width_linearlayout,height_linearlayout);
btn.setLayoutParams(layoutParams);
你必须使用 layout_weight 才能实现你想要的,这将通过将每一行按钮包装在一个 LinearLayout 中来使用,所有 LinearLayouts 加上 TextView 将被包装在一个大的 LinearLayout 中而不是像下面这样的 RelativeLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff000000"
android:orientation="vertical"
android:weightSum="6" >
<TextView
android:id="@+id/disp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:inputType="none"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/white"
android:textSize="32sp"
android:textStyle="normal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:weightSum="4" >
<Button
android:id="@+id/clear"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:background="@drawable/clear_btn" />
<!-- then the three remaining buttons -->
<LinearLayout />
<!-- then the four remaining rows -->
<!-- in the last row the "0" button will have layout_weight="2" NOT "1" -->
</LinearLayout>
在这种情况下,我会做的是针对不同的屏幕尺寸要求创建特定的 dimens.xml。
其中每一个都包含特定于屏幕适合这些尺寸的设备的参数。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="nav_header_height">160dp</dimen>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="button_size_height">32dp</dimen>
<dimen name="button_size_width">70dp</dimen>
</resources>
无需额外编码,只需要维护多个 xml 个包含您的按钮参数的文件。
每个维度都将这样引用:
<Button
android:id="@+id/btn"
android:layout_width="@dimen/button_size_width"
android:layout_height="@dimen/button_size_height"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
添加文件夹 values-sw540dp
它适用于 1080p 屏幕。在此文件夹中添加 dimens.xml
<dimen name="btn_height">100dp</dimen>
<dimen name="btn_width">65dp</dimen>
编辑您的 xml
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
>
<Button
android:id="@+id/btn"
android:layout_width="@dimen/btn_width"
android:layout_height="@dimen/btn_height"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
</LinearLayout>
其他分辨率
values-sw720dp 10.1” tablet 1280x800 mdpi
values-sw600dp 7.0” tablet 1024x600 mdpi
values-sw480dp 5.4” 480x854 mdpi
values-sw480dp 5.1” 480x800 mdpi
values-xhdpi 4.7” 1280x720 xhdpi
values-xhdpi 4.65” 720x1280 xhdpi
values-hdpi 4.0” 480x800 hdpi
values-hdpi 3.7” 480x854 hdpi
values-mdpi 3.2” 320x480 mdpi
values-ldpi 3.4” 240x432 ldpi
values-ldpi 3.3” 240x400 ldpi
values-ldpi 2.7” 240x320 ldpi
我有一个尺寸为 width=216
和 height=110
的按钮,设备屏幕分辨率为 1080 x 1920。当我换到其他设备(更小的分辨率)时,按钮太大了。因此,我需要编写一个函数来根据屏幕的设备分辨率动态更改按钮大小。首先,我将检查目标设备的分辨率,然后根据我当前的设备进行更改。但是,按钮分辨率不正确。我该如何解决?这是我的代码
我的代码在 1080x1920
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
>
<Button
android:id="@+id/btn"
android:layout_width="216dp"
android:layout_height="110dp"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
</LinearLayout>
改为动态方式:
public int WIDTH ;
public int HEIGHT ;
//Get screen resolution
DisplayMetrics metrics = getResources().getDisplayMetrics();
HEIGHT = metrics.heightPixels;
WIDTH= metrics.widthPixels;
int height_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 110, getResources().getDisplayMetrics());
int weight_px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 216, getResources().getDisplayMetrics());
int width_linearlayout = Math.round((float)weight_px/1080*WIDTH);
int height_linearlayout = Math.round((float)height_px/1920*HEIGHT);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width_linearlayout,height_linearlayout);
btn.setLayoutParams(layoutParams);
你必须使用 layout_weight 才能实现你想要的,这将通过将每一行按钮包装在一个 LinearLayout 中来使用,所有 LinearLayouts 加上 TextView 将被包装在一个大的 LinearLayout 中而不是像下面这样的 RelativeLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff000000"
android:orientation="vertical"
android:weightSum="6" >
<TextView
android:id="@+id/disp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:inputType="none"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/white"
android:textSize="32sp"
android:textStyle="normal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:weightSum="4" >
<Button
android:id="@+id/clear"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:background="@drawable/clear_btn" />
<!-- then the three remaining buttons -->
<LinearLayout />
<!-- then the four remaining rows -->
<!-- in the last row the "0" button will have layout_weight="2" NOT "1" -->
</LinearLayout>
在这种情况下,我会做的是针对不同的屏幕尺寸要求创建特定的 dimens.xml。
其中每一个都包含特定于屏幕适合这些尺寸的设备的参数。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="nav_header_height">160dp</dimen>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="button_size_height">32dp</dimen>
<dimen name="button_size_width">70dp</dimen>
</resources>
无需额外编码,只需要维护多个 xml 个包含您的按钮参数的文件。
每个维度都将这样引用:
<Button
android:id="@+id/btn"
android:layout_width="@dimen/button_size_width"
android:layout_height="@dimen/button_size_height"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
添加文件夹 values-sw540dp
它适用于 1080p 屏幕。在此文件夹中添加 dimens.xml
<dimen name="btn_height">100dp</dimen>
<dimen name="btn_width">65dp</dimen>
编辑您的 xml
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center"
>
<Button
android:id="@+id/btn"
android:layout_width="@dimen/btn_width"
android:layout_height="@dimen/btn_height"
android:layout_gravity="center"
android:scaleType="fitCenter"
/>
</LinearLayout>
其他分辨率
values-sw720dp 10.1” tablet 1280x800 mdpi
values-sw600dp 7.0” tablet 1024x600 mdpi
values-sw480dp 5.4” 480x854 mdpi
values-sw480dp 5.1” 480x800 mdpi
values-xhdpi 4.7” 1280x720 xhdpi
values-xhdpi 4.65” 720x1280 xhdpi
values-hdpi 4.0” 480x800 hdpi
values-hdpi 3.7” 480x854 hdpi
values-mdpi 3.2” 320x480 mdpi
values-ldpi 3.4” 240x432 ldpi
values-ldpi 3.3” 240x400 ldpi
values-ldpi 2.7” 240x320 ldpi