2012-11-08 21 views
4

我有一個觀點,我想將其與移動手指。我想獲得的xDelta和yDelta,只是平移視圖的矩陣(不圖像視圖,任何視圖中,RelativeLayout的爲例)。 我想知道如何做到這一點:移動手指任何的RelativeLayout(不改變佈局PARAMS)

  1. 覆蓋RelativeLayout的onDraw並在其中應用轉換矩陣。那可能嗎?
  2. 我目前正在與各onTouch事件將動畫做。動畫持續時間爲0,x/y的開始/結束是相同的(setFillAfter = true)。它只是把視圖放在我想要的地方。但是這不是太貴嗎?

我不能操縱直接通過onDraw有任何視圖的矩陣?我試過這樣的事情:

@Override 
protected void onDraw(Canvas canvas) { 
    if (getDx() != 0 && getDy() != 0) { 
     m = canvas.getMatrix(); 
     m.postTranslate(dx, dy); 
     canvas.setMatrix(m); 
    } 
    super.onDraw(canvas); 
} 

但是看起來我做錯了。

+0

我寧願在一個位圖繪製查看一次,轉換位圖開始。我認爲這會更有效率。拖動真實視圖可能是INVISIBLE或GONE。 – pawelzieba

+0

所以你認爲沒有辦法直接操縱矩陣? – Danail

回答

2

我不想成爲一個告訴你,你的問題是,即使比你想象的要簡單,但這裏是什麼樣子:

@Override 
protected void onDraw(Canvas canvas) { 
    if (getDx() != 0 && getDy() != 0) { 
     canvas.translate(getDx(), getDy()); 
    } 
    super.onDraw(canvas); 
} 

希望這有助於!

6

如果你想實現拖拽手勢,那麼你可以onTouchListener,並在其MotionEvent.ACTION_MOVE集填充使用setPadding該視圖中使用。

下面是示例代碼:

case MotionEvent.ACTION_MOVE: 
    yourView.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0); 

樣品爲onTouchListener: -

OnTouchListener drag= new OnTouchListener() { 

     @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     switch(event.getAction() & MotionEvent.ACTION_MASK){ 
      case MotionEvent.ACTION_DOWN: 

      break; 
      case MotionEvent.ACTION_POINTER_DOWN: 

      break; 
      case MotionEvent.ACTION_MOVE: 
       img.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0); 
      break; 
      case MotionEvent.ACTION_UP: 
      break; 
      case MotionEvent.ACTION_POINTER_UP: 

      break; 
      }  return true; 
    } 
}; 

您需要在運行時創建拖動圖像,並有調整其位置。在這個示例代碼中,我沒有調整位置,因此拖動的圖像不會在觸摸位置創建。您還需要考慮要拖動的圖像的高度和寬度。

希望它有幫助!

+0

我不確定View如何使用填充移動?你有沒有試過這個 – Sameer

+0

是的。我用於實現API級別低於11的拖放n拖放功能。 –

+0

然後確定:)。 – Sameer

1

夫婦的事情,這將有助於在實現它:

  1. 請確保您的視圖中最初有您要使用的方向有足夠的空間。像 'match_parent' 等

  2. 使用GestureDetector。onSimpleGestureListener並覆蓋的onDraw(返回true;),onScroll - 使用的onTouchEvent連接它,你會直接得到距離,或者您可以通過使用事件1和事件2

  3. 商店自己計算變量(一個或多個)信息和呼叫無效()

  4. 在你的onDraw方法 - 通過canvas.translate使用該信息(..使用這些變量。); super.onDraw(帆布);

和你將取得結果

PS:繪圖通過採取左上方爲0,0