タッチで移動し、ダブルタップまたは長押しでキーボードが開く編集テキストを作成しました。それは非常にうまく機能していますが、私は2つの問題に直面しています:
EditText は、テキストの最後またはテキストの先頭から編集可能です。カーソルの位置が選べません。
編集テキストは、中央ではなく左隅からドラッグ アンド ドロップされます。
タッチリスナーのコードは次のとおりです。
@Override
public boolean onTouchEvent(MotionEvent event)
{
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) v.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setEnabled(true);
setCursorVisible(true);
break;
case MotionEvent.ACTION_UP:
Log.d("up", "ACTION_UP");
params.height = LayoutParams.WRAP_CONTENT;
params.width = LayoutParams.WRAP_CONTENT;
params.topMargin = (int)(event.getRawY() - (v.getHeight()/2));
params.leftMargin = (int)(event.getRawX() - (v.getWidth()/2));
txt_metaData.Xmargin= params.topMargin;
txt_metaData.YMargin= params.leftMargin;
break;
case MotionEvent.ACTION_MOVE:
Log.d("moving", "ACTION_MOVE");
params.topMargin = (int)(event.getRawY() - (v.getHeight()/2));
params.leftMargin = (int)(event.getRawX() - (v.getWidth()/2));
v.setLayoutParams(params);
break;
}
return gestureScanner.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e)
{
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
return true;
}
@Override
public void onLongPress(MotionEvent e)
{
Log.i("double tap called", "yes");
((InputMethodManager)_mContext.getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
setEnabled(true);
requestFocus();
requestFocusFromTouch();
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
return true;
}
@Override
public void onShowPress(MotionEvent e)
{
}
@Override
public boolean onSingleTapUp(MotionEvent e)
{
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e)
{
Log.i("double tap called", "No");
((InputMethodManager)_mContext.getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
setEnabled(true);
requestFocus();
requestFocusFromTouch();
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e)
{
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e)
{
bringToFront();
return true;
}
}