У меня есть EditText, который установлен прокрутки по вертикали. Но это не правильно прокручивает. Когда я пытаюсь прокрутить вверх до editText, однако курсор также перемещается вверх и замедляет прокрутку, EditText не прокручивается правильно. Ниже мой код
activity_compiler. xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<View
android:layout_width="48dp"
android:layout_height="match_parent"
android:background="@color/gray_light"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.example.diplomawork.utils.CodeHighlighterEditText
android:id="@+id/codeHighlighterEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:background="@null"
android:fontFamily="@font/muli"
android:gravity="top|start"
android:inputType="textMultiLine"
android:lines="300"
android:scrollbars="vertical"
android:text="2"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Класс активности компилятора
class CompilerActivity : MvpAppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_compiler)
}
}
CodeHighlighterEditText class
class CodeHighlighterEditText (context: Context, val attrs: AttributeSet) :
AppCompatEditText(context,attrs) {
var rect = Rect()
private val paint = Paint()
val scale = resources.displayMetrics.density
init {
paint.style = Paint.Style.STROKE
paint.color = Color.BLACK
paint.typeface = Typeface.createFromAsset(context.assets, "muli.ttf")
val spSize = 18
val scaledSizeInPixels =
spSize * resources.displayMetrics.scaledDensity
paint.textSize = scaledSizeInPixels
}
override fun onDraw(canvas: Canvas?) {
var baseline = baseline
for (i in 0 until lineCount) {
incrementPadding(i + 1)
canvas?.drawText("${i + 1}", rect.left.toFloat(), baseline.toFloat(), paint)
baseline += lineHeight
}
super.onDraw(canvas)
}
private fun incrementPadding(i: Int) {
when {
i < 10 -> setPadding(16)
i < 100 -> setPadding(32)
i < 1000 -> setPadding(48) //Max line = 999
}
}
private fun setPadding(padding: Int) {
val dpAsPixels = (padding * scale + 0.5f)
setPadding(dpAsPixels.toInt(), 0, 0, 0)
}
}