Path.offset() 在某些设备上无法正常工作。

4

我在android.graphics.path上遇到了一些问题。

我正在开发一款游戏,我有一些路径。它们的大小和形状不会改变。我将它们绘制到画布上,然后在每一帧中移动它们。所以我设置了一个偏移量: dx。

在许多设备上都可以正常工作:

  • Nokia X Dual Sim (Android 4.4.4 Cyanogenmode)(API level 19)
  • Samsung Galaxy Duos (GT-S7562)(Android 4.0.4)(API level 15)
  • Sony X8 (Android 2.3.7 Cyanogenmode)(API level 10)
  • 还有其他一些设备

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

  • Samsung Galaxy Ace II (Android 4.1.2)(API level 16)
  • Nokia X Dual Sim (Nokia X platform 1.2)(Android Studio显示:API level 16)
  • 还有其他一些

    我在绘制方法中设置了偏移量:

    path.offset(dX,0);

“不工作”意味着:它没有移动。系统将其绘制到原始位置。
但当它正常工作时,它的移动速度非常快。

我也尝试过使用矩阵:

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

同样的事情发生了。
我在Android开发者网站上看到了一些东西: http://developer.android.com/reference/android/graphics/Path.html
void offset(float dx, float dy)
通过(dx,dy)偏移路径,成功返回true。
???它必须已经改变了,这就是为什么会出现错误的原因。
这可能与硬件加速模式有关:
https://groups.google.com/forum/#!topic/android-developers/HgGVSbSghpk
我支持API级别9,但我已经打开了硬件加速模式。(它适用于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上遇到了这个问题。 - Tomi
3个回答

1
I made it work, but not with the offset 我让它工作了,但没有使用偏移量
I made my own offset function: 我自己编写了偏移函数:
1. it saves the last position, and calculates the new one with the offset. 1. 它保存最后一个位置,并用偏移量计算新位置。
2. Then it creates a new Path without using operator new 2. 然后创建一个新的路径,而不使用operator new
calculateNewPoints(); wallpath.rewind(); wallpath.moveTo(newPosX, newPosY); . . . wallpath.close();
它表现得很好 :)

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

0

在旧版的Android设备上,Path.offset()存在一个与bug相关的问题。

我购买了一部配有Android 4.1.2的8年旧款“三星Galaxy S3”手机进行我的文字游戏测试,并惊奇地发现应用程序中的Path未被填充:

screenshot

我的解决方法如下,对于旧版的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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接