代码之家  ›  专栏  ›  技术社区  ›  alex2k8

Android:如何更改复选框大小?

  •  79
  • alex2k8  · 技术社区  · 14 年前

    我想让复选框变小/变大一点,我该怎么做?

    11 回复  |  直到 5 年前
        1
  •  54
  •   moraes    14 年前

    您只需要设置相关的抽屉并在复选框中设置它们:

    <CheckBox 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="new checkbox" 
        android:background="@drawable/my_checkbox_background"
        android:button="@drawable/my_checkbox" />
    

    诀窍在于如何设置抽屉。 Here's a good tutorial about this .

        2
  •  126
  •   alex2k8    11 年前

    从API 11级开始,还存在另一种方法:

    <CheckBox
        ...
        android:scaleX="0.70"
        android:scaleY="0.70"
    />
    
        3
  •  66
  •   Antoine Nitish Kumar    7 年前

    这里有一个更好的解决方案,它不剪切和/或模糊可绘制,但仅在复选框本身没有文本(但您仍然可以有文本,它只是更复杂,请参见末尾)时才有效。

    复选框 android:id=“@+id/物品\u开关” android:layout_width=“160dp”<!--这是您想要的尺寸--> android:layout_height=“160dp” android:button=“@null” android:background=“?android:attr/listchoiceindicatormultiple“/> < /代码>

    结果:

    < Buff行情>

    < /块引用>

    上一个解决方案使用的是什么? scalex and scaley looked like:。

    < Buff行情>

    < /块引用>

    通过在其旁边添加一个 textview 并在父布局上添加一个click listener,然后以编程方式触发该复选框,您可以拥有一个文本复选框。

    模糊可绘图,但只有当复选框本身没有文本时才有效(但您仍然可以有文本,这只是更复杂,请参见末尾)。

    <CheckBox
        android:id="@+id/item_switch"
        android:layout_width="160dp"    <!-- This is the size you want -->
        android:layout_height="160dp"
        android:button="@null"
        android:background="?android:attr/listChoiceIndicatorMultiple"/>
    

    结果:

    以前的解决方案是什么 scaleX scaleY 看起来像:

    您可以通过添加文本复选框 TextView 在它旁边,在父布局上添加一个单击监听器,然后以编程方式触发该复选框。

        4
  •  10
  •   Manohar    7 年前

    嗯,我找到了很多答案,但是当我们需要文本时,它们在没有文本的情况下也能很好地工作,就像在我的用户界面中的复选框一样

    在这里,根据我的用户界面要求,我不能增加文本大小,所以我尝试的其他选项是scalex和scaley(去掉复选框)以及带有.png图像的自定义XML选择器(它还创建了不同屏幕大小的问题)。

    < Buff行情>

    但我们有另一个解决方案,即 矢量可绘制

    < /块引用>

    分三步完成。

    步骤1: 将vector drawable复制到您的drawable文件夹

    已检查.xml

    矢量xmlns:android=“http://schemas.android.com/apk/res/android” 安卓:width=“16dp” 安卓:height=“16dp” android:viewportheight=“24.0” android:viewportwidth=“24.0”> 路径 android:fillColor=“ff000000” android:pathdata=“m19,3l5,3c-1.11,0-2,0.9-2,2v14c0,1.1 0.89,2,2h14c1.11,0 2,-0.9 2,-2l21,5c0,-1.1-0.89,-2-2,-2zm10,17l-5,-5 1.41,-1.41l10,14.17l7.59,-7.59l19,8l-9,9z”/> &向量/gt; < /代码>

    未检查.xml

    矢量xmlns:android=“http://schemas.android.com/apk/res/android” 安卓:width=“16dp” 安卓:height=“16dp” android:viewportheight=“24.0” android:viewportwidth=“24.0”> 路径 android:fillColor=“ff000000” android:pathdata=“m19,5v14h5v5h14m0,-2h5c-1.1,0-2,0.9-2,2v14c0,1.1 0.9,2,2h14c1.1,0 2,-0.9 2,-2v5c0,-1.1-0.9,-2-2,-2z”/> </vector> < /代码>

    ( 注意:如果您正在使用Android Studio,您也可以在那里添加这些矢量可绘制表单,右键单击可绘制文件夹,然后单击New/Vector Asset,从那里选择这些可绘制表单 ) 步骤2: Create XML selector for check_box

    选中\框\选择器.xml

    <?xml version=“1.0”encoding=“utf-8”?gt;
    
    <selector xmlns:android=“http://schemas.android.com/apk/res/android”>
    <item android:drawable=“@drawable/checked”android:state_checked=“true”/>gt;
    <item android:drawable=“@drawable/un_checked”/>
    </selector>
    < /代码> 
    
    

    步骤3:设置Drawable into复选框

    复选框 android:id=“@+id/suggetionneveraskagaincheckbox” android:layout_width=“包装内容” android:layout_height=“包装内容” android:gravity=“中心垂直” android:button=“@drawable/复选框\选择器” android:textcolor=“ff000000” 安卓:textsize=“13dp” android:text=“不再显示此警报”/> < /代码>

    现在就像是:


    < Buff行情>

    您可以更改它的宽度和高度或viewportheight和viewportwidth 还有FillColor

    < /块引用>

    希望能有所帮助!

    enter image description here

    在这里,根据我的用户界面要求,我不能增加文本大小,所以我尝试的其他选项是scalex和scaley(去掉复选框)以及带有.png图像的自定义XML选择器(它还创建了不同屏幕大小的问题)。

    但我们有另一个解决办法,那就是向量可绘制

    分三步完成。

    步骤1:把Vector Drawable复制到你的Drawable文件夹

    检查XML

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="16dp"
    android:height="16dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z" />
    </vector>
    

    未检查.xml

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="16dp"
    android:height="16dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z" />
    </vector>
    

    (注意:如果您正在使用Android Studio,您也可以在其中添加这些矢量可绘制表单,右键单击可绘制文件夹,然后单击新建/矢量资产,从中选择这些可绘制表单。) 步骤2:为复选框创建XML选择器

    选中\u box \u selector.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/checked" android:state_checked="true" />
    <item android:drawable="@drawable/un_checked" />
    </selector>
    

    步骤3:将该可拖动项设置为复选框

    <CheckBox
    android:id="@+id/suggectionNeverAskAgainCheckBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:button="@drawable/check_box_selector"
    android:textColor="#FF000000"
    android:textSize="13dp"
    android:text="  Never show this alert again" />
    

    现在它像:

    enter image description here


    您可以更改它的宽度和高度或viewportheight和viewportwidth 还有FillColor


    希望能有所帮助!

        5
  •  7
  •   Richard    8 年前

    我用

    android:scaleX="0.70" android:scaleY="0.70"

    调整复选框的大小

    然后我这样设置页边距

    android:layout_marginLeft="-10dp"
    

    调整复选框的位置。

        6
  •  6
  •   danday74    7 年前

    这是我做的,第一组:

    android:button="@null"

    并设置

    android:drawableLeft="@drawable/selector_you_defined_for_your_checkbox"
    

    然后在Java代码中:

    Drawable d = mCheckBox.getCompoundDrawables()[0];
    d.setBounds(0, 0, width_you_prefer, height_you_prefer);
    mCheckBox.setCompoundDrawables(d, null, null, null);
    

    它对我有用,希望它对你有用!

        7
  •  4
  •   Community Muhammed Neswine    7 年前

    更新 :这仅适用于从API 17开始的版本…


    要添加到已经给出的其他精彩答案中,您只能使复选框尽可能小。

    根据我对这个问题的回答: - how can we reduce the size of checkbox please give me an idea


    CheckBox 从文本和图像导出高度。

    在XML中设置这些属性:

    android:text=""
    android:textSize="0sp"
    

    当然,这只在你不想要文本的情况下有效(为我工作)。

    如果没有这些变化, 复选框 就像乔提到的那样,我的形象给了我很大的利润

        8
  •  0
  •   user1334767    11 年前

    我找到了一种不创建自己图像的方法。换句话说,系统图像正在被缩放。我不会假装解决方案是完美的;如果有人知道缩短某些步骤的方法,我会很高兴地找到解决方法。

    首先,我将以下内容放在项目的主要活动类(wonactivity)中。这是直接从堆栈溢出中获取的-- 谢谢大家 !

    /** get the default drawable for the check box */
    Drawable getDefaultCheckBoxDrawable()
    {
      int resID = 0;
    
      if (Build.VERSION.SDK_INT <= 10)
      {
        // pre-Honeycomb has a different way of setting the CheckBox button drawable
        resID = Resources.getSystem().getIdentifier("btn_check", "drawable", "android");
      }
      else
      {
        // starting with Honeycomb, retrieve the theme-based indicator as CheckBox button drawable
        TypedValue value = new TypedValue();
        getApplicationContext().getTheme().resolveAttribute(android.R.attr.listChoiceIndicatorMultiple, value, true);
        resID = value.resourceId;
      }
    
      return getResources().getDrawable(resID);
    }
    

    其次,我创建了一个类来“缩放一个可绘制的”。请注意,它完全不同于标准的可缩放图纸。

    import android.graphics.drawable.*;
    
    /** The drawable that scales the contained drawable */
    
    public class ScalingDrawable extends LayerDrawable
    {
      /** X scale */
      float scaleX;
    
      /** Y scale */
      float scaleY;
    
      ScalingDrawable(Drawable d, float scaleX, float scaleY)
      {
        super(new Drawable[] { d });
        setScale(scaleX, scaleY);
      }
    
      ScalingDrawable(Drawable d, float scale)
      {
        this(d, scale, scale);
      }
    
      /** set the scales */
      void setScale(float scaleX, float scaleY)
      {
        this.scaleX = scaleX;
        this.scaleY = scaleY;
      }
    
      /** set the scale -- proportional scaling */
      void setScale(float scale)
      {
        setScale(scale, scale);
      }
    
      // The following is what I wrote this for!
    
      @Override
      public int getIntrinsicWidth()
      {
        return (int)(super.getIntrinsicWidth() * scaleX);
      }
    
      @Override
      public int getIntrinsicHeight()
      {
        return (int)(super.getIntrinsicHeight() * scaleY);
      }
    }
    

    最后,我定义了一个复选框类。

    import android.graphics.*;
    import android.graphics.drawable.Drawable;
    import android.widget.*;
    
    /** A check box that resizes itself */
    
    public class WonCheckBox extends CheckBox
    {
      /** the check image */
      private ScalingDrawable checkImg;
    
      /** original height of the check-box image */
      private int origHeight;
    
      /** original padding-left */
      private int origPadLeft;
    
      /** height set by the user directly */
      private float height;
    
      WonCheckBox()
      {
        super(WonActivity.W.getApplicationContext());
        setBackgroundColor(Color.TRANSPARENT);
    
        // get the original drawable and get its height
        Drawable origImg = WonActivity.W.getDefaultCheckBoxDrawable();
        origHeight = height = origImg.getIntrinsicHeight();
        origPadLeft = getPaddingLeft();
    
        // I tried origImg.mutate(), but that fails on Android 2.1 (NullPointerException)
        checkImg = new ScalingDrawable(origImg, 1);
        setButtonDrawable(checkImg);
      }
    
      /** set checkbox height in pixels directly */
      public void setHeight(int height)
      {
        this.height = height;
        float scale = (float)height / origHeight;
        checkImg.setScale(scale);
    
        // Make sure the text is not overlapping with the image.
        // This is unnecessary on Android 4.2.2, but very important on previous versions.
        setPadding((int)(scale * origPadLeft), 0, 0, 0);
    
        // call the checkbox's internal setHeight()
        //   (may be unnecessary in your case)
        super.setHeight(height);
      }
    }
    

    就这样。如果在视图中放置wOnCheckBox并应用setheight(),则复选框图像的大小将正确。

        9
  •  0
  •   Ali Bagheri    7 年前

    使用此代码。

    版面设计:

    <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:button="@drawable/my_checkbox"  *** here
            android:checked="true"/>
    

    添加新的可绘制文件:my_checkbox.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item
        android:state_checked="false"
        android:drawable="@drawable/checkbox_off_background"/>
    
    <item
        android:state_checked="true"
        android:drawable="@drawable/checkbox_on_background"/>
    

    和结束创建2个可绘制:

    复选框\u off\u background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item>
        <shape android:shape="rectangle">
            <size
                android:height="25dp"   *** your size
                android:width="25dp"/>
        </shape>
    </item>
    
    <item android:drawable="@android:drawable/checkbox_off_background"/>
    

    还有,复选框\u background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item>
        <shape android:shape="rectangle">
            <size
                android:height="25dp"
                android:width="25dp"/>
        </shape>
    </item>
    
    <item android:drawable="@android:drawable/checkbox_on_background"/>
    

        10
  •  0
  •   Sagar    6 年前

    通过将以下属性设置为,可以尝试以下解决方案更改自定义复选框的大小 Checkbox 在你的布局文件中。为我工作过

    android:button="@null"
    android:scaleX="0.8"
    android:scaleY="0.8"
    android:background="@drawable/custom_checkbox"
    

    将以下行添加到可绘制文件

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:state_checked="false"
          android:drawable="@drawable/unchecked_img" />
    <item android:state_checked="true"
          android:drawable="@drawable/checked_img" />
    </selector>
    
        11
  •  0
  •   林果皞    5 年前

    假设原始XML是:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true"
            android:drawable="@drawable/tick_img" />
        <item android:state_checked="false"
            android:drawable="@drawable/untick_img" />
    </selector>
    

    然后简单地移除 android:button="@drawable/xml_above" 在您的复选框XML中,以Java编程方式进行可缩放缩放(减少 150 大尺寸到您想要的dp):

    CheckBox tickRememberPasswd = findViewById(R.id.remember_tick);
    
    //custom selector size
    Drawable drawableTick = ContextCompat.getDrawable(this, R.drawable.tick_img);
    Drawable drawableUntick = ContextCompat.getDrawable(this, R.drawable.untick_img);
    Bitmap bitmapTick = null;
    if (drawableTick != null && drawableUntick != null) {
        int desiredPixels = Math.round(convertDpToPixel(150, this));
    
        bitmapTick = ((BitmapDrawable) drawableTick).getBitmap();
        Drawable dTick = new BitmapDrawable(getResources()
                , Bitmap.createScaledBitmap(bitmapTick, desiredPixels, desiredPixels, true));
    
        Bitmap bitmapUntick = ((BitmapDrawable) drawableUntick).getBitmap();
        Drawable dUntick = new BitmapDrawable(getResources()
                , Bitmap.createScaledBitmap(bitmapUntick, desiredPixels, desiredPixels, true));
    
        final StateListDrawable statesTick = new StateListDrawable();
        statesTick.addState(new int[] {android.R.attr.state_checked},
                dTick);
        statesTick.addState(new int[] { }, //else state_checked false
                dUntick);
        tickRememberPasswd.setButtonDrawable(statesTick);
    }
    

    这个 convertDpToPixel 方法:

    public static float convertDpToPixel(float dp, Context context) {
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi / 160f);
        return px;
    }