Android:如何将ImageView划分为块并将它们分配给onClickListener

时间:2013-04-22 11:09:50

标签: android imageview onclicklistener

我需要将图像(ImageViewer)划分为块并为它们分配onClick事件侦听器。为了划分图像,我使用下一个代码:

private void splitImage(ImageView image, int rows, int cols) {  

    //For height and width of the small image chunks 
    int chunkHeight,chunkWidth;

    //To store all the small image chunks in bitmap format in this list 
    ArrayList<Bitmap> chunkedImages = new ArrayList<Bitmap>(rows * cols);

    //Getting the scaled bitmap of the source image
    BitmapDrawable drawable = (BitmapDrawable) image.getDrawable();
    Bitmap bitmap = drawable.getBitmap();
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);

    chunkHeight = bitmap.getHeight()/rows;
    chunkWidth = bitmap.getWidth()/cols;

    //xCoord and yCoord are the pixel positions of the image chunks
    int yCoord = 0;
    for(int x=0; x<rows; x++){
        int xCoord = 0;
        for(int y=0; y<cols; y++){
            chunkedImages.add(Bitmap.createBitmap(scaledBitmap, xCoord, yCoord, chunkWidth, chunkHeight));
            xCoord += chunkWidth;
        }
        yCoord += chunkHeight;
    }       
}

但是只有这个函数我得到一个Bitmap数组,它们不接受OnClickListener。我所做的是用块重建图像,并能够放大选定的块。

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

如果是单个图像无法分割成多个图像,您可以在图像视图上添加Touch handler并检查x / y坐标

例如在触摸处理程序中

boolean onTouch(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        if (ev.getPointerCount() > 0) {
            int w = v.getWidth();
            int h = v.getHeight();
            float eX = ev.getX(0);
            float eY = ev.getY(0);
            int x = (int) (eX / w * 100);
            int y = (int) (eY / h * 100);
            // x and y would be % of the image.
            // so you can say cell 1 is x < 25, y < 25 for a 4x4 grid

            // TODO add a loop or something to use x and y to detect the touched segment
        }
    }
    return true;
}

你也可以将int x和y更改为float x和y更精确。

TODO的示例代码

//somewhere in your code..
int ROWS = 5;
int COLS = 5;

// in the place of the TODO...
int rowWidht = 100/ROWS;
int colWidht = 100/COLS;

int touchedRow = x / rowWidth; // should work, not tested!
int touchedcol = y / colWidth; // should work, not tested!

cellTouched(touchedRow, touchedCol);

其中cellTouched()是您处理触摸的方法... (这里你也可以使用浮动)

答案 1 :(得分:0)

您可以使用网格视图制作图像块并在其上设置onClickListener。

答案 2 :(得分:0)

你真的需要分割图像吗?我只想在整个图像上设置一个OnTouchListener。从内部,您可以获得触摸事件的坐标。然后你做一些数学运算,你应该能够知道图像的哪个部分可以放大。