Как установить onClickListener для анимированного представления?

Я пытаюсь создать простое приложение для всплывающих пузырей, пузыри плавают снизу экрана вверх. Я хотел бы, чтобы пользователи могли нажимать на эти пузыри, и они издавали звук. Я уже включил звук в свое приложение и установил onClickListeners(), но когда я нажимаю на пузырьковые изображения, он не издает звука. Я понимаю, что это связано с корректировкой положения изображения при вызове метода анимации.

Я нашел несколько ответов в Интернете, но большинство из них слишком сложны для меня, поскольку я новичок в этом.

public class MainActivity extends AppCompatActivity {

    private ImageView bubble, bubble1, bubble2, bubble3, bubble4, bubble5, bubble6, bubble7, bubble8;

    //Created an array that stores the images
    private ImageView[] IMGS= new ImageView[9];
    private SoundPlayer sound;


    private int deviceHeight;

    private Animation mAnimation;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sound = new SoundPlayer(this);


        //linked up views
        bubble = findViewById(R.id.bubble);
        bubble1 = findViewById(R.id.bubble1);
        bubble2 = findViewById(R.id.bubble2);
        bubble3 = findViewById(R.id.bubble3);
        bubble4 = findViewById(R.id.bubble4);
        bubble5 = findViewById(R.id.bubble5);
        bubble6 = findViewById(R.id.bubble6);
        bubble7 = findViewById(R.id.bubble7);
        bubble8 = findViewById(R.id.bubble8);

        //assigned the array to the imageviews
        IMGS[0] = bubble;
        IMGS[1] = bubble1;
        IMGS[2] = bubble2;
        IMGS[3] = bubble3;
        IMGS[4] = bubble4;
        IMGS[5] = bubble5;
        IMGS[6] = bubble6;
        IMGS[7] = bubble7;
        IMGS[8] = bubble8;

        getDeviceHeight();
        animateBubble();
    }





    public void animateBubble(){
        //looped thru the array of Imageviews and animated the images stored in it.

        for (ImageView img : IMGS) {
            mAnimation = new TranslateAnimation(0, 0, 0, -deviceHeight);
            mAnimation.setDuration(4000);
            mAnimation.setFillAfter(true);
            bubble.setAnimation(mAnimation);
            bubble.setVisibility(View.VISIBLE);
            img.setAnimation(mAnimation);
            img.setVisibility(View.VISIBLE);

            mAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    sound.playPopSound();


                }

                @Override
                public void onAnimationEnd(Animation animation) {



                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
            }


    }


    public void getDeviceHeight(){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        deviceHeight = displayMetrics.heightPixels;
    }


    public void playSound(View view) {
        sound.playPopSound();
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не должны использовать TranslateAnimation, это старый способ анимации представлений (который, вероятно, должен быть устаревшим). Этот тип анимации на самом деле не перемещает вид, а только рисует вид, поэтому клики на текущей видимой позиции ваших пузырьков не будут работать.

Вместо этого вы можете использовать API анимации, представленный в API 14. Подробнее здесь: https://developer.android.com/guide/topics/graphics/prop-анимацияhttps://developer.android.com/training/animation/reposition-view

Упрощенная версия вашей анимации может быть написана так:

img.animate().translationY(-deviceHeight).setDuration(4000).start()

Как сказано в предыдущем ответе, вы используете аниматор значений, который анимирует только значение координат изображения. Вы должны использовать ObjectAnimation, где все его свойства перемещаются вместе с представлением. В вашем случае для воспроизведения поп-звука при запуске вы можете использовать

img.animate().translationY(-deviceHeight).setDuration(4000).withStartAction(new Runnable() {
                @Override
                public void run() {
                    sound.playPopSound();
                }
            });

Другие вопросы по теме