2016-12-16 146 views
1

在我的应用程序中,我有一个随机挑选的图像。图像出现在屏幕上,用户可以将其滑动到一侧。每次它是一个图像a,计数器应计数,但它不。我的int getMyRandomResId的返回值在条件中是错误的,还是错误在哪里?android - switch if case语句的返回值

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类的实例。例如,像这样:

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

+0

我不是一次创建随机对象吗? –

+0

尝试为每个类创建一次,比方说'public int sco = 0;'你放在最后Random rand = new Random();' – foxanna

+1

@JoeS:每次调用'getMyRandomResId() 。您应该将类​​中的Random类声明为成员变量。 – 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> 

而且使用随机图像。 我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 
[...]