2017-02-18 183 views
8

我正在試圖對activity頂部的圖像進行一些簡單的圖片處理,該圖片位於ImageView之間,平均高度爲200dp,並與其父寬度相匹配。Android - 拖拽和剪裁問題

我實現了自定義onTouchListener類,它創建了一個matrixImageView

內轉換圖像:

case MotionEvent.ACTION_MOVE: 
    if (mode == DRAG) { 
     matrix.set(savedMatrix); 
     matrix.postTranslate(v.getX(), event.getY() - start.y); 
    } 
    break; 

這完美的作品,它拖累了y中的圖像僅限於。但是,當用戶發佈時,我希望將圖像裁剪到可見的ImageView區域的邊界。

作物

case MotionEvent.ACTION_UP: 
    if (mode == DRAG) { 
     Bitmap bitmap = drawableToBitmap(view.getDrawable()); 
     Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight()); 
     view.setImageBitmap(result); 
     } 
     break; 

這裁剪圖像大小合適,但只能從ImageView的不可見邊界的背景的頂部。隨着呼叫Bitmap職能功能createBitmap(int x, int y, int width, int height)我唯一的假設是view.getTop()正在使它從頂部開始。

所以,我的問題是:我如何計算可見視圖邊界的頂部與背景/矩陣邊界之間的差異?

The dark blue area is the ImageView

注:圖像顯示的圖像(藍色),其位於一個活動的頂部(青色尋找區域都只是ImageView的背景不可見邊界,不活動)

我想強調一點,我不希望使用任何第三方庫來實現此目的。

我更願意提供額外的代碼,如果需要的話。

更新:

onTouch方法:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    ImageView view = (ImageView) v; 
    // Dump touch event to log 
    dumpEvent(event); 

    // Handle touch events here... 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(v.getX(), event.getY()); 
      mode = DRAG; 
      originalY.y = (int) event.getY(); 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mode == DRAG) { 
     Bitmap bitmap = drawableToBitmap(view.getDrawable()); 
     Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight()); 
     view.setImageBitmap(result); 
     } 
     break; 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
       matrix.set(savedMatrix); 
       matrix.postTranslate(v.getX(), event.getY() - start.y); 
      } 
      break; 
    } 
    view.setImageMatrix(matrix); 
    return true; // indicate event was handled 
} 
+0

在你的屏幕中,你在全屏背景中設置的任何位圖,或者你設置了任何高度,我知道你已經把200dp,但我認爲它應該在按鈕點擊時裁剪的圖像的可見區域,所以如果你提供我的屏幕信息與實際圖像,然後我會極力幫助你.. –

+0

imageview內的圖像將裁剪到屏幕的寬度,並保持高度根據它被裁剪(正常縮放裁剪),然後用戶可以拖動儘可能多的原始圖像高度提供的空間,它將是任何圖像(最小的適合屏幕寬度)。唯一固定在此的是imageview本身的高度,矩陣大小是動態的,這意味着矩陣頂部和imageview頂部之間的距離也是動態的 –

回答

0

來計算活動的根高度,我們可以使用

int height = this.getWindow().getDecorView().getHeight(); 

,也可以使用顯示量度作爲

DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
int width = metrics.widthPixels; 
int height = metrics.heightPixels; 

或者添加全局佈局監聽器

ViewTreeObserver vtObserver = view.getViewTreeObserver(); 
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    // check if the view's height and/or width > 0 
    // don't forget to remove the listener when done using removeOnGlobalLayoutListener 
} 

});

+0

請重新閱讀問題。我正在尋找可見ImageView區域(藍色)(以及該可見區域頂部邊界的值與背景/矩陣邊界頂部(青色)之間的邊界)。 ImageView下面的Activity中會有很多小部件,因此獲取活動的高度是多餘的。 –

0

該代碼缺少一些上下文,但我認爲當用戶開始拖動時,您會創建新的savedMatrixstart點,並在每次調用onTouchListener時更新它們,否則我不瞭解您的代碼是如何工作的。

如果是這樣,這意味着您實際上在savedMatrix需要翻譯,那麼爲什麼不從這裏得到它?我想你需要的是像

int top = savedMatrix.getValues()[Matrix.MTRANS_Y] 

我沒有檢查它,不知道Matrix不夠好內部結構,所以你可能需要反轉top的跡象。

旁註:現在還不清楚爲什麼你在matrix.postTranslate(v.getX(), event.getY() - start.y);那裏通過v.getX()那裏。可能它工作正常,因爲v.getX()在您的方案中始終爲0。