【问题标题】:How to set switch thumb and track drawables programmatically?如何以编程方式设置切换拇指和跟踪可绘制对象?
【发布时间】:2015-09-02 07:38:38
【问题描述】:

我正在尝试以编程方式为 Switch 定义一些自定义可绘制对象,使用 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);

如果我只设置 thumb drawable,JellyBean 和 Lollipop 都会按预期工作。

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

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

我怎样才能声明我的可绘制对象,以便对我有利?

【问题讨论】:

    标签: android uiswitch theming


    【解决方案1】:

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

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

    请注意,开关和轨道的宽度完全基于拇指小部件宽度的两倍,这是打开或关闭状态的最大宽度的大小。这就是为什么轨道的宽度是否为 1 像素无关紧要。

    【讨论】: