Я пытаюсь создать простое приложение для всплывающих пузырей, пузыри плавают снизу экрана вверх. Я хотел бы, чтобы пользователи могли нажимать на эти пузыри, и они издавали звук. Я уже включил звук в свое приложение и установил 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();
}
}




Вы не должны использовать 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();
}
});