2015-11-04 129 views
1

enter image description here我有一個應用程序中,它有一個主要的畫布,我已經加在它上面的位圖的其他畫布內。在主畫布中,我有橡皮擦,當用戶觸摸位圖區域時,橡皮擦會檢測到它。由於位圖畫布與主畫布不同,我想知道從主畫布移動時橡皮擦接觸的位圖內部的x和y等。我希望主畫布的x和y與要移動的位圖畫布相同。由於如何獲得X和Y觸摸位置的位圖

這裏是我的代碼段

public void touch_move(float x, float y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
    } 
    if(istouchingBitmap(x, y) == true){ 
     float xRatio = (float)bitmap.getWidth()/parent.getWidth(); 
     float yRatio = (float)bitmap.getHeight()/parent.getHeight(); 
     float xPos = lastX * xRatio; 
     float yPos = lastY * yRatio; 
     eraseBitmap(bitmap, xPos , yPos , 5); 
    } 
} 

功能,探測位圖時觸摸

/** 
* 
* @param x The X location of the cursor in main View. 
* @param y The Y location of the cursor in main View. 
* @return This is only used to detect if the cursor is touching the Bitmap Image. 
*/ 
public boolean istouchingBitmap(float x, float y) { 
    matrix.invert(inverse); 
    float[] pts = {x, y}; 
    inverse.mapPoints(pts); 
    if (!bounds.contains(pts[0], pts[1])) { 
     return false; 
    } 
    // copy the location 
    lastX = x; 
    lastY = y; 
    return Color.alpha(bitmap.getPixel((int) pts[0], (int) pts[1])) != 0; 
} 
+0

看一看這樣的:http://stackoverflow.com/questions/2447564/detect-touch-on-bitmap – Khuong

+0

你好@ khuong291。我已經更新了這個問題。我已經訪問過該鏈接:) – donmj

回答

1

你只需要得到從觸摸事件的X和Y值。

然後sustract頂部,左邊距/分別偏移值。

結果是X,Y座標系相對於所述位圖的開始。

PD:做這件事時,我是有問題的處理狀態欄的高度,因爲測量它的Android版本和設備型號之間改變的方式。

希望這會有所幫助。

+0

嗨@Nanoc。 「然後分別抽取頂部左邊距/偏移值。」你的意思是位於頂部的邊緣?感謝提示:)。 – donmj

+0

佈局上的邊距,填充,x位置,無論是作爲圖像的偏移量 – Nanoc

+0

我不認爲我明白它。到目前爲止,我在這裏所做的是將主視圖投影爲頂部圖像的高度和寬度。正如你所看到的,當我去到圖像頂部擦除頂部.. – donmj

0

最後:)。此代碼將屏幕X和Y映射到位圖內的x和y。希望它能幫助別人。祝你好運

float[] point = new float[] {lastX, lastY}; 
Matrix inverse = new Matrix(); 
matrix.invert(inverse); 
inverse.mapPoints(point); 
bitmapX = point[0]; 
bitmapY = point[1]; 

canvas.drawCircle(bitmapX, bitmapY, radius, mPaint); // punch a hole