如何以编程方式设置切换拇指和跟踪绘图?

时间:2015-09-02 07:38:38

标签: android uiswitch theming

我正在尝试以编程方式为Switch定义一些自定义drawable,使用jelly bean引入setXXXDrawable()方法。然而,事情对我来说并不奏效。

我目前的代码:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    ((Switch) view).setShowText(true);

  //Background
  StateListDrawable back = new StateListDrawable();
  GradientDrawable backn = new GradientDrawable();
  backn.setColor(TX.res.getColor(R.color.textSecondary));
  backn.setCornerRadius(8 * TX.res.getDisplayMetrics().scaledDensity);
  GradientDrawable backd = new GradientDrawable();
  backn.setColor(TX.res.getColor(R.color.textDisabled));
  backn.setCornerRadius(8 * TX.res.getDisplayMetrics().scaledDensity);
  back.addState(new int[]{-android.R.attr.state_enabled}, backd);
  back.addState(StateSet.WILD_CARD, backn);

  ((Switch) view).setTrackDrawable(back);

  GradientDrawable thumbn = new GradientDrawable();
  thumbn.setColor(TX.res.getColor(R.color.colorAccent));
  thumbn.setCornerRadius(8 * TX.res.getDisplayMetrics().scaledDensity);
  //((Switch) view).setThumbDrawable(thumbn);

如果我只设置拇指可绘制,JellyBean和Lollipop都可以正常工作。

如果我只设置轨道可绘制,那么棒棒糖会正确显示它。如果我也设置拇指可绘制,棒棒糖既不绘制,也只绘制文本。

另一方面,当我尝试设置轨道可绘制时,果冻豆只会立即显示几个点。这些点显然属于拇指(即使我只设置了可绘制的轨道),因为它们在按下开关时会移动。

我如何声明我的drawables,以便这对我有利?

1 个答案:

答案 0 :(得分:0)

开关的高度完全取决于轨道可绘制,GradientDrawable的默认大小大概为0或1,我发现设置大小可以解决问题。

[...]
backn.setSize(1,50);
[...]
backd.setSize(1,50);

请注意,开关和轨道的宽度完全基于拇指小部件宽度的两倍,该小部件是打开或关闭状态的最大宽度的大小。这就是为什么轨道的宽度是一个像素并不重要的原因。