2014-01-13 40 views
0

我想使用4x4像素位圖(牆上的另一塊磚)繪製線條,該線條可以在任何位置開始/停止並沿任何方向前進。使用畫布創建自定義線條

我想類似如下:

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.brick); 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float newWidth = Math.abs(line.startX - line.stopX); 
    float newHeight = Math.abs(line.startY - line.stopY); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
    Matrix m = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, (int)line.startX,(int)line.startY, width, height, matrix, false); 
    canvas.drawBitmap(resizedBitmap, m, paint); 

我意識到這是一個調整大小,而不是繪製.BMP順序。此外它會拋出錯誤x + width must be <= bitmap.width()

有沒有人有任何建議的技術在這裏使用?

+0

您是否正在尋找依次使用最緊密的包裝來防止重疊,或者只是在某些恆定的位置增量上對位圖進行構圖? – hunt

+0

尋找繪製時沒有重疊......我可以計算出我想繪製的線的方程式'Y = MX + C'並且考慮了垂直情況 – avrono

回答

0

據我所知,使用最簡單的方法是計算X增量值和Y增量值。這個計算的性質取決於你想要緊密排列的位圖還是重疊:

對於重疊,這應該是一個簡單的斜率計算(不要忘記零/無窮大斜率邊緣情況!)。

對於緊密打包,通過比較該線與圖像對角線上繪製的線的斜率,確定緊密打包的方向(X或Y)。如果線條比圖像對角線更陡,則需要Y緊密包裝。在另一種情況下,您需要X緊密包裝。

然後,計算增量值。緊密打包軸中的增量值(如果需要的話)將是沿着該軸的位圖的尺寸。另一個軸上的增量值將是線的斜率和緊密堆積增量的簡單線性函數。

一旦你有你的增量值,反覆繪製位圖到畫布,啓動該線起始位置,並增加了抽獎位置的每個迭代。 當您的增量導致任一值超出行末端時停止迭代。在計算增量和檢查行結束時,必須考慮到行座標可能從低數到高數,或從高數到低數的事實。

你也可能會決定你並不總是想從起點開始繪畫,而是想讓你的線「居中」,這樣開始和結束的圖像在它們的中心與實際的終點等距。在這種情況下,你必須計算一個不同的起點,但它應該涉及相當簡單的數學。

+0

聽起來非常合乎邏輯,'canvas.drawBitmap'的形式最好適合? – avrono

+0

我遵循了你的建議:製作了三種情況,垂直,水平和對角線,並沿着X,Y或X和Y線遞增。工作得很好! – avrono

+0

@avrono很高興看到你想出了drawBitmap的正確合同。如果這回答了你的問題,你能把它標記爲答案嗎?這將相信我的聲譽,並使其他遇到同樣問題的用戶更容易找到答案。 – hunt