1

我有一个自定义 View 子类,它允许用户画出一个汉字。线坐标被保存到一个浮点数组 (x1, y1, x2, y2, x2, y2, x3, y3...),它被缩放到单位大小,即所有坐标都是 0 和 1 之间的值。这使得稍后在不同尺寸的视图中对草图进行动画处理时更容易。它还有助于将绘制的内容与同一坐标空间中的另一个动画进行比较。坐标垂直翻转,也有助于进行比较。

这意味着当在 View 的 onDraw 方法中绘制线条时,必须在调用 drawLines 绘制草图之前放大和平移 Canvas。

在办公室的所有设备上(Android ~2.3)一切正常,模拟器也正常。然而,两名使用三星 Galaxy S2 手机的用户都报告称他们最近都升级到了 Android 4,他们发现这些行看起来“有问题”,如下所示:

说明问题

我尝试从 drawLines 切换到使用 Path 对象,但在这种情况下,用户报告说线条根本没有出现!

这是我配置油漆的方式:

    paint = new Paint();        
    paint.setStyle(Style.STROKE);
    paint.setStrokeWidth(kTCDrawPathWidth);
    paint.setStrokeCap(Cap.ROUND);
    paint.setStrokeJoin(Join.BEVEL);
    paint.setColor(Color.WHITE);

这就是我绘制草图的地方:

    RectF frame = getDrawingBounds();   
    canvas.drawRoundRect(frame, 3, 3, drawAreaFramePaint);      
    canvas.drawRoundRect(frame, 3, 3, drawAreaFrameBorderPaint);

    canvas.save();
    canvas.translate(frame.left, frame.top+frame.height());
    canvas.scale(frame.width(), -frame.height());

    for (TCPath path : paths)
        canvas.drawLines(path.getLines(), paint);

    if (drawingPath!=null)
        canvas.drawLines(drawingPath.getLines(), paint);

    canvas.restore();

有什么明显的问题吗?Android 4 中的 Paint/Canvas 行​​为是否发生了变化?

4

2 回答 2

1

如果您正在使用硬件加速,请尝试为正在绘制的自定义视图关闭它(myView.setLayerType(View.LAYER_TYPE_SOFTWARE)。您也可以尝试禁用抗锯齿,看看是否有帮助。

否则,我建议再给 Path 一个机会。

于 2012-06-28T05:00:28.220 回答
0

我不知道这是否正确,但以防万一:

canvas.scale(frame.width(), -frame.height());

减号在前面做什么frame.height()

你从什么中减去?

于 2012-06-28T02:43:46.203 回答