十字線をMapView
にドラッグアンドドロップしようとしています。画面にImageView
ボタンがあります。タッチするとボタンが消え、新しいImageView
が表示されます。新しいImageView
はどこかにリリースするまで私の指の真中に座っているはずですが、なんらかの理由でオフセットが間違っています。私が触っている場所の右下に十字線が表示されます。Android 2.2画像をクリックしてドラッグしてドラッグする
画像は比例して動くので、問題はACTION_DOWN
セクションで定義したoffset_x
とoffset_y
であると私は信じています。次に、ACTION_UP
で私の指の下の正しい座標にcreateMarker(x,y)
が必要ですが、それも正しくオフセットされています。
私はそれを中心にするためにさまざまな方法を試しましたが、いくつかは他のものより優れています。私は今までマジックナンバーを使わずに動作させることができませんでした。
これはそのままですが、クリック位置を使用して画像サイズの半分を差し引いています。これは私には意味がある。全体の画像サイズを引くと正解に近づきます。私はウェブからさまざまな例を試しましたが、そのすべてはView
の場所では不正確です。
アドバイスをいただけますか?
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;
}
});
ドロップすることができ、いくつかの理由のために私は私の指の下中央に十字線を維持する方法を見つけることができません。 私が知っているAbsoluteLayoutは推奨されていませんが、私はそのルートの探索を開始するつもりです。私が何かを見つけたら投稿します。 – Lea
あなたの画像はタッチ位置にピボットされていますか? – Vivekanand
@ダルンダ解決策は見つかりましたか?私はそれについて何か助けてください必要がありますか? –