2013-06-11 14 views
6

Neden lColorWheel.getWith() yöntemi 0 döndürüyor? OnMeasure olayı ile ilgili bir şey var sanırım, ama gerçekten nasıl çalıştığını belgelerden anlayamıyorum. mDrawable için boyutları ayarlamam gereken yer?View.getWidth() onCreate yönteminde çalışmıyor mu?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_light); 

    ShapeDrawable mDrawable; 
    ivColorWheel=(ImageView)findViewById(R.id.ivColorWheel); 
    lColorWheel=findViewById(R.id.lColorWheel); 
    ld=(LayerDrawable)getResources().getDrawable(R.drawable.colorwheel); 

    mDrawable = new ShapeDrawable(new OvalShape()); 

    mDrawable.setIntrinsicWidth(lColorWheel.getWidth()); 
    mDrawable.setIntrinsicHeight(lColorWheel.getHeight()); 
    Log.d("lColorWheel.getWidth()",Integer.toString(lColorWheel.getWidth())); //returns 0, why? 
    Log.d("lColorWheel.getHeight()",Integer.toString(lColorWheel.getHeight())); //returns 0, why ? 

ve uygun XML dosyası:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/background" 
android:gravity="center_horizontal" 
android:addStatesFromChildren="true" > 

<RelativeLayout 
    android:id="@+id/lColorWheel" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:layout_marginTop="20dp" 
    android:layout_centerHorizontal="true" 
    android:adjustViewBounds="true"> 

    <ImageView 
     android:id="@+id/ivColorWheel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:adjustViewBounds="true" 
     android:paddingBottom="0dp" 
     android:paddingTop="0dp" 
     android:src="@drawable/iconwheel" 
     /> 

     <ImageView 
      android:id="@+id/ivCenterButton1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:maxHeight="5dp" 
      android:maxWidth="5dp" 
      android:onClick="clc" 
      android:paddingBottom="0dp" 
      android:paddingLeft="0dp" 
      android:paddingRight="0dp" 
      android:paddingTop="0dp" 
      android:src="@drawable/center3" /> 

</RelativeLayout> 

<SeekBar 
    android:id="@+id/sbColorIntensity" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
     android:layout_below="@id/lColorWheel" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:layout_marginTop="20dp" 
    android:background="@drawable/colorintensitystrip" 
    android:max="255" 
    android:maxHeight="-25dp" 
    android:thumb="@drawable/thumb" 
    android:thumbOffset="0dp" 
/> 



<SeekBar 
    android:id="@+id/sbOrientation" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@id/sbColorIntensity" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:layout_marginTop="20dp" 
    android:background="@drawable/orientationstrip" 
    android:max="255" 
    android:maxHeight="-25dp" 
    android:thumb="@drawable/thumb" 
    android:thumbOffset="0dp" 
    /> 

<SeekBar 
    android:id="@+id/sbWhiteIntensity" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@id/sbOrientation" 
    android:layout_marginLeft="20dp" 
    android:layout_marginRight="20dp" 
    android:layout_marginTop="20dp" 
    android:background="@drawable/whiteintensitystrip" 
    android:max="255" 
    android:maxHeight="-25dp" 
    android:thumb="@drawable/thumb" 
    android:thumbOffset="0dp" 
    /> 
</RelativeLayout> 

thx Sen bitirir render önce bunları kullanmak istiyorsanız görünümün yüksekliğini ve genişliğini ölçmek gerekir

cevap

15

.

Aşağıdaki kod, herhangi bir görünümün yüksekliğini ve genişliğini ölçmenize yardımcı olacaktır.

imgView.measure(
    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
imgView.layout(0, 0, 
    imgView.getMeasuredWidth(), 
    imgView.getMeasuredHeight()); 

Bu kodu, yükseklik ve genişlik kullanımından önce yazın.

Bazen bu yaklaşım doğru sonuç vermeyecektir. Bunun alternatifi var. Aşağıdaki kod, ekranda çizmeden önce yüksekliği ve genişliği hesaplayacaktır.

ViewTreeObserver viewTree = imgView.getViewTreeObserver(); 
viewTree.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
     finalHeight = imgView.getMeasuredHeight(); 
     finalWidth = imgView.getMeasuredWidth(); 
     //print or do some code 
     return true; 
    } 
}); 
+0

Ölçüm yaklaşımını kullandığımda her zaman 0,0 alırım. niye ya? ve imGView olmak istediği boyutu nasıl biliyor? – suitianshi

0

Getwidth() öğesini çok erken çağırıyorsanız, UI bu değeri almaya hazır değil. Bir gözlemciye ihtiyacın var. Bu değerin, kullanıcı arayüzünün ilk boyamasından hemen sonra olduğunu düşünüyorum. senin onCreate() yönteminde bu deneyin :

final ViewTreeObserver vto = myView.getViewTreeObserver(); 
    if (vto.isAlive()) { 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      public void onGlobalLayout() { 

       int witdth = lColorWheel.getWith() 
       // remove the listener... or we'll be doing this a lot. 
       ViewTreeObserver obs = promotionSub_ly.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
0

çok erken GetWidth() aradığınız

CommonsWare here aktardığı gibi. Kullanıcı Arabirimi henüz boyutlandırılmamış ve henüz ekranda görüntülenen .

Ben size zaten ne yaptığını yapmak istediğim şüphe - widget onların tıklanabilir alanlar değişmez animasyonlu ediliyor ve böylece düğme hala vardır nasıl bakılmaksızın orijinal yönde tıklama cevap verecektir döndürülmüş.

söyleniyor, bu sorunu önlemek için, sonra düzen dosyası ve kaynak kodundan o boyut kaynağı referans, düğme boyutunu tanımlamak için bir boyut kaynağı kullanabilirsiniz.

+0

Bu soruya nasıl bir cevap veriyor? – xmen

1

onCreate yönteminiz yürütüldüğünde, Android henüz düzen geçişi veya ölçüm geçişini gerçekleştirmedi. Eğer RelativeLayout kullandığınız özellikle (iki düzen ağacı boyunca geçer yani boşluklar),

Sen measure yöntemi kullanarak bakış boyutunu ölçmek olabilir ama şiddetle yerine ViewTreeObserver bir geri arama uygulanması tavsiye ediyorum.

Eğer her öğenin yerleştirileceği tam olarak nerede biliyor ve bunlara karşılık gelen boyutlarda bir kez Düzeninize herhangi bir ayarlama yapmak sonra ViewTreeObserver.OnGlobalLayoutListener (link) açabilir.

+0

Başlangıç ​​genişliğini ve yüksekliğini ayarlamayı denedim.Bunu yapmak için iyi bir yol değil. Daha iyi yol, kendi nesnesini oluşturur ve onMeasure olayını uygular. – foterm

İlgili konular