#android #android-studio #kotlin
Вопрос:
Я новичок в котлине, поэтому понятия не имею, как это реализовать. Я хочу реализовать кнопку, подобную snapchat, где один щелчок делает снимок, а удержание делает анимацию кнопки, и анимация кнопки должна быть сброшена после окончания анимации или после того, как пользователь отпустит палец, но в моем коде работает только один из Ontouch.
мой код для одного нажатия
val gestureDetectorCompat = GestureDetectorCompat(applicationContext, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent?): Boolean {
Log.d("va","button lame")
Log.d("va","button up")
button.frame=0
button.cancelAnimation()
return super.onSingleTapUp(e)
}
})
button.setOnTouchListener { _, event -> gestureDetectorCompat.onTouchEvent(event) }
button.isClickable=true
Мой код для удержания
button.setOnTouchListener { _, event ->
if (event.action==MotionEvent.ACTION_DOWN) {
Log.d("actiondd","btn press?")
//here i want animation to start and end after 5 secs if user still holds the button
button.playAnimation()
val handler = Handler(Looper.getMainLooper())
handler.postDelayed(
{
button.frame = 0
button.cancelAnimation()
}, 5000)
} else if (event.action == MotionEvent.ACTION_UP) {
//Here i need animation to stop right after user removes finger
button.frame = 0
button.cancelAnimation()
Log.i("heyyy", "anim stoppedd")
}
false
}
Комментарии:
1. Вы указываете, что работает только одна вещь. Что из этого работает?
2. @D. Купра, Когда я нажимаю кнопку один раз, вся анимация начинает воспроизводиться, и onsingletap не работает.
3. Да, я согласен, что это странно. По крайней мере, тачлистенер реагирует правильно, так что вы выполнили самую сложную часть. Что было не так с установкой простого onClick? Использовал ли setOnClickListener событие и не передал его вашему тачлистеру? Так вот почему ты им не пользуешься?
4. @D. Купра Нет, но при нажатии также прослушивается Ontouch, поэтому, когда я хочу, чтобы работал только Ontouch, т. е. в конце прослушивателя Ontouch в ACTION_UP, срабатывает как Onclick, так и Ontouch.
5. @D. Купра Также я думаю, что проблема заключается в том, что я использую два прослушивателя Ontouch для одной и той же кнопки. Я так думаю, может быть…ИДК
Ответ №1:
Я нашел ответ на свой вопрос, я полностью изменил код по сравнению с предыдущим.Я использовал таймеры Kotlin и Ontouchlistener для достижения этой цели[кнопка камеры SnapChat с анимацией].Я также реализовал захват камеры и запись видео с помощью CameraX с помощью той же кнопки.
//camera_capture_button is a lottie animation view
camera_capture_button.setOnTouchListener{ v, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
Log.d("button","down")
timer = object: CountDownTimer(5000, 500) {
override fun onTick(millisUntilFinished: Long) {
Log.d("timerr", fire.toString())
fire = 1
if(fire == 2){
if (isrecording==false) {
Log.d("timerr", "start recording")
takeVideo()
camera_capture_button.playAnimation()
vfx1.visibility = View.VISIBLE
}
}
}
override fun onFinish() {
Log.d("timerr","Timeup")
if (isrecording==true) {
stopRecording()
camera_capture_button.frame = 0
camera_capture_button.cancelAnimation()
vfx1.visibility = View.GONE
}
}
}
(timer as CountDownTimer).start()
vfx1.addAnimatorListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
// stopRecording()
// camera_capture_button.frame = 0
// camera_capture_button.cancelAnimation()
// vfx1.visibility=View.GONE
}
override fun onAnimationCancel(animation: Animator?) {
TODO("Not yet implemented")
}
override fun onAnimationRepeat(animation: Animator?) {
TODO("Not yet implemented")
}
})
}
if (event.action == MotionEvent.ACTION_UP) {
Log.d("timerr","up")
timer?.cancel()
// stopRecording()
if (fire<=2){
Log.d("timerr","tap")
takePic()
}
if (fire>2){
Log.d("timerr","stop recording")
stopRecording()
}
fire = 0
camera_capture_button.frame = 0
camera_capture_button.cancelAnimation()
vfx1.visibility=View.GONE
}
true
}
camera_capture_button.isClickable=true