Android: CheckBox boyutu nasıl değiştirilir?


93

CheckBox'ı biraz küçültmek / büyütmek istiyorum, bunu nasıl yapabilirim?

Yanıtlar:


57

Sadece ilgili çekilebilir öğeleri ayarlamanız ve onay kutusunda ayarlamanız yeterlidir:

<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" />

İşin püf noktası, çekmecelerin nasıl ayarlanacağıdır. İşte bununla ilgili iyi bir öğretici .


11
Farklı cihazlarda özel temaların kurulu olabileceğini unutmayın. Boyutu kendi özel görüntünüzü yerleştirerek ayarlarsanız, uygulamadaki her onay kutusunu (boyut değişikliği olmasa bile) değiştirdiğinizden emin olun, aksi takdirde belirli cihazlarda bir stil karışımı ile karşılaşabilirsiniz.
DougW

1
Bağlantı koptu
Marvin

145

API Seviye 11'den başlayarak başka bir yaklaşım vardır:

<CheckBox
    ...
    android:scaleX="0.70"
    android:scaleY="0.70"
/>

5
Bu teknik aynı zamanda metin etiketini de ölçeklendirecektir. Bunu telafi etmek için metin boyutunu aşağıdaki gibi ayarladım checkBox.TextSize = (int) (TEXT_SIZE / SCALE_FACTOR);
samis

5
Bunu artırmak için yaparsam, örneğin "2.0" a ölçeklendirirsem o zaman büyür, ancak görüntü kırpılır, onay kutusunun sağ yarısını ve metnin sol yarısını görüyorum. Bunun etrafında herhangi bir yolu var mı?
Al Lelopath

4
güzel, yine de aynı alanı kaplıyor. Bunu çözmek için -ve kenar boşlukları kullandım, örneğin: android: layout_marginLeft = "- 10dp"
M. Usman Khan

Muhtemelen IDE'nin önizlemesinde gösterilmeyeceğim, ancak CheckBox çalışma zamanında ölçeklenecek
Leo Droidcoder

Benim için AS Tasarım görünümünde gösterir. Düzeltmeye ihtiyaç duymaması gereken bir şey için basit düzeltme. API veya cihazın etkilediğini düşünüyorum. API 22'de Gennymotion cihazı kullanıldığında, 0,8'in en yüksek Y (yatay Doğrusal Yerleşim) olduğu görülürken, Onix Tablet 1'de
kırpılmıyor

100

Burada, çekilebilir olanı kırpmayan ve / veya bulanıklaştırmayan daha iyi bir çözüm var, ancak yalnızca onay kutusunun kendisi metne sahip değilse işe yarıyor (ancak yine de metne sahip olabilirsiniz, sadece daha karmaşıktır, sonuna bakın).

<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"/>

Sonuç:

Ne önceki çözüm scaleXve scaleYbenziyordu:

Yanına bir metin onay kutusu ekleyip TextViewüst düzene bir tıklama dinleyicisi ekleyerek ve ardından onay kutusunu programlı olarak tetikleyerek bir metin onay kutusuna sahip olabilirsiniz .


2
Onay kutunuzda metin varsa arka planı kullanmak çalışmaz.
Zach Green

@ZachGreen evet gerçekten. Onay kutusunda metin olsaydı işe yaramayacağını düşünmemiştim, benimki yoktu. Cevabı güncelleyecek
Antoine Bolvy

5
Bu, kabul edilenden çok daha iyi bir cevap.
vtlinh

160 dp'de grenli görünüyor. Çok düşük çözünürlükte görünüyor
Gianluca Demarinis

böyle bir onay kutusu için tonu nasıl ayarlarım?
YTerle

16

Pek çok cevap buldum, ancak kullanıcı arayüzümdeki gibi onay kutusuyla da metin istediğimizde metin olmadan iyi çalışıyorlargörüntü açıklamasını buraya girin

Burada UI gereksinimime göre TextSize'ı artıramıyorum, bu yüzden denediğim diğer seçenek scaleX ve scaleY (Onay kutusunu işaretleyin) ve .png Görüntüleriyle özel xml seçici (aynı zamanda farklı ekran boyutlarında sorun yaratıyor)

Ancak bunun için başka bir çözümümüz var, bu Vektör Çizilebilir

3 adımda yapın.

Adım 1: Bu üç Vector Drawable'ı çekilebilir klasörünüze kopyalayın

check.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>

un_checked.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 ile çalışıyorsanız, bu Vector Drawable'ı oradan da ekleyebilirsiniz, Çizilebilir klasörünüze sağ tıklayın ve ardından New / Vector Asset'e tıklayın, ardından bu çekilebilir öğeleri oradan seçin )

Adım 2: check_box için XML seçici oluşturun

check_box_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>

Adım 3: Çekilebilirliği onay kutusuna ayarlayın

<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" />

Şimdi şöyle:

görüntü açıklamasını buraya girin


Genişliğini ve yüksekliğini veya görüntü alanını değiştirebilirsiniz.Yükseklik ve görünüm penceresiGenişlik ve fillColor ayrıca


Umarım yardımcı olur!


2
Benim durumumda ben ayarlamak zorunda kaldı android:button="@null"ve android:background="@drawable/check_box_selector"o onay kutusu boyutunu ayarlamak yapmak.
Artur Szymański

bu yaklaşım
dolguları bozar

9

kullanırım

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

onay kutusunun boyutunu ayarlamak için

sonra böyle kenar boşlukları koyarım

android:layout_marginLeft="-10dp"

onay kutusunun konumunu ayarlamak için.


Kardeşim, onu küçültse de - benim durumumda marj çalışmıyor. Onay kutusu resimlerim 173 x 93 - onay kutusunun boyutu hala bu alanı kaplıyor. Antoine Bolvy, bence daha esnek bir çözüm.
Alexey Shevelyov

6

İşte yaptığım şey, ilk set:

android:button="@null"

ve ayrıca ayarla

android:drawableLeft="@drawable/selector_you_defined_for_your_checkbox"

sonra Java kodunuzda:

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

Benim için çalışıyor ve umarım sizin için de işe yarar!


4

GÜNCELLEME : Bu yalnızca API 17'den itibaren çalışır ...


Halihazırda verilmiş olan diğer harika cevaplara eklemek için, onay kutusunu yalnızca metin boyutunun izin verdiği kadar küçük yapabilirsiniz.

Bu soruya verdiğim cevaba göre: - onay kutusunun boyutunu nasıl küçültebiliriz lütfen bana bir fikir verin


CheckBox yüksekliğini TEXT'den ve görüntüden alır.

Bu özellikleri XML'nizde ayarlayın:

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

Tabii ki bu sadece metin istemiyorsanız işe yarar (benim için çalıştı).

CheckBoxJoe'nun da bahsettiği gibi , bu değişiklikler olmadan imajımın etrafında


3

Düzen dosyanızda custom checkboxaşağıdaki özellikleri olarak ayarlayarak boyutunu değiştirmek için aşağıdaki çözümü deneyebilirsiniz Checkbox. Benim için çalıştı

android: scaleX = "0.8" android: scaleY = "0.8"

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

çekilebilir dosyaya aşağıdaki satırları ekleyin

<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>

0

Kendi görsellerinizi yaratmadan bunu yapmanın bir yolunu buldum. Başka bir deyişle, sistem görüntüsü ölçekleniyor. Çözümün mükemmel olduğunu iddia etmiyorum; Bazı adımları kısaltmanın bir yolunu bilen varsa, nasıl yapılacağını öğrenmekten memnuniyet duyarım.

İlk olarak, projenin ana aktivite sınıfına (WonActivity) şunu koydum. Bu doğrudan Stack Overflow'dan alındı ​​- teşekkürler çocuklar !

/** 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);
}

İkincisi, "çekilebilirliği ölçeklendirmek" için bir sınıf oluşturdum. Lütfen standart ScaleDrawable'dan tamamen farklı olduğuna dikkat edin.

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);
  }
}

Son olarak, bir onay kutusu sınıfı tanımladım.

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);
  }
}

Bu kadar. Görünümünüze WonCheckBox koyarsanız ve setHeight () uygularsanız, onay kutusu görüntüsü doğru boyutta olacaktır.


0

bu kodu kullanın.

düzende:

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

yeni bir çekilebilir ekleyin: 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"/>

ve sonunda 2 çekilebilir oluşturun:

checkbox_off_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"/>

ve ayrıca checkbox_on_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"/>


0

Orijinal xml'nizin:

<?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>

daha sonra android:button="@drawable/xml_above"onay kutunuzdaki xml'yi kaldırın ve java'da programlı olarak çekilebilir ölçeklendirme yapın ( 150büyük boyutu istediğiniz dp'ye küçültün):

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);
}

convertDpToPixelyöntem:

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

0

İhtiyacım için uygun cevabı bulamadım ve anladım. Dolayısıyla, bu cevap, onay kutusunu çizilebilir ve metni ayrı ayrı yeniden boyutlandırmak istediğiniz aşağıdaki gibi metin içeren onay kutusu içindir.

görüntü açıklamasını buraya girin

İki PNG'ye ihtiyacınız var cb_checked.png ve cb_unchechecked.png bunları çekilebilir klasöre ekleyin

Şimdi cb_bg_checked.xml oluşturun

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/cb_checked"
        android:height="22dp" <!-- This is the size of your checkbox -->
        android:width="22dp"  <!-- This is the size of your checkbox -->
        android:right="6dp"   <!-- This is the padding between cb and text -->
        tools:targetApi="m"
        tools:ignore="UnusedAttribute" />
</layer-list>

Ve cb_bg_unchecked.xml

 <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <item android:drawable="@drawable/cb_unchechecked"
            android:height="22dp" <!-- This is the size of your checkbox -->
            android:width="22dp"  <!-- This is the size of your checkbox -->
            android:right="6dp"   <!-- This is the padding between cb and text -->
            tools:targetApi="m"
            tools:ignore="UnusedAttribute" />
    </layer-list>

Ardından bir seçici XML checkbox.xml oluşturun

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

Şimdi bunu layout.xml'nizi şöyle tanımlayın

<CheckBox
  android:id="@+id/checkbox_with_text"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:checked="true"
  android:button="@drawable/checkbox"
  android:text="This is text"
  android:textColor="@color/white"
  android:textSize="14dp" /> <!-- Here you can resize text -->

0

Onay kutusuna özel bir resim eklemek istiyorsanız, düğmeyi boş olarak ayarlayın ve çözülen onay kutusuna arka plan ekleyin.

 <CheckBox
    android:layout_width="22dp"
    android:layout_height="22dp"
    android:layout_marginLeft="-10dp"
    android:button="@null"
    android:background="@drawable/memory_selector"/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.