SORU
4 EYLÜL 2012, Salı


onMeasure özel açıklaması görüntüleyin

Özel bileşen yapmaya çalıştım. View Sınıf I, genişletilmiş ve onDraw overrided yöntem biraz çizim yapmak. Neden ben onMeasure geçersiz kılmak gerekir? Yok, her şey doğru olmak gördüm, yapmasaydın. Biri bunu açıklayabilir mi? Nasıl onMeasure benim yöntem yazayım mı? Birkaç öğreticiler gördüm, ama her biri biraz farklı. Sonunda super.onMeasure diyorlar bazen, bazen setMeasuredDimension kullandıkları ve aramadı. Burada bir fark var mı?

Sonuçta aynı bileşenleri tam olarak birkaç kullanmak istiyorum. XML dosyamı bu bileşenleri ekledim, ama ne olduğunu bilmiyorum. Özel bileşen sınıf konumunu ve boyutunu daha sonra çizerim onDraw onMeasure boyutu ayarlamak lazım, çalışmıyor neden () ayarlamak istiyorum. Tam olarak ne zaman ben bunu yapmak zorunda mı?

CEVAP
4 EYLÜL 2012, Salı


onMeasure() fırsat söyle Android ne kadar büyük istediğiniz özel görünümü bağımlı düzeni kısıtlamaları tarafından sağlanan üst; ayrıca özel görünüm fırsatı öğrenmek için bu düzeni kısıtlamaları vardır (diye istediğiniz gibi davranmaya farklı bir match_parent durum wrap_content durum). Bu kısıtlamaları yönteme geçirilen MeasureSpec değerleri paketlenir. Burada mod değerleri: zor bir ilişki

  • TAM olaraklayout_width gelir veya layout_height değeri belirli bir değere ayarlandı. Muhtemelen bu görünüm boyutu olun. Bu da match_parent kullanıldığında, boyut üst görünüm (bu çerçeve içinde düzeni bağlıdır) tam olarak ayarlamak için kazanılabilir.
  • AT_MOSTgenellikle anlamına gelir layout_width layout_height değeri ayarlamak için match_parent wrap_content nerede bir boyutu gerekli (bu düzen, bağımlı, çerçeve ve boyut üst boyutu değeri. Bu boyutu daha büyük olması gerekir.
  • BELİRTİLMEMİŞgenellikle layout_width layout_height değeri 23* *hiçbir kısıtlama ile kuruldu demektir. İstediğiniz herhangi bir karakter olabilir. Bazı düzenleri de bu geri arama ikinci tedbir isteğinde aslında seni tekrar geçmek için ne belirlemek için önce istediğiniz boyutta olduğunu.

onMeasure() ile var olan sözleşme setMeasuredDimension()GEREKİRolmak görmek istediğiniz boyutta sonunda aradı. Bu yöntem varsayılan uygulama güvenli eğer kullanmanız durumunda uyarsa yerine super Ara ediliyor View bulunan çerçeve dahil olmak üzere tüm uygulamalar tarafından denir.

Kabul ediyorum, çünkü çerçeve geçerli bir varsayılan uygulaması, sadece gerekli senin için geçersiz kılma bu yöntemi, ama görebilirsiniz kırpma durumlarda görünüm alanı daha küçük içerik varsa, ve eğer sen koymak senin özel görünüm ile wrap_content Her iki yönde de, görmek değil göstermek hiç çünkü çerçevesinde bilmiyor ne kadar büyük!

View ve varolan başka bir widget değil, geçersiz kılma genellikle, eğer böyle bir şey kadar basit bile olsa muhtemelen bir uygulama sağlamak için iyi bir fikirdir,:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int desiredWidth = 100;
    int desiredHeight = 100;

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    int width;
    int height;

    //Measure Width
    if (widthMode == MeasureSpec.EXACTLY) {
        //Must be this size
        width = widthSize;
    } else if (widthMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        width = Math.min(desiredWidth, widthSize);
    } else {
        //Be whatever you want
        width = desiredWidth;
    }

    //Measure Height
    if (heightMode == MeasureSpec.EXACTLY) {
        //Must be this size
        height = heightSize;
    } else if (heightMode == MeasureSpec.AT_MOST) {
        //Can't be bigger than...
        height = Math.min(desiredHeight, heightSize);
    } else {
        //Be whatever you want
        height = desiredHeight;
    }

    //MUST CALL THIS
    setMeasuredDimension(width, height);
}

Bu Yardımcı olur umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MndsgnVEVO

    MndsgnVEVO

    26 Kasım 2013
  • Phymec

    Phymec

    18 Temmuz 2009
  • TantalizingTrance

    TantalizingT

    15 ŞUBAT 2009