2014-09-11 57 views
1

最初我從前面的活動中獲得的第一個位圖對象,並與同一活動中的另一個位圖進行比較。我完成了按鈕點擊的位圖比較(稱爲Next),但我遇到了一個問題。當我點擊按鈕(Next)時,比較後一次位圖對象發生變化。我想通過點擊按鈕不斷更改位圖對象(下一步)。以下是我已完成的代碼。比較位圖對象後,如何通過按鈕的點擊來連續獲取下一個位圖對象?

//I use bundle extra for getting bitmap object from previous activity 

Bundle extras = getIntent().getExtras(); 
     byte[] byteArray = extras.getByteArray("picture"); 

     Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

btn_next = (Button) findViewById(R.id.btn_next); 
     btn_next.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
    Bitmap img_A = BitmapFactory.decodeResource(getResources(), R.drawable.img_a); 
       Bitmap img_B = BitmapFactory.decodeResource(getResources(), R.drawable.img_b); 

       Bitmap img_C = BitmapFactory.decodeResource(getResources(), R.drawable.img_c); 

       Bitmap img_D = BitmapFactory.decodeResource(getResources(), R.drawable.img_d); 

if(imagesAreEqual(bmp, img_A)){ 
         bitmap = img_B.copy(Bitmap.Config.ARGB_8888, true); 
         image.setImageBitmap(bitmap); 
        } 
        else if(imagesAreEqual(bmp, img_B)){ 
         bitmap = img_C.copy(Bitmap.Config.ARGB_8888, true); 
         image.setImageBitmap(bitmap); 
        } 
        else if(imagesAreEqual(bmp, img_C)){ 
         bitmap = img_D.copy(Bitmap.Config.ARGB_8888, true); 
         image.setImageBitmap(bitmap); 
        } 
        else{ 
         Toast.makeText(getApplicationContext(), "Not Matched", Toast.LENGTH_SHORT).show(); 
        } 


} 
}); 

這是imagesAreEqual(),

boolean imagesAreEqual(Bitmap i1, Bitmap i2) 
    { 
     if (i1.getHeight() != i2.getHeight()) 
     return false; 
     if (i1.getWidth() != i2.getWidth()) return false; 

     for (int y = 0; y < i1.getHeight(); ++y) 
      for (int x = 0; x < i1.getWidth(); ++x) 
       if (i1.getPixel(x, y) != i2.getPixel(x, y)) return false; 

     return true; 
    } 
+0

這是一個**我太懶惰了。爲我做這個plx!**問題,或者你是否真的嘗試了一些迭代圖像? – Simas 2014-09-15 06:53:33

+0

我爲了更好的理解添加圖片。 – jack 2014-09-15 07:06:44

回答

2

我想我並沒有真正讓你指出這個問題,但我認爲你應該嘗試在通過一個循環之後爲bmp獲取新的byteArray []。

或者你可以以某種方式調用這個線程(什麼時候不再需要),只要byteArray改變,所以你不必檢查30次/秒,什麼可能真的爲你節省一些電池。

或者,如果這是不可能的,如果byteArray已更改,則檢查像30次/秒,並且只有在檢查它是否與其他一個相同時才檢查。

但我真的不知道我是否真的有你的問題,所以只是如果沒有評論。

編輯:你想一些代碼,所以這裏談到:

public class myActivity implements Runnable{ 
    private Thread thread; 
    public boolean running = false; 
    private Bitmap oldbmp; 
    Bundle extras = getIntent().getExtras(); 
    byte[] byteArray = extras.getByteArray("picture"); 

    public void setRunning(boolean setRunning){ 
     running = setRunning; 
    } 

    public void run(){ 
     while(running){ 
      //Start Time 
      long startTime = System.currentTimeMillis(); 
      byte[] byteArray = extras.getByteArray("picture"); 
      Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
      if(!bmp.equals(oldbmp){ 
       if(imagesAreEqual(bmp, img_A)){ 
        bitmap = img_B.copy(Bitmap.Config.ARGB_8888, true); 
        image.setImageBitmap(bitmap); 
       } else if(imagesAreEqual(bmp, img_B)){ 
        bitmap = img_C.copy(Bitmap.Config.ARGB_8888, true); 
        image.setImageBitmap(bitmap); 
       } else if(imagesAreEqual(bmp, img_C)){ 
        bitmap = img_D.copy(Bitmap.Config.ARGB_8888, true); 
        image.setImageBitmap(bitmap); 
       } else if(imagesAreEqual(bmp, img_D)){ 
        bitmap = img_D.copy(Bitmap.Config.ARGB_8888, true); 
        image.setImageBitmap(bitmap); 
       } 

       //End Time 
       long endTime = System.currentTimeMillis(); 
       if (endTime -startTime < 1000/30){ 
        try 
        { 
         Thread.sleep(1000/2 -(endTime -startTime)); 
        } catch (InterruptedException e){} 
       } 
      } 
     } 
    } 
} 

貸@TomTsagk

所以這裏的一些代碼,如果正確添加什麼應該工作。 如果bmp發生了變化,它會每半秒檢查一次,如果檢查是否有一個位圖看起來相同,但我真的不知道這對於什麼有用。如果還有其他的東西我應該補充或者改變,就問。

+0

你在這裏放了一些樣品嗎? – jack 2014-09-22 04:33:26

+0

那麼這真的是你的問題嗎?好吧,我必須現在上學,但之後我可以添加一些 – blueBurningCoder 2014-09-22 05:12:49

+0

是的,我真的很長時間卡住了有這個問題。 – jack 2014-09-22 05:16:19

2
,如果你想,當你點擊你可以創建一個新的線程按鈕來連續改變的位圖和那樣做

讓你的當前活動實現Runnable

public class myActivity extends Activity implements Runnable 
{ 
    private Thread thread; 
    private boolean running = false; 
    //... 
} 

那麼像這樣的活動中創建一個方法:

public void run() 
{ 
    while(running) 
    { 
     //Start Time 
     long startTime = System.currentTimeMillis(); 

     if(imagesAreEqual(bmp, img_A)){ 
      bitmap = img_B.copy(Bitmap.Config.ARGB_8888, true); 
      image.setImageBitmap(bitmap); 
     } 
     else if(imagesAreEqual(bmp, img_B)){ 
      bitmap = img_C.copy(Bitmap.Config.ARGB_8888, true); 
      image.setImageBitmap(bitmap); 
     } 
     else if(imagesAreEqual(bmp, img_C)){ 
      bitmap = img_D.copy(Bitmap.Config.ARGB_8888, true); 
      image.setImageBitmap(bitmap); 
     } 

     //End Time 
     long endTime = System.currentTimeMillis(); 
     if (endTime -startTime < 1000/30) 
      try 
      { 
       Thread.sleep(1000/30 -(endTime -startTime)); 
      } catch (InterruptedException e){} 
    } 
} 

此外,當按鈕被點擊應用如下:

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Bitmap img_A = BitmapFactory.decodeResource(getResources(), R.drawable.img_a); 
    Bitmap img_B = BitmapFactory.decodeResource(getResources(), R.drawable.img_b); 
    Bitmap img_C = BitmapFactory.decodeResource(getResources(), R.drawable.img_c); 
    Bitmap img_D = BitmapFactory.decodeResource(getResources(), R.drawable.img_d); 

    thread = new Thread(this); 
    running = true; 
    thread.start(); 
} 

這將會使你的代碼檢查圖像的30倍每一秒,如果你想改變它檢查速度有多快,改變run()方法中的「1000/30」(以毫秒爲單位)

雖然我不確定我推薦這樣的東西,因爲檢查這麼多的位圖是非常密集的CPU,但如果它解決了你的問題,我想這是值得的。

另外我不確定我是否理解了您的問題100%,您也可以嘗試每次位圖更改時運行檢查一次,如果發生這種情況,請刪除評論,我將編輯我的答案。

+0

好吧,我在我身邊實施這段代碼。謝謝。 – jack 2014-09-17 04:06:00

+0

@jack是否按照你的意願工作?它解決了你的問題嗎? – TomTsagk 2014-09-17 07:21:21

+0

我將執行此代碼。 – jack 2014-09-18 03:56:00

相關問題