代码之家  ›  专栏  ›  技术社区  ›  Maveňツ

如何制作完美的方形图像/按钮

  •  11
  • Maveňツ  · 技术社区  · 10 年前

    我正在为android设计一个基本的sudoko游戏。我想要一张4x4的桌子,里面所有的单元格都是正方形。

    我正在尝试使用16个按钮 TableLayout .

    我的方式看起来像这样

    • enter image description here

    它们的形状是矩形的:(

    我的xml

    <TableLayout
    android:id="@+id/tl"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >
    
    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center" >
    
        <Button
            android:id="@+id/button1"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="1" />
    
        <Button
            android:id="@+id/button2"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="2" />
    
        <Button
            android:id="@+id/button3"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="3" />
    
        <Button
            android:id="@+id/button4"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="4" />
    </TableRow>
    
    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center" >
    
        <Button
            android:id="@+id/button5"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="5" />
    
        <Button
            android:id="@+id/button6"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="6" />
    
        <Button
            android:id="@+id/button7"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="7" />
    
        <Button
            android:id="@+id/button8"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="8" />
    </TableRow>
    
    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center" >
    
        <Button
            android:id="@+id/button9"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="9" />
    
        <Button
            android:id="@+id/button10"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="7" />
    
        <Button
            android:id="@+id/button11"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="8" />
    
        <Button
            android:id="@+id/button12"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="7" />
    </TableRow>
    
    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center" >
    
        <Button
            android:id="@+id/button13"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="9" />
    
        <Button
            android:id="@+id/button14"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="7" />
    
        <Button
            android:id="@+id/button15"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="8" />
    
        <Button
            android:id="@+id/button16"
            style="@style/box_sky_blue"
            android:layout_weight="1"
            android:text="7" />
    </TableRow>
    </TableLayout>
    

    这是天蓝色的盒子

    <style name="box_sky_blue">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:background">@color/box_color_sky_blue</item>
        <item name="android:layout_margin">5dp</item>
        <item name="android:padding">5dp</item>
        <item name="android:textSize">20sp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">#ffffff</item>
    </style>
    

    既然我有4x4,5x5&6倍6

    4 回复  |  直到 7 年前
        1
  •  12
  •   Kevin Cruijssen    10 年前

    将wrap_contents更改为默认大小:

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    

    android:layout_width="@dimen/box_size"
    android:layout_height="@dimen/box_size"
    

    (然后在 res/values/dimen.xml 如: <dimen name="box_size">50dp</dimen> )


    或者,使用wrap_content作为宽度,然后在代码中使用 myBox.setHeight(myBox.getMeasuredWidth); 因此宽度和高度匹配。不过,只需确保视图已完全加载,否则getMeasuredWidth返回0。

    编辑:

    要在加载视图后更改高度以匹配wrap_content宽度,可以使用ViewTreeObserver:

    if(yourActivityLayout.getViewTreeObserver().isAlive()){
        yourActivityLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout(){
                // The view is completely loaded now, so getMeasuredWidth() won't return 0
                yourButton1.setLayoutParams(new TableLayout.LayoutParams(yourButton1.getMeasuredWidth(), yourButton1.getMeasuredWidth()));
                ... // Do this for all buttons (preferably in a for-loop to prevent repetition)
    
                // Destroy the onGlobalLayout afterwards, otherwise it keeps changing
                // the sizes non-stop, even though it's already done
                yourActivityLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
    }
    
        2
  •  2
  •   Maveňツ    7 年前

    XML中的按钮代码

    <Button
        android:id="@+id/btn"  
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:background="@drawable/buttonshape"/>
    

    buttonshape.xml代码

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle" >
    <corners
    android:topLeftRadius="0dp"
    android:topRightRadius="0dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"/>
    <solid
    android:color="#0000ff"/>
    <padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"/>
    <size
    android:width="64dp"
    android:height="64dp"/>
    </shape>
    
        3
  •  2
  •   Addev    2 年前

    更新的答案,刚刚好:

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <androidx.appcompat.widget.AppCompatButton
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:text="1"
            app:layout_constraintDimensionRatio="H,1:1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
        4
  •  -5
  •   nayana bhoj    7 年前

    尝试添加固定的宽度和高度。

     android:layout_width="@dimen/box_size"
     android:layout_height="@dimen/box_size"
    

    在res/values/dimen.xml中添加

     <dimen name="box_size">40dp</dimen>