2012-06-28 20 views
1

我有一個自定義的View子類,允許用戶勾畫出一箇中文字符。線座標被保存到被縮放到單位大小的浮點數組(x1,y1,x2,y2,x2,y2,x3,y3 ...),即所有座標都是0到1之間的值。這可以使後面的草圖在不同大小的視圖中進行動畫處理。它還有助於比較在同一座標空間中繪製的圖像與另一個動畫。座標垂直翻轉,以幫助進行比較。drawLines方法在縮放的畫布上產生奇怪的效果

這也就意味着,當線路中的視圖的OnDraw方法勾勒畫布具有擴大規模和drawLines通話繪製草圖之前翻譯。

在辦公室正常的所有設備(Android的2.3〜)一切顯示,和仿真器是好的了。但是,如下圖所示的兩個用戶與三星Galaxy S2手機,兩者誰最近報告升級到安卓4.0,發現該行出現「卡比」:

Illustrates problem

我試着開關遠離drawLines使用路徑對象,但在這種情況下,用戶報告,線路根本沒有出現!

下面是如何配置漆:

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行爲是否發生了變化?

+0

並不需要縮放kTCDrawPathWidth,paint.setStrokeWidth(kTCDrawPathWidth/frame.left); –

+0

路徑寬度設置爲這是成正比的座標值系統,在這種情況下爲0.018f。在正常情況下(我的設備)和這種奇怪的情況下,線寬似乎是正確的。 –

回答

1

如果您正在使用硬件加速,請嘗試將其關閉正在做抽獎(myView.setLayerType(View.LAYER_TYPE_SOFTWARE),你也可以嘗試禁用抗鋸齒,看看有沒有什麼可以幫助您的自定義視圖。

否則,我會建議給路徑再出手

+0

這確實解決了它。我試圖支持早期的API版本,並且這個方法是API 11+,所以我不得不將它封裝在try ... catch(NoMethodError)塊中。無論如何,這個問題只在Android OS 4中表現出來,所以沒關係。謝謝! –

+0

而不是做一個嘗試...趕上你應該只是如果關閉http://developer.android.com/reference/android/os/Build.VERSION.html#SDK_INT - 更快的方式:) –

0

我不知道這是否是正確的或沒有,但以防萬一:

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

什麼是負唱的frame.height()前在做什麼?

你這是從減法?

+0

首先我按高度平移,然後縮放由負高度。這顛倒了圖紙。這樣做很方便,因爲繪圖將與另一個也翻轉的圖形進行比較。正如你所看到的,繪圖處於正確的位置 - 它看起來有點奇怪! –