我在android.graphics.path上遇到了一些问题 我正在开发一款游戏。我有一些路径。它们不会改变尺寸,形状。我把它们画在画布上。我在每个游戏的框架中移动它们。所以我设置了一个偏移:dx
它在许多设备上运行良好:
但它在其他一些设备上效果不佳:
以及其他一些人 我在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);
所以
为什么在这里工作?
请帮助我如何使其发挥作用。
答案 0 :(得分:0)
我做到了,但没有偏移
我制作了自己的偏移功能:
然后它创建一个新的Path而不使用operator new
calculateNewPoints();
wallpath.rewind();
wallpath.moveTo(newPosX,newPosY);
。
。
。
wallpath.close();
表现良好:)
答案 1 :(得分:0)
在清单上的API级别16上,将以下属性添加到应用程序
<application android:hardwareAccelerated="false" ...>
答案 2 :(得分:0)
实际上,在较旧的Android设备上似乎存在与Path.offset()
相关的错误。
我购买了一部使用Android 4.1.2的8年旧“三星Galaxy S3”手机来测试my word game,但惊讶地发现该应用中的Path
未被填充:>
我的解决方法如下所示,对于较旧的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();