drawLines方法在缩放的Canvas上产生奇怪的效果

时间:2012-06-28 02:17:20

标签: android graphics paint android-canvas

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

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

在办公室的所有设备上(Android~2.3),一切正常显示,模拟器也可以。但是,两位使用三星Galaxy S2手机的用户,他们最近报告升级到Android 4,发现线条看起来像“gappy”,如下所示:

Illustrates problem

我尝试从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行为是否有变化?

2 个答案:

答案 0 :(得分:1)

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

否则我会建议给Path另一个镜头。

答案 1 :(得分:0)

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

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

frame.height()前面的负面唱歌是什么?

你从中减去什么?