【问题标题】:Path.offset() not working on every devicePath.offset() 不适用于所有设备
【发布时间】:2014-12-11 12:16:07
【问题描述】:

我在使用 android.graphics.path 时遇到了一些问题。
我正在开发一个游戏。我有一些路径。他们不会改变那里的大小和形状。我把它们画在画布上。我在每个游戏的框架中移动它们。所以我设置了一个偏移量:dx

它在许多设备上都能正常工作:

  • Nokia X Dual Sim(Android 4.4.4 Cyanogenmode)(API 级别 19)
  • 三星 Galaxy Duos (GT-S7562)(Android 4.0.4)(API 级别 15)
  • Sony X8(Android 2.3.7 Cyanogenmode)(API 级别 10)
  • 以及其他一些

但它在其他一些设备上效果不佳:

  • 三星 Galaxy Ace II (Android 4.1.2)(API 级别 16)
  • Nokia X Dual Sim(Nokia X 平台 1.2)(Android Studio 显示:API 级别 16)
  • 以及其他一些 我在 draw 方法中设置了偏移量:

    path.offset(dX, 0);

不工作意味着:它不动。系统将其拉到原来的位置。
但是当它起作用时,它会下降(移动,而且速度很快)

我也试过矩阵:

translateMatrix = new Matrix();
translateMatrix.setTranslate(dX, 0);
path.transform(translateMatrix);

同样的事情发生了。

我在 Android 的开发者网站上看到了一些东西: http://developer.android.com/reference/android/graphics/Path.html
无效偏移(浮动 dx,浮动 dy)
将路径偏移 (dx,dy),成功时返回 true。
???一定是变了,所以这里出错了

可能与硬件加速模式有关:
https://groups.google.com/forum/#!topic/android-developers/HgGVSbSghpk

我从 Api 级别 9 开始支持,但我开启了 Harware 加速模式。 (它适用于 API 级别 14)
当我关闭它时,问题也会出现。
我不明白为什么它有时可以在 API 级别 14 上运行,而有时为什么不行?

上面写着,硬件加速模式支持Path:
http://android-developers.blogspot.de/2011/03/android-30-hardware-acceleration.html

你知道这有什么问题吗?我该怎么办?

更复杂的东西: 这适用于每台设备(但运行速度较慢 - 它滞后):

Canvas temp = new Canvas(bitmap);
path.draw(temp);
originalCanvas.drawBitmap(bitmap, 0, 0, myPaint);

所以

  1. 我做了一个临时画布
  2. 我在位图上设置了
  3. 我在画布上画画(它将在位图上)
  4. 我将位图绘制到原始画布上

为什么它在这里工作?

请帮助我如何使它工作。

【问题讨论】:

  • 注意:我只有 API 级别 16 的问题

标签: android graphics


【解决方案1】:

我让它工作了,但不是偏移量

我自己做了偏移函数:

  1. 它保存最后一个位置,并使用 偏移量。
  2. 然后它在不使用 operator new 的情况下创建一个新 Path

    calculateNewPoints();
    wallpath.rewind();
    wallpath.moveTo(newPosX, newPosY);
    .
    .
    .
    wallpath.close();

表现不错:)

【讨论】:

    【解决方案2】:

    在清单上的 API 级别 16 上,将以下属性添加到应用程序 <application android:hardwareAccelerated="false" ...>

    【讨论】:

      【解决方案3】:

      确实,在较旧的 Android 设备上似乎存在与 Path.offset() 相关的错误。

      我购买了一部 8 岁的“三星 Galaxy S3”手机,运行 Android 4.1.2 测试my word game,惊讶地发现,应用中的Paths 没有填满:

      我的解决方法如下所示,对于较旧的 Android 设备,我不再使用 Path.offset(),而是使用 Canvas.translate(),然后绘制未偏移的 Path 对象:

      public class LetterTile extends RectF {
      
          // consider anything older then Android 6.0 Marshmallow as an old device
          public static final boolean TOO_OLD =
              (Build.VERSION.SDK_INT < Build.VERSION_CODES.M);
      
          private final Path mPathFill = new Path();
          // mPathFillMoved is same as mPathFill, but offset by left, top
          // it is used on newer devices to paint gradient over all tiles
          private final Path mPathFillMoved = new Path();
      
          public void draw(Canvas canvas, Paint gradientPaint) {
              if (!TOO_OLD) {
                  // the mPathFillMoved only works on newer Android devices
                  canvas.drawPath(mPathFillMoved, gradientPaint);
              }
      
              canvas.save();
              canvas.translate(left, top);
      
              if (TOO_OLD) {
                  // on older Android devices just draw mPathFilled in plain yellow
                  canvas.drawPath(mPathFill, gradientPaint);
              }
      
              canvas.restore();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-07
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多