2012-09-05 86 views
10

我成功實現了在畫布上實現捏放大/縮小和拖放功能。在android中更改圖像形狀

現在,我要的是調整大小,即,基於iPhone應用程序像下面的鏈接圖片enter image description here

How to change shape of an image using iPhone SDK?

那麼,怎樣才能實現我在Android中那樣的功能?

+1

不知道爲什麼在發佈後的一分鐘內這是upvoted到+4。一位先生可以解釋什麼使得這個問題如此真棒?無論如何,你還嘗試過什麼? – 2012-09-05 09:53:45

+1

http://code.google.com/p/android-multitouch-controller/source/browse/demo/MTPhotoSortr/src/org/metalev/multitouch/photosortr/PhotoSorterView.java?r=3ef1fdcbebe4f016a03c4d956af4ecbf850a925a 使用此鏈接我已成功地在畫布中捏入/拖出圖像。 –

+0

@xitij我也在尋找這個有點probs .....如果我解決它...我一定會通知你..... –

回答

0

有兩種選擇,都涉及自定義視圖。首先是創建一個自定義視圖,填充您的「畫布」。您可以在視圖中跟蹤8個藍色和1個綠色圓圈,作爲Rect對象。重寫onTouchEvent(MotionEvent),然後檢查是否有任何移動事件在你的控件中,並相應地更新它們(我在這裏簡化了一些事情:))。從您的onTouchEvent中,您可以撥打invalidate()。然後,您可以根據自上次調用onDraw以來控件的變化來處理繪製控件和更新圖像的onDraw(Canvas)

另一種選擇是做類似的事情,但是隻能封裝圓和控件,這意味着移動視圖需要一個允許視圖更改其佈局參數的容器。這樣做,你的onTouchEvent方法需要觸發一個無效的佈局視圖,因爲它需要重新計算視圖的大小和位置。這肯定會比較困難,但取決於您試圖通過單個視圖實現工作的方式可能比在單個視圖中以代碼維護您的圈子表示方式更好。

1

基本上你需要的圖像,並重新繪製無效從一開始::在畫布上

img=(ImageView)findViewById(R.id.yourimageidfromxml); 

img.onTouchEvent(MotionEvent me) 
{ 
    int X=me.getX(); 
    int Y=me.getY(); 
    img.invalidate(); 
    img.repaint(X,Y); 

} 

void paint(int X,int Y) 
{ 
    img.setWidth(X); 
    img.setHeight(Y); 
} 

縮放圖像將使用變換在畫布上重繪從一開始就

0

圖像的大小調整可以通過使用scaleType爲「fitXY」的簡單ImageView來實現。

您必須自己添加藍色調整大小控制柄。

改變圖像(綠色手柄)的旋轉可以通過使用以下方式實現:

public static Bitmap rotate(Bitmap src, float degree) { 
    // create new matrix 
    Matrix matrix = new Matrix(); 
    // setup rotation degree 
    matrix.postRotate(degree); 

    // return new bitmap rotated using matrix 
    return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); 
} 

來源:http://xjaphx.wordpress.com/2011/06/22/image-processing-rotate-image-on-the-fly/

爲更多的Android圖像處理的例子見http://xjaphx.wordpress.com/learning/tutorials/

1

如果按重新調整大小您指的是「拉伸」垂直和水平面上的位圖,然後您只需修改形狀(例如橢圓形)被繪製到的矩形。

例如:

這是您的原始橢圓的形狀:

canvas.drawOval(new Rect(0,0,100,100), bluePaint); 

這是相同的橢圓形,只是拉伸(調整大小)在水平面上:

canvas.drawOval(new Rect(0,0,200,100), bluePaint); 

我希望這有幫助。