2012-06-08 83 views
4

我正在爲我的工作分配一個android項目。我正在嘗試製作一個臨時圖像應用程序,您知道它就像我們在屏幕上劃掉屏幕來顯示圖像。但問題是我不知道從哪裏開始。刮屏在android中顯示圖像

我已經在與stackoverflow的問題相關,但這沒有幫助。 從我的搜索那裏,我發現這個項目的線索是使用Bitmap.getPixel(int x, int y)

所以,我認爲我必須從位圖中獲取像素並將其繪製到畫布上。 但我不知道如何實現它? 或任何人有更好的方法呢?

任何人都可以幫我嗎?有關這類事情或相關主題的任何教程?

在此先感謝!


這裏是我的示例代碼:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    tw = w; 
    th = h; 
    eraseableBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(eraseableBitmap); 
    Bitmap muteableBitmap = Bitmap.createBitmap(eraseableBitmap.getWidth(), eraseableBitmap.getHeight(), Bitmap.Config.ARGB_8888); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    static_x = event.getX(); 
    static_y = event.getY(); 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     touch_start(static_x, static_y); 

    } if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      touch_move(static_x, static_y); 

    } if (event.getAction() == MotionEvent.ACTION_UP) { 
      touch_up(); 
     } 
    return true; 
} 

這裏是我的項目的外觀:

layout

+0

你是什麼意思劃傷屏幕複製代碼和定製?像刮刮樂透票一樣? – FoamyGuy

+0

@蒂姆雅,就這樣!你有沒有想法如何做出這樣的事情? – user1008497

回答

7

有趣的問題。我的理論計劃:

您有2個位圖,'可擦除'位圖和'隱藏'位圖。從現有的位圖擦除像素是不可能的,因爲Android中的位圖是immutable。因此,不是從「可擦除」位圖擦除像素以顯示下面的位圖,而是先畫出「可擦除」位圖。然後創建一個空的mutable Bitmap。循環「隱藏」位圖中的所有像素,僅顯示「可擦除」位圖已被「擦除」的位置。

Bitmap mutableBitmap = Bitmap.create(erasableBitmap.getWidth(),erasableBitmap.getHeight(), Bitmap.Config.ARGB_8888); 

for(Pixel erasedPixel : erasedList) 
{ 
    mutableBitmap.setPixel(x,y, hiddenBitmap.getPixel(erasedPixel.x, erasedPixel.y)); 
} 

... 
// in a different file 
class Pixel{ 
    int x, y; 

} 

您必須自己填寫erasedList。

一旦完成,畫到畫布上,像這樣:

canvas.drawBitmap(0,0,eraseableBitmap); 
canvas.drawBitmap(0,0,mutableBitmap); 

確保你先畫出「擦除」位圖,以便它繪製在新的像素。

如果您需要幫助瞭解如何設置擦除像素,請在評論中告訴我,我會幫您解決。

編輯

要真正弄清楚哪些像素用戶試圖刪除:在您看來,捕捉onTouch事件,你會得到的,其中用戶觸摸的屏幕上的座標。 將它保存到某種地圖或散列表中,你應該很好。 創建一個Pixel對象並將其添加到全局像素的List

EDIT 2

增加了「從零開始」的大小,你所要做的是一個有點複雜。你需要一些方法來創建一個圍繞x,y點觸摸的區域,也可以算作擦除。圓圈是理想的,但使用方形會更容易。

for(Pixel erasedPixel: erasedList) 
{ 
    //it's actually more complicated than this, since you need to check for boundary conditions. 
    for(int i = -SQUARE_WIDTH/2; i < SQUARE_WIDTH/2; i++){ 
    for(int j = -SQUARE_WIDTH/2; j < SQUARE_WIDTH/2; j++){ 
     mutableBitmap.setPixel(erasedPixel.x+i, erasedPixel.y+j, hiddenBitmap.getPixel(erasedPixel.x+i, erasedPixel.y+j)); 
    } 
    } 
} 
+0

我認爲你的想法是實現這一目標的最佳方式。就像你上面所說的那樣,我需要幫助來弄明白。對不起,如果我問了很多,我開始android程序員。 – user1008497

+0

添加更多信息 – you786

+0

我可以再問你一次嗎?我已經完成了你上面所說的,當我抓取erasableBitmap時,mutableBitmap被顯示出來,但它需要一天的時間來抓取所有圖像,因爲它只能顯示每個像素。你有一個想法如何顯示它每個圓/平方不是每個像素?謝謝你,對不起我的英文不好。 – user1008497

-1

您可以使用三星S-Pen SDk爲其免費劃傷形象,但它從2.3操作系統版本的作品

1

我認爲最簡單的解決辦法是彼此(與容易實現的上面兩層RelativeLayout)。底層將包含任何需要顯示的內容。頂層是一個填充了不透明顏色的畫布。當您檢測到觸摸事件時,將開始追蹤手指,並在完全透明的顏色上替換舊顏色。你可以在how to paint with the finger here上找到教程

+0

如果我使用頂層的位圖怎麼辦?如何顯示每個劃痕的底層? – user1008497

+0

您仍然必須在畫布上繪製位圖,並在您去時使像素完全透明。我不會嘗試直接使用Bitmap對象 – Bostone