У меня 3 изображения, которые начинаются с переводаX 300dp, 400dp и 500dp. Таким образом, только один вид отображается, когда начинается действие, а остальные 2 - вне экрана (правый край). Они работают в обработчике, что каждые 50 мс перемещают их на 30dp влево. Что мне нужно сделать, так это обнаружить, когда какое-либо изображение достигло левого края экрана минус 100dp, поэтому 100dp за пределами экрана, затем снова установите их на правый край, plus 100dp.Android: обнаружение левого края экрана минус 100dp
Я работаю в течение нескольких часов, и я не могу найти способ рассказать код, где находится край экрана. Я нашел похожие вопросы, но все они, похоже, уже имеют край экрана, хранящийся в переменной, и пытаются что-то сделать с ним (не показывая, как они получили эту переменную).
Это то, что я использую, который работает в течение некоторого времени, но после того, как несколько проходит ки бластов исчезают (вдруг только 2 будет показывать, затем 1, и, наконец, нет) ...
public void kiBlastHandler() {
kiHandler = new Handler();
kiHandler.postDelayed(kiRunnable, 50);
}
private Runnable kiRunnable = new Runnable() {
@Override
public void run() {
if (gameRunning) {
// Ki Blasts
ImageView kiBlast1 = (ImageView) findViewById(R.id.kiBlast1);
ImageView kiBlast2 = (ImageView) findViewById(R.id.kiBlast2);
ImageView kiBlast3 = (ImageView) findViewById(R.id.kiBlast3);
// Ki blast movement
kiBlast1.setX(kiBlast1.getX() - currentSpeed);
kiBlast2.setX(kiBlast2.getX() - currentSpeed);
kiBlast3.setX(kiBlast3.getX() - currentSpeed);
// Images for lives
ImageView imgLives = (ImageView) findViewById(R.id.imgLives);
if (currentLives == 3) {
imgLives.setImageResource(R.drawable.lives_03);
} else if (currentLives == 2) {
imgLives.setImageResource(R.drawable.lives_02);
} else if (currentLives == 1) {
imgLives.setImageResource(R.drawable.lives_01);
}
// Ready the vibration for losing life
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Handle losing lives
if (kiBlast1.getTranslationX() == -1100) {
currentLives = (currentLives - 1);
v.vibrate(vibrateLives);
kiBlast1.setTranslationX(600);
}
if (kiBlast2.getTranslationX() == -1100) {
currentLives = (currentLives - 1);
v.vibrate(vibrateLives);
kiBlast2.setTranslationX(600);
}
if (kiBlast3.getTranslationX() == -1100) {
currentLives = (currentLives - 1);
v.vibrate(vibrateLives);
kiBlast3.setTranslationX(600);
}
}
// No lives left
if (currentLives == 0) {
if (gameRunning) {
gameRunning = false;
gameOver();
}
}
kiHandler.postDelayed(kiRunnable, 50);
}
};
Может ли кто-нибудь помочь? Я бы очень признателен!
Firs вам нужно преобразовать 100dp в пиксель, а затем использовать его в вашем прогоне if (imageView.left <= -100) {переместить изображения вправо}! –
Привет @MuhammadBabar, спасибо, что показал мне метод getLeft(). Но это, кажется, возвращает 0. Я попытался использовать ... if (kiBlast1.getTranslationX() <= (viewMain.getLeft() - 100)) {// move right}. ViewMain - это мое представление RelativeLayout верхнего уровня, которое является полноэкранным. viewMain.getLeft() возвращает 0. Я хотел сказать «Если X-позиция 100 слева от отметки 0, а затем переместите вправо». Но код превращается в «viewMain.left() == 0, поэтому переместите kiBlast 100 слева от того места, где он уже есть». Знаете ли вы, что я сделал неправильно? Еще раз спасибо! –
проверьте это http://stackoverflow.com/questions/12052570/getright-getleft-gettop-returning-zero, для чего getLeft возвращает 0. –