0

我有一个按钮,大小为width=216height=110在设备屏幕分辨率为1080 x 1920.当我更改为其他设备(较小的分辨率)时,按钮是如此之大。因此,我需要编写一个功能来根据屏幕的设备分辨率动态更改按钮大小。首先,我会检查目标设备的分辨率,然后根据我目前的设备进行更改。但是,按钮分辨率不正确。我该如何解决它?这是我的代码如何根据屏幕设备更改按钮大小?

我在1080×1920

 <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); 
+0

你有没有通过[支持多种布局(HTTPS阅读://开发商。 android.com/guide/practices/screens_support.html)?如果不是的话,我建议你继续看看。 – Abbas

+0

@Abbas:它来自xml和drawable文件夹。我想用编程来改变我的按钮 – user8264

+0

然后,你将不得不做很多值得的工作。我建议你通过布局来做到这一点。检查@slackwars答案,这是实现你想要的最好的方式。但是,解决方案仅适用于具有相似布局的情况。对于不同大小的不同布局,您必须添加多个布局。 – Abbas

回答

3

我会在这种情况下做的是为不同的屏幕尺寸要求创建一个特定的dimens.xml。

Android studio dimens.xml view

每个这些将包含特定于与屏幕拟合这些尺寸的设备的参数。

<?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" 
      /> 
+0

如何计算比参考分辨率更小或更大分辨率的按钮尺寸(我的情况是'1080 x 1920')? – user8264

+0

转到:https://developer.android.com/guide/practices/screens_support.html 并向下滚动到 '使用新的尺寸限定符' 这将简要介绍如何格式化项目文件夹以支持多个屏幕分辨率。 – slackwars

0

你必须使用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> 

+0

Hell0。我想用编程来改变按钮尺寸,而不是xml – user8264

0

添加文件夹values-sw540dp它是1080屏幕。在此文件夹中添加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 
+0

对不起。我目前的分辨率是1080.我想计算出比我的参考分辨率更小或更大分辨率的按钮分辨率,使用代码 – user8264

+0

因此,添加其他值,像在答案中设置名称并创建维度。 –

相关问题