Как поменять изображения на холсте в Android? - PullRequest
5 голосов
/ 30 декабря 2011

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

   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;
      }
}

с помощью приведенного выше кода я отобразил изображения в виде строк и столбцов.

Вот как мне поменять местами два изображения из строк и столбцов?

пожалуйста, любое тело, помогите мне .....

Ответы [ 3 ]

2 голосов
/ 03 января 2012

У меня нет прав на добавление комментария, поэтому я публикую это как ответ.Что вы подразумеваете под изображениями?Когда пользователь нажимает на одно изображение, оно должно поменяться местами с изображением рядом с ним?Можете ли вы также поделиться кодом, в котором вы добавили эти изображения для просмотра, или каким-либо адаптером?

РЕДАКТИРОВАТЬ:

У меня тоже была похожая ситуация во времена, когда существовали абсолютные макеты.Я сделал следующее:

Класс:

    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;
}

IЯ только что попытался показать вам логику, используя мой собственный пример и смешивая его с вашим кодом.Суть в том, что в методе ondraw просто вызовите drawcanvas, а на ощупь просто поменяйте местами элементы [] [] и вызовите метод postinvalidate класса Panel.

1 голос
/ 08 января 2012

Я должен был сделать что-то подобное один раз.Я просто поменял ссылки на изображения в массиве и сделал перерисовку (invalidate()) для всего этого.

void swap(int x1, int y1, int x2, int y2) {
    // swap items[x1][y1] and items[x2][y2]
    ........
    invalidate();
}
0 голосов
/ 06 января 2012

Не совсем уверен, что вы на самом деле спрашиваете здесь, поэтому, пожалуйста, попробуйте уточнить вопрос.

Одним из подходов может быть использование ViewAnimator в качестве родителя для каждого из рисуемых ImageView.

<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">

Затем, как только вы захватите событие, которое должно вызвать обмен, вы можете использовать ViewAnimator для обмена представлением (в вашем случае ImageView), которое оно использует.Вы даже можете легко добавить эффект анимации http://developer.android.com/reference/android/widget/ViewAnimator.html

...