【问题标题】:how to swap images on canvas in android?如何在android中交换画布上的图像?
【发布时间】:2011-12-30 12:11:33
【问题描述】:

我已将应用程序中资源中的图像随机显示为行和列。 从这些行和列中,当用户仅单击图像旁边时,我想交换两个图像。以下代码将随机显示行和列中的图像。

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

通过使用上面的代码,我将图像显示为行和列。

我怎样才能在行和列中交换两个旁边的图像?

请任何人帮助我.....

【问题讨论】:

    标签: android image rows swap


    【解决方案1】:

    我无权添加评论,所以我将其发布为答案。 旁边的图片是什么意思? 当用户点击一张图片时,它应该与旁边的图片交换吗? 您还可以分享您将这些图像分箱以查看或任何适配器视图的代码吗?

    编辑:

    在绝对布局还活着的时候,我也遇到过类似的情况。 我所做的如下:

    类:

        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,在触摸时只需交换 items[][] 并调用 Panel 类的 postinvalidate 方法。

    【讨论】:

    【解决方案2】:

    我不得不这样做一次。我只是交换了数组中的图像引用,并对整个事情进行了重绘(invalidate())。

    void swap(int x1, int y1, int x2, int y2) {
        // swap items[x1][y1] and items[x2][y2]
        ........
        invalidate();
    }
    

    【讨论】:

      【解决方案3】:

      不太清楚你在这里实际问的是什么,所以请试着澄清这个问题。

      一种方法是使用 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 交换它使用的 View(在您的情况下为 ImageView)。您甚至可以轻松添加动画效果 http://developer.android.com/reference/android/widget/ViewAnimator.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2016-08-13
        相关资源
        最近更新 更多