一半君的总结纸

听话只听一半君

#16 如何在一个滑条( slider)和某个属性( attribute)之间建立对应关系 让他们能够实时更新?

有两种方法.

方法 #1: 使用 ‘connectControl’ 命令:

// 创建一个 sphere 用于测试
string $sphereA[] = `polySphere -r 10 -sx 16 -sy 8 -ax 0 1 0 -tx 1 -ch 1`;
string $sphere = $sphereA[0];

// 下面是个“超复杂的” custom UI

if ( `window -exists myWindow` )
  deleteUI -window myWindow;

window -title "connectControl" myWindow;
  string $form = `formLayout`;

    // 创建 slider
    string $label = `text -label "Sphere rotateY" -align "right"`;
    string $field = `floatField -min 0.0 -max 360.0 -precision 2`;
    string $slider = `floatSlider -min 0.0 -max 360.0`;

    // 把 sphere的 Y rotation 连到 controls 上
    connectControl $field ( $sphere + ".rotateY" );
    connectControl $slider ( $sphere + ".rotateY" );

    // 编辑 formLayout
    formLayout -e
      -af   $label    top   6
      -af   $label    left  2
      -af   $field    top   2
      -ac   $field    left  4   $label
      -af   $slider   top   2
      -ac   $slider   left  2   $field
      -af   $slider   right 2
        $form;

showWindow;

attrFieldGrp

优点: 因为每个control是格子连接到属性上的,所以你可以自由的控制UI的摆放位置. 比如你可以把lable放在 field/slider 组合的上面, 或者可以把 slider 单独自己放一排.

缺点: 当这个属性被animCurve驱动的时候从UI上看不出来  (比如. 背景变成橙色) ,而且没有右键菜单 ‘Set Key’ 等等. (虽然你也可以在之后自己来加).

方法 #2: 使用 ‘attrFieldSliderGrp’ 命令,他可以自动建立连接:

string $sphereA[] = `polySphere -r 10 -sx 16 -sy 8 -ax 0 1 0 -tx 1 -ch 1`;
string $sphere = $sphereA[0];

// 下面是个“超复杂的” custom UI

if ( `window -exists myWindow` )
  deleteUI -window myWindow;

window -title "attrFieldSliderGrp" myWindow;
  columnLayout -adjustableColumn true;

    // 创建 slider
    string $slider = `attrFieldSliderGrp -label "Sphere rotateY"
      -adjustableColumn 3 -columnAlign 1 "right"
      -columnWidth 1 84 -columnWidth 4 1
      -min 0.0 -max 360.0 -at ( $sphere + ".rotateY" )`;

showWindow;

attrFieldGrp

优点: Keyframe 了可以看出来 – 如果你key了他,field 背景会变成橙色, 如果lock了,会是灰色等等.

缺点: 不能详细控制 layout . 你只能改变每个group element的大小, 但是所有的element都只能出现在同一排, 只能有两个 label fields, 这在UI上占了不少位置.

用哪种方法取决于你要哪种结果: 是更好的控制 layout control的位置, 还是更完整的keyframe支持. 大多数 animators 肯定会要求你把UI做成后者的样子, 所以你只好牺牲一点UI上的空间了. 下面是一些设置 ‘attrFieldSliderGrp’ control的小技巧:

  • 如果把control放在 ‘columnLayout’里,那你可以加上 ‘−adjustableColumn true’ 并且…
  • 使用 ‘−adjustableColumn 3’ ,这样slider control 可以随着 parent layout的大小变化自动缩放.
  • 使用 ‘−columnWidth 1 n’ 可以设置 control的 label的宽度.
  • 使用 ‘−columnWidth 4 1’ 可以减少 slider右侧的空白区域.
Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: