2011-12-30 14 views
5

アプリケーションのリソースの画像を行と列としてランダムに表示しました。 これらの行と列から、ユーザーが画像の横にあるをクリックすると、2つの画像を交換したいと思います。次のコードでは、画像を行と列にランダムに表示します。アンドロイドでキャンバスに画像をスワップする方法は?

private void rand(int imagesList[][]) 
{ 
    Random generator = new Random(); 
    int temp; 
    for (int i = 0; i < MAX_ROWS; i++) 
     for(int j = 0; j < MAX_COLS; j++) 
     { 
      int randRowPos = generator.nextInt(MAX_ROWS); 
      int randColPos = generator.nextInt(MAX_COLS); 
      temp = imagesList[i][j]; 
      imagesList[i][j] = imagesList[randRowPos][randColPos]; 
      imagesList[randRowPos][randColPos]= temp; 
     } 
} 

上記のコードを使用して、私は行と列として画像を表示しています。

ここで、どのように行と列の画像の横の2つを入れ替えることができますか?

すべてのボディは、私を助けてください.....

答えて

2

私がコメントを追加する権限を持っていないので、私は答えとしてこれを掲示しています。 画像の横にはどういう意味がありますか? ユーザーが1つの画像をクリックすると、その画像がその画像と入れ替えられるべきですか? これらの画像をビンにしたコードを表示またはアダプタビューに共有することはできますか?

EDIT:

私も絶対レイアウトが生きていた時期に似たような状況がありました。 次のように私がやったことです:

クラス:

public class PlayScreen extends Activity implements OnTouchListener 

    private Panel mainPanel; // Panel for out display 
    boolean firstClick = false; 

のOnCreate:

main = new Panel(this); 
// Display the panel (calls the ondraw and updates the display) 
setContentView(main,new ViewGroup.LayoutParams(screenwidth,screenheight)); 
// Listen for touchevents on the panel 
main.setOnTouchListener(this); 

パネル:

class Panel extends View 
    { 
     /* 
     * Init a Panel to draw on and a paint to paint with 
     */ 
     Paint mBitmapPaint; 
     public Panel(Context context) 
     { 
      super(context); 
      mBitmapPaint = new Paint(); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
     drawImages(canvas); 
     } 
    } 

drawImages:

private void drawImages(Canvas canvas) 
{ 

     for(int i = 0; i<MAX_ROWS; i++){ 
      for(int j=0; j<MAX_COLS; j++) 
      { 
     int xpos = j*bmp.getWidth()+j*2; 
     int ypos = i*bmp.getHeight()+i*2; 
      bmp = BitmapFactory.decodeResource(mContext.getResources(), items[i][j],opts); 
       canvas.drawBitmap(bmp,xpos,ypos,mBitmapPaint); 
     clickzonex.add(xpos); 
     clickzoney.add(ypos); 
     clickzonei.add(i); 
     clickZonej.add(j); 

      } 
     } 

} 

OnTouch:私はちょうど私自身の例を使用し、あなたのコードでそれを混合あなたのロジックを表示しようとしてい

onTouch(View v, MotionEvent event) : 

if (event.getAction() == MotionEvent.ACTION_DOWN) 
{ 
// imply logic 
x = (int) event.getX(); 
y = (int) event.getY(); 

    for(int i = 0; i < clickzonex.size();i++) 
    { 
    if((x>clickzonex[i]) && (x<(clickzonex[i]+ bmp.getwidth())) && (y>(clickzoney[i])) && (y<(clickzoney[i]+bmp.getHeight()))) 
    { 
    // we have a click in a zone so we get the card-number in that zone 
    if(firstClick == false) 
    { 
    itemAti=clickzonei[i]; 
    itemAtj = clickzonej[i]; 
    firstclick = false; 
    } 
    else 
    { 
    FirstItemToSwap = items[clickzonei[i]][clickzonej[i]]; 
    SecondItemToSwap = items[itemAti][itemAtj]; 

    // Now do the swaping using any algo you like. 

    main.postInvalidate(); 
    firstclick = true; 
    } 
    break; 
    } 
    } 
return true; 
} 
else 
{ 
return false; 
} 

。要点は、ondrawメソッドではdrawcanvasを呼び出してtouchするだけでitem [] []をスワップし、Panelクラスのpostinvalidateメソッドを呼び出すことです。

+0

http://stackoverflow.com/questions/8708324/how-to-swap-the-bitmap-images-on-view-in-android –

+0

私はコードの実装与えている上記のリンクを介して行ってください。 –

0

ここで実際に何を求めているのかよくわからないので、質問を明確にしてください。

1つのアプローチは、描画可能な各ImageViewの親としてViewAnimatorを使用することです。あなたはスワップをトリガーするイベントをキャプチャしたら

<ViewAnimator 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/slideshow_animator" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

その後、あなたはそれが使用しています(あなたのケースのImageViewの中で)ビューを交換するViewAnimatorを使用することができます。アニメーション効果を簡単に追加することもできます。 http://developer.android.com/reference/android/widget/ViewAnimator.html

1

私はこれを一度だけやらなければなりませんでした。私はちょうど配列の画像参照を交換し、全体を再描画(invalidate())しました。

void swap(int x1, int y1, int x2, int y2) { 
    // swap items[x1][y1] and items[x2][y2] 
    ........ 
    invalidate(); 
} 
関連する問題