Я попытаюсь объяснить проблему как можно подробнее, но поскольку это довольно конкретная проблема, это будет сложно. Но я в конце своих вариантов и действительно не знаю, как это исправить.Местоположения Android не верны на 2.X
Я создаю игру Android, в которой пользователи щелкают изображения в правильном порядке, чтобы перейти на следующий уровень. Я генерирую эти изображения в случайных местах на экране, и когда пользователь щелкает изображение, он должен запускать событие. В Android версии 4.0 и выше это работает отлично. Тем не менее, когда я тестирую его на более низких версиях, расположение изображений выглядит правильно, но при нажатии на изображение он либо запускает событие для другого изображения, либо не запускает его вообще. Также, когда вы нажимаете пустое место (часто в верхнем левом углу), оно также запускает событие. Я не уверен, что это низкая версия Android или низкое разрешение экрана.
Код
BubbleImage XML
Это макет для изображения, onClickEvent непосредственно устанавливается на RelativeLayout не ImageView в RelativeLayout
<?xml version="1.0" encoding="utf-8"?>
<com.timkranen.customui.BubbleImage xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/bubImgMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/bubbleImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/bubble_selector" />
<TextView
android:id="@+id/numberTxtView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/bubbleImage"
android:layout_alignLeft="@+id/bubbleImage"
android:layout_alignBottom="@+id/bubbleImage"
android:layout_alignRight="@+id/bubbleImage"
android:gravity="center"
android:text="test"
android:textColor="#fff"
android:textSize="23sp" />
"
Генерация случайных BubbleImages
Извините за длинный кусок кода здесь, я должен отметить, что я использую ninoldandroid библиотеку, чтобы получить правильный х/у координаты на старой версии Android (класс ViewHelper делает это):
private void generateRandomView(int amount) {
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (int i = 0; i <= amount; i++) {
// add imageview to layout
BubbleImage rImg = (BubbleImage) inflater.inflate(
R.layout.bubbleimage, null);
rImg.setEnabled(false);
rImg.setOnClickListener(new BubbleClick());
bubbleImages.add(rImg);
totalBubbles++;
// create random number in between amount and 0
int genNum = this.generateRandomNum(amount);
rImg.setNumber(genNum);
numbers.add(genNum);
// determine the screen size
screenSize = getScreenSize();
screenSize.x = screenSize.x - screenSize.x/4;
screenSize.y = screenSize.y - ((screenSize.x/4) * 3) + 20;
// stick might throw a stackoverflow error if its called too much
// but the game only needs to call it on level max
// stackoverflowerror @ 10x on 300x300
// stackoverflowerror @ 16x on 250x250
// depends on screen size
Point randomLoc = null;
try {
Random random = new Random();
randomLoc = generateRandomLocation(screenSize, random);
} catch (StackOverflowError e) {
Toast.makeText(
this,
"BrainTest PRO encountered a fatal error caused by low memomory on your device. Restart the app and try again, if the error persists please report it to the developer.",
Toast.LENGTH_LONG).show();
finish();
}
Resources r = getResources();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(180,
180);
mainLayout.addView(rImg, params);
ViewHelper.setTranslationX(rImg, (float) randomLoc.x);
ViewHelper.setTranslationY(rImg, (float) randomLoc.y);
// scalefactor on basis of screensize
float scaleFactor = 1.2f;
ViewHelper.setScaleX(rImg, scaleFactor);
ViewHelper.setScaleY(rImg, scaleFactor);
Создавать метод случайного места
Я не думаю, что мне нужно уточнить generateRandomNum(), но я должен прояснить этот метод, это рекурсивный метод, который идет в к петле до сгенерированных изображений больше не сталкиваться
private Point generateRandomLocation(Point dimensions, Random random) {
// generate random x
int x = random.nextInt((dimensions.x - 0) + 1);
// generate random y
int y = random.nextInt((dimensions.y - 0) + 1);
Point location = new Point(x, y);
if (!collision(location)) {
return new Point(x, y);
} else {
return generateRandomLocation(dimensions, new Random());
}
}
BubbleClick событие Это событие, которое срабатывает, само событие работает, но это не срабатывает на правильных местах
private class BubbleClick implements OnClickListener {
private ScoreCalculator calculator;
public BubbleClick() {
calculator = new ScoreCalculator();
}
@Override
public void onClick(View arg0) {
BubbleImage clicked = (BubbleImage) arg0;
Log.d("Clicked_bubble", "Num: " + clicked.getNumber() + " | X: " + ViewHelper.getTranslationX(clicked) + " | Y: " + ViewHelper.getTranslationY(clicked));
ImageView clicked_img = (ImageView) clicked
.findViewById(R.id.bubbleImage);
if (currentClick == clicked.getNumber()) {
if (previousBub != null) {
GameActivity.this.drawLine(clicked);
}
// SUCCESFULL CLICK
score += calculator.pointsPerBubble(currentLevel);
scoreLabel.setText("Score: " + String.valueOf(score));
// clicked_img.setImageResource(R.drawable.bubble_ok);
clicked.setEnabled(false);
previousBub = clicked;
playPosSound();
for (int i = 0; i <= clicked.getChildCount(); i++) {
View child = clicked.getChildAt(i);
if (child instanceof TextView) {
TextView txtView = (TextView) clicked.getChildAt(i);
txtView.setVisibility(View.VISIBLE);
}
}
// check wether the last bubbleimage was clicked
if (countListClick + 1 != numbers.size()) {
countListClick++;
currentClick = numbers.get(countListClick);
} else {
GameActivity.this.resetGame(true);
}
} else {
// WRONG ATTEMPT
clicked_img.setImageResource(R.drawable.bubble_wrong);
scores.add(new Score(score, attempt));
attempt++;
if (attempt > 3) {
// GAME OVER
isGameOver = true;
continueBut.setVisibility(View.INVISIBLE);
GameActivity.this.gameOver();
}
previousBub = null;
playNegSound();
if (currentLevel > 0) {
currentLevel--;
}
vibrate();
for (int i = 0; i <= clicked.getChildCount(); i++) {
View child = clicked.getChildAt(i);
if (child instanceof TextView) {
TextView txtView = (TextView) clicked.getChildAt(i);
txtView.setVisibility(View.VISIBLE);
}
}
// show all text and disable buttons
if (bubbleImages != null) {
for (BubbleImage bImg : bubbleImages) {
bImg.setEnabled(false);
for (int i = 0; i <= bImg.getChildCount(); i++) {
View childV = bImg.getChildAt(i);
if (childV instanceof TextView) {
TextView childView = (TextView) childV;
childView.setVisibility(View.VISIBLE);
}
}
}
}
if (!isGameOver) {
GameActivity.this.resetGame(false);
}
// GAME OVER
}
}
Содержимое onClickListener довольно неуместно, так как код работает отлично, а не в нужные моменты. Кто-нибудь знает, что происходит?
Заранее благодарен!