2013-06-11 12 views
6

Dlaczego metoda lColorWheel.getWith() zwraca 0? Myślę, że ma to coś wspólnego z wydarzeniem onMeasure, ale naprawdę nie mogę zrozumieć z jego dokumentacji, jak to działa. Gdzie muszę ustawić wymiary dla mDrawable?View.getWidth() nie działa w metody onCreate?

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

i jest właściwa plik XML:

<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

Odpowiedz

15

trzeba zmierzyć wysokość i szerokości widoku, jeśli chcesz korzystać z nich przed renderowania wykończeń.

Poniższy kod pomoże ci zmierzyć wysokość i szerokość dowolnego widoku.

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

Napisz ten kod przed użyciem wysokości i szerokości widoku.

Czasami takie podejście nie daje właściwego wyniku. Istnieje alternatywa. Poniższy kod obliczy wysokość i szerokość przed rysowaniem na ekranie.

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

Zawsze uzyskuję 0,0, gdy stosuję metodę pomiaru. czemu? i w jaki sposób imgView może znać wymiar, który chce być? – suitianshi

0

Wywołujesz getwidth() zbyt wcześnie, interfejs użytkownika nie jest gotowy do uzyskania tej wartości. Potrzebujesz obserwatora. Myślę, że ta wartość jest ustawiona tuż po pierwszym malowaniu interfejsu użytkownika. Spróbuj tego w metodzie swojej onCreate():

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

cytowany przez CommonsWare here

Telefonujesz getWidth() zbyt wcześnie. Interfejs użytkownika nie ma rozmiarów, a na ekranie jest jeszcze wyświetlana .

wątpię chcesz robić to, co robisz, tak czy owak - widgety animowany nie zmieniają swoje klikalne obszary, a więc przycisk będzie nadal reagować na kliknięcia w orientacji oryginalnego niezależnie od jak to ma obrócone.

Zgodnie z powyższym można użyć zasobu wymiaru w celu zdefiniowania rozmiaru przycisku , a następnie odniesienia do tego zasobu wymiaru z pliku układu i do uzyskania kodu źródłowego , aby uniknąć tego problemu.

+0

Jak to jest odpowiedź na pytanie? – xmen

1

Gdy wykonywana jest metoda onCreate, system Android jeszcze nie wykonał przejścia dla układu lub pomiaru.

Można było zmierzyć wielkość widoku z zastosowaniem metody measure ale Zdecydowanie polecam wdrożenia zwrotnego na ViewTreeObserver zamiast, zwłaszcza, że ​​używasz RelativeLayout (który ma dwa układ przechodzi wzdłuż drzewa).

Za pomocą ViewTreeObserver.OnGlobalLayoutListener (link) można następnie wprowadzić dowolne poprawki w układzie, jeśli wiesz dokładnie, gdzie każdy przedmiot zostanie umieszczony i odpowiadające mu rozmiary.

+0

Próbowałem ustawić początkową szerokość i wysokość.To nie jest dobry sposób na zrobienie tego. Lepszym sposobem jest stworzenie własnego obiektu i wdrożenie zdarzenia onMeasure. – foterm

Powiązane problemy