editext如何让光标随手指移动改变位置

如题,点击edittext后,光标只能显示在文本的最后面,如何让光标显示在没有文本的地方,点哪光标显示在哪,没有文本也可以显示

要让光标随着手指移动改变位置,你需要在触摸事件中获取手指的触摸位置,并将光标移动到相应的位置。下面是一个示例代码,可以实现这个功能:

public class MainActivity extends AppCompatActivity {
    private EditText mEditText;
    private Layout mLayout;
    private int mOffset = 0;
    private int mLineHeight = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEditText = findViewById(R.id.editText);

        mEditText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getActionMasked()) {
                    case MotionEvent.ACTION_DOWN:
                        // 获取当前触摸位置的偏移量和行高
                        mLayout = mEditText.getLayout();
                        mOffset = mLayout.getOffsetForHorizontal(
                                mLayout.getLineForVertical(motionEvent.getY()),
                                motionEvent.getX());
                        mLineHeight = mEditText.getLineHeight();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        // 计算光标的新位置
                        mOffset = mLayout.getOffsetForHorizontal(
                                mLayout.getLineForVertical(motionEvent.getY()),
                                motionEvent.getX());

                        // 将光标移动到新位置
                        Selection.setSelection(mEditText.getText(), mOffset);

                        // 滚动EditText以便始终显示光标
                        int scrollY = mEditText.getScrollY();
                        int scrollX = mLayout.getLineStart(mLayout.getLineForOffset(mOffset));
                        mEditText.scrollTo(scrollX, scrollY);
                        break;
                }
                return true;
            }
        });
    }
}

在代码中,我们在onCreate()方法中给EditText控件设置了触摸事件,并在触摸事件中计算光标应该处于哪一个位置。当用户在EditText中移动手指时,我们根据移动的位置计算出光标新的位置,并将光标移动到新的位置,同时滚动EditText以确保光标始终可见。

需要注意的是,在计算光标的位置时,我们首先需要获取当前触摸位置所在的行数和该行的水平偏移量,然后使用getOffsetForHorizontal()方法计算出光标相对于整个文本的位置。

另外,我们还需要使用setSelection()方法将光标移动到新的位置,使用getScrollY()方法和scrollTo()方法滚动EditText控件以便光标始终可见。

以上代码仅为示例代码,你可以根据自己的需要进行适当调整。

在Android中,当点击EditText控件后,光标默认会显示在文本的最后面。如果需要让光标显示在没有文本的地方,可以通过设置EditText的gravity属性为left|center_vertical来实现。

以下是一个示例代码,演示如何将光标显示在EditText的左侧,点哪光标就显示在哪:

<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left|center_vertical"
    android:hint="请输入文本" />

在这个示例代码中,gravity属性的值设置为left|center_vertical,这意味着文本将左对齐,垂直居中。这样设置后,即使没有文本,光标也会显示在EditText的左侧,当你点击EditText时,光标就会在点击的位置上显示。

如果需要让光标始终显示在EditText的左侧,可以将EditText的textAlignment属性设置为viewStart:


<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left|center_vertical"
    android:textAlignment="viewStart"
    android:hint="请输入文本" />


在这个示例代码中,textAlignment属性的值设置为viewStart,这意味着文本将始终从左侧开始对齐,即使文本为空,光标也会显示在EditText的左侧。

通过以上设置,你可以实现让光标显示在没有文本的地方,点哪光标显示在哪的效果。