2016-12-16 6 views
1

В моем приложении у меня есть изображение, которое случайно выбрано. Изображение появляется на экране, и пользователь может сдвинуть его в сторону. Каждый раз, когда это изображение a, счетчик должен рассчитывать, но это не так. Является ли возвращаемое значение my int getMyRandomResId неправильным в состоянии или где ошибка?android - switch case return value for if statement

public class MainActivity extends Activity 
{ 
    private ImageView imageView; 
    public int sco = 0; 
    float x1, x2; 
    float y1, y2; 
    final Random rand = new Random();  

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game); 

     score = (TextView)findViewById(R.id.textView1); 
     score.setText(String.valueOf(sco)); 
    } 

    int getMyRandomResId() 
    { 
     int imag = rand.nextInt(4); 

     switch (imag) 
     { 
      case 0: 
       return R.drawable.a; 
      case 1: 
       return R.drawable.b; 
      case 2: 
       return R.drawable.c; 
      default: 
       return R.drawable.d; 
     } 
    } 

    public boolean onTouchEvent(MotionEvent touchevent) 
    { 
     final ViewPropertyAnimator animator = imageView.animate(); 

     switch (touchevent.getAction()) 
     { 

     case MotionEvent.ACTION_DOWN: 
     { 

      x1 = touchevent.getX(); 
      y1 = touchevent.getY(); 
      break; 
     } 
     case MotionEvent.ACTION_UP: 
     { 

      x2 = touchevent.getX(); 
      y2 = touchevent.getY(); 

      //if left to right sweep event on screen 
      if (x1 < x2 && (x2 - x1) >= (y1 - y2) && (x2 - x1) >= (y2 - y1)) 
      { 

       if(getMyRandomResId() == R.drawable.a) 
       { 
        sco++; 
        score.setText(String.valueOf(sco)); 
       } 

       animationRunning = true; 
       animator.translationX((imageView.getWidth())) 
       .setDuration(250) 
       .setListener(new AnimatorListenerAdapter() 
       { 
        @Override 
        public void onAnimationEnd(Animator animation) 
        { 


         imageView.setTranslationX(0); 
         imageView.setImageResource(getMyRandomResId()); 
         animationRunning = false; 

        } 
       }) 
       .start(); 
      } 

     } 
    } 
} 
+0

Так как я смущен себя в ответе, как @StefMa указал мне, что я должен спросить вас кое-что здесь: с отладчиком, вы попробуйте проверить, если если условие достиг? попробуйте исправить результат вашего getMyRandomId в переменной и с отладчиком проверить его значение –

+0

Я предполагаю, что код правильный. Но, к сожалению (из-за случайного int), вы никогда не достигали точки. Я создал тестовую установку, и она зеленая. Это означает, что все правильно ... См. Https://git.io/v1Hrw – StefMa

+0

@StefMa Итак, вы знаете, почему это не работает? –

ответ

3

Каждый раз, когда вы создаете Random rand = new Random();, он начинается с той же точки. Вот цитата из documentation

Если два экземпляра Random создаются с той же семени, и та же последовательность вызовов метода производится для каждого, они будут генерировать и возвращать одинаковые последовательности чисел.

Вы должны создать экземпляр класса Random только один раз. Например, как это:

public class MainActivity extends Activity { final Random random = new Random(); ...

+0

Я не создавал случайный объект один раз? –

+0

Попробуйте создать его один раз для каждого класса, скажем, рядом с 'public int sco = 0;' вы помещаете 'final Random rand = new Random();' – foxanna

+1

@JoeS: вы создаете его каждый раз, когда вы вызываете 'getMyRandomResId()' , Вместо этого вы должны объявлять «Случайный» в классе как переменную-член. – Knossos

0

getMyRandomResId() этот метод работает отлично, и хотя предложение о foxanna также лучше здесь некоторые изменения, которые я сделал, я испытал это и работал для меня

public class MainActivity extends Activity 
{ 
    private ImageView imageView; 
    public int sco = 0; 
    float x1, x2; 
    float y1, y2; 
    Random rand; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game); 

     score = (TextView)findViewById(R.id.textView1); 
     score.setText(String.valueOf(sco)); 
     rand = new Random(); 
    } 

int getMyRandomResId() 
{ 
    int imag = rand.nextInt(4); 

    switch (imag) 
    { 
     case 0: 
      sco++; 
      return R.drawable.a; 
     case 1: 
      return R.drawable.b; 
     case 2: 
      return R.drawable.c; 
     default: 
      return R.drawable.d; 
    } 
} 

public boolean onTouchEvent(MotionEvent touchevent) 
{ 
    final ViewPropertyAnimator animator = imageView.animate(); 

    switch (touchevent.getAction()) 
    { 

    case MotionEvent.ACTION_DOWN: 
    { 

     x1 = touchevent.getX(); 
     y1 = touchevent.getY(); 
     break; 
    } 
    case MotionEvent.ACTION_UP: 
    { 

     x2 = touchevent.getX(); 
     y2 = touchevent.getY(); 

     //if left to right sweep event on screen 
     if (x1 < x2 && (x2 - x1) >= (y1 - y2) && (x2 - x1) >= (y2 - y1)) 
     { 

      if(getMyRandomResId() == R.drawable.a) 
      { 
       score.setText(String.valueOf(sco)); 
      } 

      animationRunning = true; 
      animator.translationX((imageView.getWidth())) 
      .setDuration(250) 
      .setListener(new AnimatorListenerAdapter() 
      { 
       @Override 
       public void onAnimationEnd(Animator animation) 
       { 


        imageView.setTranslationX(0); 
        imageView.setImageResource(getMyRandomResId()); 
        animationRunning = false; 

       } 
      }) 
      .start(); 
     } 

    } 
} 
} 

Надеюсь, это поможет.

1

Я думаю, вы чего-то пропустите. Я проверил ваш опубликованный код, и он работает как шарм. MainActivity.java

public class MainActivity extends AppCompatActivity { 

    public int sco = 0; 

    float x1, x2; 

    float y1, y2; 

    private ImageView imageView; 

    @Override 
    public boolean onTouchEvent(MotionEvent touchevent) { 
     final ViewPropertyAnimator animator = imageView.animate(); 

     switch (touchevent.getAction()) { 

      case MotionEvent.ACTION_DOWN: { 

       x1 = touchevent.getX(); 
       y1 = touchevent.getY(); 
       break; 
      } 
      case MotionEvent.ACTION_UP: { 

       x2 = touchevent.getX(); 
       y2 = touchevent.getY(); 

       //if left to right sweep event on screen 
       if (x1 < x2 && (x2 - x1) >= (y1 - y2) && (x2 - x1) >= (y2 - y1)) { 

        final int randomResId = getMyRandomResId(); 
        Log.e("ResId: ", String.valueOf(randomResId)); 
        if (randomResId == R.drawable.ic_assignment_late_black_24dp) { 
         sco++; 
         Log.e("NewScoId", String.valueOf(sco)); 
        } 

        animator.translationX((imageView.getWidth())) 
          .setDuration(250) 
          .setListener(new AnimatorListenerAdapter() { 
           @Override 
           public void onAnimationEnd(Animator animation) { 

            imageView.setTranslationX(0); 
            imageView.setImageResource(randomResId); 

           } 
          }) 
          .start(); 
       } 

      } 
     } 
     return true; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     imageView = (ImageView) findViewById(R.id.x); 
    } 

    int getMyRandomResId() { 
     Random rand = new Random(); 
     int imag = rand.nextInt(4); 

     switch (imag) { 
      case 0: 
       return R.drawable.ic_assignment_late_black_24dp; 
      case 1: 
       return R.drawable.ic_android_black_24dp; 
      case 2: 
       return R.drawable.ic_battery_charging_30_black_24dp; 
      default: 
       return R.drawable.ic_exposure_neg_2_black_24dp; 
     } 
    } 
} 

activity_main.xml

<RelativeLayout android:id="@+id/activity_main" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <ImageView 
     android:id="@+id/x" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:text="Hello World!" 
     app:srcCompat="@drawable/ic_android_black_24dp" /> 
</RelativeLayout> 

и используются случайные изображения, созданные с помощью создания векторной Wizzard активов. Мой LogCat (в то время как ударяя) выглядит следующим образом:

E/ResId:: 2130837590 
E/ResId:: 2130837590 
E/ResId:: 2130837589 
E/ResId:: 2130837588 
E/NewScoId: 1 
E/ResId:: 2130837587 
E/ResId:: 2130837590 
E/ResId:: 2130837588 
E/NewScoId: 2 
E/ResId:: 2130837587 
E/ResId:: 2130837589 
E/ResId:: 2130837588 
E/NewScoId: 3 
[...]