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_x
và offset_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;
}
});
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
Có phải là hình ảnh của bạn được xoay quanh vị trí cảm ứng – Vivekanand
@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ó? –