2013-07-12 29 views
2

我現在在畫布上畫點,可以放大或縮小。即使在畫布放大或縮小時,始終在畫面上的固定點繪製一個點? - Android

據我所知,繪圖功能canvas.drawCircle()接受了畫布座標系中的座標。此外,當畫布放大時,座標保持不變。

E.g.之前您在畫布座標系中畫一個點(50, 50),然後放大畫布,畫布中點的座標仍然爲(50, 50)。但顯然,這個點已經被移動了w.r.t.屏幕。

當畫布放大時,點應該保持在屏幕上的相同位置。 * 點移動之後w.r.t.到屏幕上,我想把它移回原來的位置w.r.t.屏幕。 *

onDraw()功能如下:

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    canvasWidth = canvas.getWidth(); 
    canvasHeight = canvas.getHeight(); 

    canvas.save(); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 
    mImage.draw(canvas); // draw the map as the background 

      Paint PointStyle = new Paint(); 
    PointStyle.setColor(Color.BLUE); 
    PointStyle.setStyle(Paint.Style.FILL_AND_STROKE); 
    PointStyle.setStrokeWidth(2); 

    canvas.drawCircle(Constant.INITIAL_X, Constant.INITIAL_Y, 3, PointStyle); 

    canvas.restore(); 
} 

我嘗試以下方法換算後,移動該點背在屏幕上。

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 

     mScaleFactor *= detector.getScaleFactor(); // accumulate the scale factors 
     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(1f, Math.min(mScaleFactor, 10.0f)); // 1 ~ 10 

     float pinToCornerOnScreenXDistance = 0; 
     float pinToCornerOnScreenYDistance = 0; 
     float canvasToScreenDiffRatioX = 0; 
     float canvasToScreenDiffRatioY = 0; 
     float pinOnCanvasX = 0; 
     float pinOnCanvasY = 0; 

     // pin's location on the screen --> S:(336, 578) 
     pinToCornerOnScreenXDistance = 336 - canvasLeftTopCornerOnScreenX; 
     pinToCornerOnScreenYDistance = 578 - canvasLeftTopCornerOnScreenY; 
     Log.d("Screen Diff", "X: " + pinToCornerOnScreenXDistance + " Y: " + pinToCornerOnScreenYDistance); 

     canvasToScreenDiffRatioX = canvasWidth * mScaleFactor/720; // screen of HTC One X --> 720*1280 
     canvasToScreenDiffRatioY = canvasHeight * mScaleFactor/1280; 
     Log.d("Ratio", canvasToScreenDiffRatioX + " " + canvasToScreenDiffRatioY); 

     pinOnCanvasX = 0 + pinToCornerOnScreenXDistance * canvasToScreenDiffRatioX; // canvas left top corner is the origin (0, 0) 
     pinOnCanvasY = 0 + pinToCornerOnScreenYDistance * canvasToScreenDiffRatioY; 
     Log.d("Pin on Canvas", "X: " + pinOnCanvasX + " Y: " + pinOnCanvasY); 

     Constant.setInitialX(pinOnCanvasX); 
     Constant.setInitialY(pinOnCanvasY); 
     historyXSeries.set(0, Constant.INITIAL_X); 
     historyYSeries.set(0, Constant.INITIAL_Y); 

     invalidate(); 
     return true; 
    } 
} 

思想是基於這樣的事實,我注意到,當我或縮小畫布放大,其左上角永遠不會發生變化。也就是,畫布'讓頂角是放大中心。

然後,當畫布移動時,我成功地更新了縮放中心的座標。因此,通過這種方式,無論我移動畫布還是放大畫布,我都始終在縮放中心的座標爲canvasLeftTopCornerOnScreenXcanvasLeftTopCornerOnScreenY

然後,我嘗試利用從不移動縮放中心縮放中心到期望的位置之間的距離,我希望在這裏放置我的點,(336, 578)。我計算它爲pinToCornerOnScreenDistance

顧名思義,它是屏幕上的距離。我必須將它縮放爲畫布距離,以便繪製點,因爲繪圖功能基於畫布座標系而不是屏幕座標系。目前,該代碼是特定於設備的,即僅用於目前擁有1280 * 720屏幕的HTC One X。所以我做的比例如下:

canvasToScreenDiffRatioX = canvasWidth * mScaleFactor/720; 
canvasToScreenDiffRatioY = canvasHeight * mScaleFactor/1280; 

然後,最後我計算在屏幕上點(336, 578)的新畫布上的座標,然後繪製點在那裏。

但結果不正確。當我放大畫布時,我畫的點不能保持在屏幕上的(336, 578)

有人可以告訴我哪裏出了問題嗎? 或者提出另一種方法來做到這一點?

任何意見或答覆將不勝感激!

回答

1

您的應用程序是否使用全屏?否則,高度不是1280。但我不認爲這是你的問題。

根據我的理解,我將更改代碼以

pinOnCanvasX = 336/mScaleFactor; 
pinOnCanvasY = 578/mScaleFactor; 

我以爲當mScaleFactor == 1,則引腳畫布上屏幕上有相同

0

試試這個, 我想,這可能是你的問題非常有用,

pinOnCanvasX = (336 * mScaleFactor) + trans_x; 

pinOnCanvasY = (578 * mScaleFactor) + trans_y; 

here, trans_x and trans_y is translation of canvas on x and y axis. here in your case should be mPosX, mPosY but not sure what these points means for. 

我想與大家分享的方式,你是一個擴展nd像畫布一樣翻譯起始點 。這意味着,如果您的畫布 按比例縮放並翻譯過一些值,那麼您的起點也適用 。

希望這能解決您的問題。