【问题标题】:Canvas not displaying all drawn parts in Custom View?画布没有在自定义视图中显示所有绘制的部分?
【发布时间】:2012-07-12 21:27:58
【问题描述】:

我正在为一个 Android 应用程序开发一个自定义视图,类似于 Mind the Robot 提供的 Analog Gauge 示例代码。

从列出的站点运行代码,我会在屏幕上看到这个:

(摩托罗拉机器人,2.2.3),(模拟器,4.0.3)

(Xoom, 4.0.3)(其他手机, 4.0.3)

手不见了!

正在进行绘图调用(我可以在 logcat 中看到它们),但调用绘制的画布元素是不可见的。

不过,它不依赖于 API 级别;如果我以正确的方式将它导入到项目中,当我在 Xoom 上运行它时,它就会显示出来。

但是,当我将文件移动到不同的项目文件夹(相同的源代码,相同的布局)时,它又会丢失表盘。

发生了什么事?相同的代码怎么会在不同的设备上产生如此不同的结果?

【问题讨论】:

    标签: android android-emulator android-canvas android-view


    【解决方案1】:

    所以,我的谜团中的关键线索似乎是它在模拟器上工作,而不是在硬件设备上。

    硬件渲染

    我确实仔细阅读了 Android 开发者网站上的硬件渲染页面,但显然不够仔细。

    http://developer.android.com/guide/topics/graphics/hardware-accel.html

    虽然它确实提到 API 从版本 11 开始可用,但它并没有说 从 API 级别 14 (ICS) 开始默认为所有应用程序启用硬件渲染。 p>

    这对我们意味着什么?

    几乎一切都更快;除了一些不起作用的东西。

    我在不知不觉中违反了其中两个:

    • Canvas.DrawTextOnPath()
    • Paint.setShadowLayer()

    API 参考中没有提到(或者我能找到的任何其他地方,当然也没有被 Lint 检查过),但是使用任何列出的操作都会做一些奇怪的事情。

    就我而言,Canvas.DrawTextOnPath() 似乎工作得很好。

    但当 Android 注意到我在手上使用的油漆设置了阴影层时,它会默默地忽略它。

    我如何知道我的 View 是否经过硬件加速?

    来自上面的文档链接:

    有两种不同的方法可以检查应用程序是否是硬件加速的:

    • 如果视图附加到硬件加速窗口,View.isHardwareAccelerated() 返回 true。
    • Canvas.isHardwareAccelerated() 如果 Canvas 是硬件加速的,则返回 true

    如果您必须在绘图代码中执行此检查,请尽可能使用 Canvas.isHardwareAccelerated() 而不是 View.isHardwareAccelerated()。当视图附加到硬件 > 加速窗口时,它仍然可以使用非硬件加速的 Canvas 进行绘制。例如,当出于缓存目的将视图绘制到位图中时,就会发生这种情况。

    在我的情况下,似乎发生了相反的情况。 自定义视图记录它不是硬件加速的;但是,画布报告它是硬件加速的。

    解决方法和修复

    最简单的解决方法是强制自定义视图进行软件渲染。根据文档,这可以通过以下方式完成:

    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    

    或者,您可以删除有问题的操作,并保持打开硬件渲染。

    从我的不幸中吸取教训。祝大家好运。

    【讨论】:

    • Eagle,您是否能够在使用加速 2D 渲染的同时显示手?当我删除违规操作时,手仍然不见了。 (软件渲染选项效果很好)。
    【解决方案2】:

    我把它放到 init() 中,然后就可以正常工作了。

        private void init() {
        setLayerType(myView.LAYER_TYPE_SOFTWARE, null);
        ....
    }
    

    【讨论】:

      【解决方案3】:

      with myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);建议我可以看到手。但我还有一个问题:我看到比例尺只写了 0!如图和架构外的两个策略零:(GALAXY NEXUS 4.2.1)

      我的 drawScale() 方法如示例所示:

       private void drawScale(Canvas canvas) {
              canvas.drawOval(scaleRect, scalePaint);
      
              canvas.save(Canvas.MATRIX_SAVE_FLAG);
              for (int i = 0; i < totalNicks; ++i) {
                  float y1 = scaleRect.top;
                  float y2 = y1 - 0.020f;
      
                  canvas.drawLine(0.5f, y1, 0.5f, y2, scalePaint);
      
      
                  if ((i % 5) == 0) {
                      int value = nickToDegree(i);
      
                      if ((value >= minDegrees) && (value <= maxDegrees)) {
                          String valueString = Integer.toString(value);
                          canvas.drawText(valueString, 0.5f, y2 - 0.015f, scalePaint);
      
                      }
                  }
      
                  canvas.rotate(degreesPerNick, 0.5f, 0.5f);
      
      
              }
              canvas.restore();
      
          }
      

      【讨论】:

      • scalePaint.setLinearText(true); // 调整文本绘制操作以优雅地处理缩放的平滑调整。字体提示被禁用以防止比例因子之间的形状变形,并且由于将生成大量字形图像,字形缓存被禁用。
      【解决方案4】:

      在我的情况下,我做了这个:

       AnalogView bar = (AnalogView) findViewById(R.id.AnalogBar);
          bar.setLayerType(bar.LAYER_TYPE_SOFTWARE, null);
      if (value_list.size()>0)   bar.SetData(Double.parseDouble(value_list.get(value_list.size()-1)));
      

      AnalogView 中的 SetData 在哪里

      public  void SetData(double data) {
          setHandTarget((float)data);
        invalidate();
      }
      

      【讨论】:

        【解决方案5】:

        在 Galaxy S4 Android 4.4.2 上

        TYPE_TEMPERATURE 已弃用

        使用

        TYPE_AMBIENT_TEMPERATURE

        【讨论】:

          【解决方案6】:

          对于在初始化时按比例绘制文本有问题的任何人,请执行以下操作:

          scalePaint.setLinearText(true);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-08-12
            • 2017-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多