2016-08-17 82 views
0

其通常簡單的數學,但我找不到合適的解決方案。首先,我有一個觸摸監聽器,拖放在我的情況下稱爲貼紙的imageview。然後,當用戶在貼紙上至少1秒鐘握住他的手指時,拖動方式開始並且用戶可以拖動圖像視圖。將Imageview拖動到正確的位置

不幸的是,我現在使用貼紙的中間位置,但我想要真正的觸摸位置的imageview。

這就是我使用TouchEvent

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    if (v instanceof Sticker) { 
     Log.i(TAG, "onTouch()"); 
     Sticker sticker = (Sticker) v; 
     Log.i("Sticker"," Found "+sticker.isFound()); 
     Log.i("Sticker"," Found "+sticker.moving); 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Log.i("Sticker", " Found moving"); 
       handler.postDelayed(mLongPressed, LONGPRESS_TIME); 
       //Take time for the short click 
       tslong = System.currentTimeMillis()/1000; 

       if(sticker.isFound()) { 
        //Get X,Y for the threshold 
        mDownX = event.getX(); 
        mDownY = event.getY(); 
       } 
       break; 
      case MotionEvent.ACTION_MOVE: 
       Log.i("Sticker"," Found moving"); 
       if(sticker.isFound()) { 
        if (sticker.moving) { 
         if (Math.abs(mDownX - event.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - event.getY()) > SCROLL_THRESHOLD) 
          handler.removeCallbacks(mLongPressed); 

         sticker.coodinates.x = event.getRawX() - sticker.getWidth()/2; 
         sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2/3; 

         if (sticker.coodinates.x > (layoutSizeWidth * 0.99) - sticker.getWidth()) { 
          sticker.coodinates.x = (float) ((layoutSizeWidth * 0.99)- sticker.getWidth()); 
         } else if (sticker.coodinates.x < 0) { 
          sticker.coodinates.x = 1; 
         } 

         if (sticker.coodinates.y > layoutSizeHeight - (sticker.getHeight() * 2/2)) { 
          sticker.coodinates.y = layoutSizeHeight - (sticker.getHeight() * 2/2); 
         } else if (sticker.coodinates.y < 0) { 
          sticker.coodinates.y = 1; 
         } 
         sticker.setX(sticker.coodinates.x); 
         sticker.setY(sticker.coodinates.y); 
        } 
       } 
       break; 

      case MotionEvent.ACTION_UP: 
       if((System.currentTimeMillis()/1000) - tslong < INVOKE_POPUP_TIME) 
        handleSimpleClick(v, event); 

       if(sticker.isFound()) { 
        if (sticker.moving) { 
         sticker.setX(sticker.coodinates.x); 
         sticker.setY(sticker.coodinates.y); 
         mDownX = event.getX(); 
         mDownY = event.getY(); 
         sticker.moving = false; 
        } 
        handler.removeCallbacks(mLongPressed); 
       } 
       break; 
     } 
     return true; 
    } 
    return false; 
} 

的把手,這裏我設置的貼紙,當用戶觸摸貼紙1秒的位置。

sticker.coodinates.x = event.getRawX() - sticker.getWidth()/2; 
sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2/3; 

enter image description here

這裏是爲了更好地理解一個GIF: enter link description here

當你仔細觀察,你看到一個跳轉到TOUCHINPUT。但是貼紙應該是可以拖動的。很難用英語說:我甚至不能用母語解釋它。

+0

你想達到什麼真正結束? – pskink

+0

貼紙(Imageview)位於正確的位置。當你看到頂部的圖片。在左側,您會看到我的程序將imageview始終轉換到手指中間。而在正確的圖片中,貼紙的位置與觸摸位置相同。 – DrMed

回答

0

對不起。最後,我發現了錯誤。首先,我必須保存X和Y座標之間的差距。之後,在Motion事件切換到Action_Move之前,我將觸摸事件的當前輸出減去我的計算。

的情況下ACTION_DOWN的這裏代碼:

getLocationInWindow(startingPointOfImage); 
gapX = (int)(event.getRawX()-startingPointOfImage[0]); 
gapY = (int)(event.getRawY()-startingPointOfImage[1]); 

,現在我得到了事件的輸入,並採取減將它們與我的差距計算。

sticker.coodinates.x = event.getRawX()-gapX; 
sticker.coodinates.y = event.getRawY()-gapY; 

,並與當前的X和Y值設置爲ImageView的

sticker.setX(sticker.coodinates.x); 
sticker.setY(sticker.coodinates.y); 
相關問題