2013-11-16 7 views
0

Я попытаюсь объяснить проблему как можно подробнее, но поскольку это довольно конкретная проблема, это будет сложно. Но я в конце своих вариантов и действительно не знаю, как это исправить.Местоположения 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 довольно неуместно, так как код работает отлично, а не в нужные моменты. Кто-нибудь знает, что происходит?

Заранее благодарен!

ответ

1

Поскольку это была реальная проблема для меня:

Метод ViewHelper.getTranslation не ведет себя так же на 2.х, как это делает на 4.x, я использовал вместо Поля.

Смежные вопросы