У меня есть LinearLayout с левым компонентом и правым компонентом. Между ними нет промежутка. Статически вид выглядит нормально. Однако, когда я перетаскиваю через View.OnTouchListener, из ниоткуда появляется узкий вертикальный зазор, что крайне раздражает. Кто-нибудь знает, как я могу это исправить?
class MainActivity : AppCompatActivity(), View.OnTouchListener {
private lateinit var knobView: LinearLayout
private lateinit var knobLeftView: View
private lateinit var knobRightView: View
private var currentX = 0F
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
knobLeftView = findViewById(R.id.knob_left)
knobRightView = findViewById(R.id.knob_right)
knobView = findViewById(R.id.knob)
knobView.setOnTouchListener(this)
}
override fun onTouch(view: View, event: MotionEvent): Boolean {
val destX = event.rawX
when (event.action) {
MotionEvent.ACTION_DOWN -> {
currentX = destX
}
MotionEvent.ACTION_MOVE -> {
val deltaX = destX - currentX
knobView.animate()
.xBy(deltaX)
.duration = 0
currentX = destX
}
}
return true
}
}
<?xml version = "1.0" encoding = "utf-8"?>
<FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:clipChildren = "false">
<LinearLayout
android:id = "@+id/knob"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:orientation = "horizontal">
<View
android:id = "@+id/knob_left"
android:layout_width = "@dimen/knob_radius"
android:layout_height = "@dimen/knob_size"
android:background = "@drawable/background_left" />
<View
android:id = "@+id/knob_right"
android:layout_width = "@dimen/knob_radius"
android:layout_height = "@dimen/knob_size"
android:background = "@drawable/background_right" />
</LinearLayout>
</FrameLayout>
Мне нужно использовать 2 полукруга в реальном приложении. Кроме того, использование черного цвета не помогло.
Я думаю, что это, вероятно, может быть проблемой рендеринга. Но это можно решить, изменив начальное поле вместо позиции x:
override fun onTouch(view: View, event: MotionEvent): Boolean {
val destX = event.rawX
when (event.action) {
MotionEvent.ACTION_DOWN -> {
currentX = destX
}
MotionEvent.ACTION_MOVE -> {
val deltaX = destX - currentX
// knobView.animate()
// .xBy(deltaX)
// .duration = 0
val params = knobView.layoutParams as FrameLayout.LayoutParams
params.leftMargin = (params.leftMargin + deltaX).toInt()
knobView.layoutParams = params
currentX = destX
}
}
return true
}
Поскольку продолжительность анимации установлена на 0, это не сильно повлияет на отсутствие использования анимации.

Ух ты, потрясающе! Большое спасибо! Мне бы и в миллион лет не пришло в голову это сделать!
Похоже на проблему с фоном. Попробуйте назначить ему значок или темный цвет, например черный.