Path.offset()不适用于每个设备

时间:2014-12-11 12:16:08

标签: android graphics

我在android.graphics.path上遇到了一些问题 我正在开发一款游戏。我有一些路径。它们不会改变尺寸,形状。我把它们画在画布上。我在每个游戏的框架中移动它们。所以我设置了一个偏移:dx

它在许多设备上运行良好:

  • 诺基亚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)
  • 诺基亚X Dual Sim(诺基亚X平台1.2)(Android Studio显示:API级别16)
  • 以及其他一些人 我在draw方法中设置了偏移量:

    path.offset(dX,0);

不工作意味着:它不会移动。系统将其拉到原始位置 但是当它起作用时,它会起作用(移动,并且很快)

我也试过Matrixes:

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级,但我转向了Harware Accelerated模式。 (它的工作形式为API级别14)
当我关闭它时,问题也出现了 我不明白为什么它有时会超过API级别14,有时为什么不呢?

它说,硬件加速模式支持路径:
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. 我将位图绘制到原始画布上
  5. 为什么在这里工作?

    请帮助我如何使其发挥作用。

3 个答案:

答案 0 :(得分:0)

我做到了,但没有偏移

我制作了自己的偏移功能:

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

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



    wallpath.close();

  3. 表现良好:)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我购买了一部使用Android 4.1.2的8年旧“三星Galaxy S3”手机来测试my word game,但惊讶地发现该应用中的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();