2011-12-05 6 views
9

Tôi đang cố gắng kéo và thả một hình chữ thập lên một MapView. Tôi có một nút ImageView trên màn hình. Khi tôi chạm vào nó, nút biến mất và xuất hiện ImageView mới. ImageView mới có nghĩa vụ phải đặt ở giữa ngón tay của tôi cho đến khi tôi nhả nó ở đâu đó, nhưng vì lý do nào đó bù đắp không chính xác. Hình chữ thập xuất hiện phía dưới bên phải của nơi tôi đang chạm vào.Android 2.2 Nhấp và kéo hình ảnh được canh giữa dưới

Hình ảnh di chuyển tương ứng vì vậy tôi tin rằng vấn đề là với offset_xoffset_y mà tôi xác định trong phần ACTION_DOWN. Sau đó, trong ACTION_UP tôi cần phải createMarker(x,y) trên tọa độ chính xác dưới ngón tay của tôi, nhưng điều đó cũng được bù đắp không chính xác.

Tôi đã thử nhiều cách khác nhau để làm cho nó tập trung, và một số là tốt hơn so với những người khác. Tôi đã cho đến nay đã không thể làm cho nó hoạt động mà không cần sử dụng số ma thuật.

Vì vậy, tôi đang sử dụng vị trí nhấp và trừ đi một nửa kích thước hình ảnh. Điều này có ý nghĩa với tôi. Nó gần đúng hơn nếu tôi trừ toàn bộ kích thước hình ảnh. Tôi đã thử các ví dụ khác nhau từ web, tất cả đều bị thiếu chính xác với vị trí View.

Bạn có thể cho tôi một số lời khuyên không?

crosshair = (ImageView)findViewById(R.id.crosshair); 
frameLayout = (FrameLayout)findViewById(R.id.mapframe); 
params = new LayoutParams(LayoutParams.WRAP_CONTENT, 
     LayoutParams.WRAP_CONTENT); 
crosshairImage = BitmapFactory.decodeResource(getResources(), R.drawable.crosshair); 
crosshair.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      dragStatus = START_DRAGGING; 

      // hide the button and grab a mobile crosshair 
      v.setVisibility(View.INVISIBLE); 
      image = new ImageView(getBaseContext()); 
      image.setImageBitmap(crosshairImage); 

      // set the image offsets to center the crosshair under my touch 
      offset_x = (int)event.getRawX() - (int)(crosshairImage.getWidth()/2) ; 
      offset_y = (int)event.getRawY() - (int)(crosshairImage.getHeight()/2) ; 

      // set the image location on the screen using padding 
      image.setPadding(offset_x, offset_y, 0, 0); 

      // add it to the screen so it shows up 
      frameLayout.addView(image, params); 
      frameLayout.invalidate(); 

      if(LOG_V) Log.v(TAG, "Pressed Crosshair"); 
      return true; 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      if(dragStatus == START_DRAGGING) { 
       dragStatus = STOP_DRAGGING; 

       // place a marker on this spot 
       makeMarker((int)event.getX() + offset_x, (int)event.getY() + offset_y); 

       // make the button visible again 
       v.setVisibility(View.VISIBLE); 

       // remove the mobile crosshair 
       frameLayout.removeView(image); 

       if(LOG_V) Log.v(TAG, "Dropped Crosshair"); 
       return true; 
      } 
     } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      if (dragStatus == START_DRAGGING) { 
       // compute how far it has moved from 'start' offset 
       int x = (int)event.getX() + offset_x; 
       int y = (int)event.getY() + offset_y; 

       // check that it's in bounds 
       int w = getWindowManager().getDefaultDisplay().getWidth(); 
       int h = getWindowManager().getDefaultDisplay().getHeight(); 
       if(x > w) 
        x = w; 
       if(y > h) 
        y = h; 

       // set the padding to change the image loc 
       image.setPadding(x, y, 0 , 0); 

       // draw it 
       image.invalidate(); 
       frameLayout.requestLayout(); 

       if(LOG_V) Log.v(TAG, "(" + offset_x + ", " + offset_y + ")"); 

       return true; 
      } 
     }    
     return false; 
    } 

}); 
+0

Tôi vẫn đang tìm kiếm một giải pháp này, đối với một số lý do tôi không thể tìm thấy một cách để giữ crosshair trung dưới ngón tay của tôi. Tôi biết AbsoluteLayout không còn được dùng nữa nhưng tôi sẽ bắt đầu khám phá tuyến đường đó. Tôi sẽ đăng nếu tôi tìm thấy bất cứ điều gì. – Lea

+0

Có phải là hình ảnh của bạn được xoay quanh vị trí cảm ứng – Vivekanand

+1

@Darunda Bạn đã tìm thấy giải pháp chưa. Tôi cần một số trợ giúp xin vui lòng về nó? –

Trả lời

0

Bạn đã viết mã này trong vòng touch_Down.

offset_x = (int)event.getRawX() - (int)(crosshairImage.getWidth()/2) ; 
offset_y = (int)event.getRawY() - (int)(crosshairImage.getHeight()/2) ; 

// set the image location on the screen using padding 
image.setPadding(offset_x, offset_y, 0, 0); 

Hãy thử viết nó bên ngoài các điều kiện nếu để đảm bảo rằng nó được áp dụng cho tất cả các sự kiện chạm.

0

Bạn có thể sử dụng api mới có sẵn trong kéo và thả

public boolean onTouch(View view, MotionEvent motionEvent) { 
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
view.startDrag(null, shadowBuilder, view, 0); 
view.setVisibility(View.INVISIBLE); 
return true; 
} else { 
return false; 
} 
}