Кнопка камеры, как SnapChat

#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