6

为什么 lColorWheel.getWith() 方法返回 0?我猜它与 onMeasure 事件有关,但我真的无法从文档中理解它是如何工作的。我必须在哪里设置 mDrawable 的尺寸?

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

并适当的 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>

谢谢

4

4 回答 4

16

如果要在渲染完成之前使用它们,则需要测量视图的高度和宽度。

以下代码将帮助您测量任何视图的高度和宽度。

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

在使用视图的高度和宽度之前编写此代码。

有时这种方法不会给出正确的结果。有它的替代品。下面的代码将在屏幕上绘制之前计算高度和宽度。

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;
    }
});
于 2013-06-11T10:25:15.520 回答
1

你调用 getwidth() 太早了,UI 还没有准备好获取这个值。你需要一个观察者。我认为这个值是在 UI 的第一次绘制之后设置的。在你的 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);
          }
      });
   }
于 2013-06-11T10:26:34.150 回答
1

当您的onCreate方法正在执行时,Android 尚未完成它的布局传递或测量传递。

您可以使用该measure方法测量视图的大小,但我强烈建议您在ViewTreeObserver上实现回调,特别是因为您正在使用RelativeLayout(沿树执行两个布局传递)。

一旦您确切知道每个项目的放置位置及其相应的尺寸,您就可以使用ViewTreeObserver.OnGlobalLayoutListener(链接) 对布局进行任何调整。

于 2013-06-11T10:29:23.197 回答
0

正如 CommonsWare在这里引用的那样

您过早地调用 getWidth() 。UI 尚未在屏幕上调整大小和布局。

无论如何,我怀疑你是否想做你正在做的事情——被动画化的小部件不会改变它们的可点击区域,所以按钮仍然会响应原始方向的点击,不管它是如何旋转的。

话虽如此,您可以使用维度资源来定义按钮大小,然后从布局文件和源代码中引用该维度资源,以避免此问题。

于 2013-06-11T10:28:10.147 回答