Created
April 20, 2019 02:44
-
-
Save jackz314/d174b46cc8e5fe52db68ae364491c0b9 to your computer and use it in GitHub Desktop.
Drag to select text with a mouse inside Android EditText like on computers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
EditText mText = .... | |
final int[] beginOffset = {-1}; | |
View.OnTouchListener otl = new View.OnTouchListener() { | |
@Override | |
public boolean onTouch(View v, MotionEvent event) { | |
if(event.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE){//only change behavior for mouse | |
int i = event.getAction(); | |
if (i == MotionEvent.ACTION_DOWN) { | |
Layout layout = ((EditText) v).getLayout(); | |
float x = event.getX() + mText.getScrollX(); | |
float y = event.getY() + mText.getScrollY(); | |
int line = layout.getLineForVertical((int) y); | |
int offset = layout.getOffsetForHorizontal(line, x); | |
if (offset > 0) { | |
if (x > layout.getLineMax(0)){ | |
beginOffset[0] = offset;//store beginning offset | |
mText.setSelection(offset); // touch was at end of text | |
} | |
else{ | |
beginOffset[0] = offset - 1;//store beginning offset | |
mText.setSelection(offset - 1); | |
} | |
} | |
} else if (i == MotionEvent.ACTION_UP) { | |
if (beginOffset[0] != -1) {//has previous down action | |
Layout layout = ((EditText) v).getLayout(); | |
float x = event.getX() + mText.getScrollX(); | |
float y = event.getY() + mText.getScrollY(); | |
int line = layout.getLineForVertical((int) y); | |
int offset = layout.getOffsetForHorizontal(line, x); | |
if (offset > 0){ | |
if (x > layout.getLineMax(0)) | |
mText.setSelection(Math.min(offset, beginOffset[0]), Math.max(offset, beginOffset[0])); // touch was at end of text | |
else | |
mText.setSelection(Math.min(offset - 1, beginOffset[0]), Math.max(offset - 1, beginOffset[0])); | |
} | |
beginOffset[0] = 0;//clear beginning offset | |
} | |
} else if (i == MotionEvent.ACTION_MOVE) { //selects as mouse moves | |
if (beginOffset[0] != -1) {//has previous down action | |
Layout layout = ((EditText) v).getLayout(); | |
float x = event.getX() + mText.getScrollX(); | |
float y = event.getY() + mText.getScrollY(); | |
int line = layout.getLineForVertical((int) y); | |
int offset = layout.getOffsetForHorizontal(line, x); | |
if (offset > 0){ | |
if (x > layout.getLineMax(0)) | |
mText.setSelection(Math.min(offset, beginOffset[0]), Math.max(offset, beginOffset[0])); // touch was at end of text | |
else | |
mText.setSelection(Math.min(offset - 1, beginOffset[0]), Math.max(offset - 1, beginOffset[0])); | |
} | |
} | |
} | |
return true; | |
} | |
return false;//default behavior otherwise | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment