添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
currentPaint = new Paint(); currentPaint.setDither(true); currentPaint.setColor(0xFF00CC00); currentPaint.setStyle(Paint.Style.STROKE); currentPaint.setStrokeJoin(Paint.Join.ROUND); currentPaint.setStrokeCap(Paint.Cap.ROUND); currentPaint.setStrokeWidth(2); @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float chunkWidth = currentWidth / nChunksX; float chunkHeight = currentHeight / nChunksY; float posX = ((int)(pixelX / chunkWidth)) * chunkWidth; float posY = ((int)(pixelY / chunkHeight)) * chunkHeight; canvas.drawRect(posX, posY, posX + chunkWidth, posY + chunkHeight, currentPaint); Rect rect = this.getDrawable().getBounds(); canvas.drawRect(rect, currentPaint); @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Get image matrix values and place them in an array float[] f = new float[9]; getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); currentWidth = actW; currentHeight = actH; public boolean isDrawRect() { return drawRect; public void setDrawRect(boolean drawRect) { this.drawRect = drawRect; public float getLeftRect() { return left; public void setLeftRect(float left) { this.left = left; public float getTopRect() { return top; public void setTopRect(float top) { this.top = top; public float getRightRect() { return right; public void setRightRect(float right) { this.right = right; public float getBottomRect() { return bottom; public void setBottomRect(float bottom) { this.bottom = bottom; public float getPixelX() { return pixelX; public void setPixelX(float pixelX) { this.pixelX = pixelX; public float getPixelY() { return pixelY; public void setPixelY(float pixelY) { this.pixelY = pixelY; public int getChunksX() { return nChunksX; public void setChunksX(int nChunksX) { this.nChunksX = nChunksX; public int getChunksY() { return nChunksY; public void setChunksY(int nChunksY) { this.nChunksY = nChunksY;

现在,源图像被定义在XML文件中。

<com.jocajica.shakepic.PuzzleView
    android:id="@+id/imageViewSelected"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:contentDescription="@string/image_selected"
    android:src="@android:drawable/progress_indeterminate_horizontal" />

我需要在图像上画一个网格。

3 个评论
getTop/getLeft/getBottom/getRight有什么问题?
@blackbelt 我相信这些将返回ImageView在其容器中的坐标。 OP想知道ImageView中实际图像的偏移量
正是如此。我需要知道当前图像的偏移量,而getTop/getLeft/getBottom/getRight只返回ImageView在其容器中的坐标。
android
android-imageview
Joan Carles
Joan Carles
发布于 2013-04-24
4 个回答
Quentin S.
Quentin S.
发布于 2017-11-16
已采纳
0 人赞同

根据Jacob Nordfalk的链接,我能够产生一个静态方法,允许你从一个ImageView中获得图像的位置和尺寸。

* Returns the bitmap position inside an imageView. * @param imageView source ImageView * @return 0: left, 1: top, 2: width, 3: height public static int[] getBitmapPositionInsideImageView(ImageView imageView) { int[] ret = new int[4]; if (imageView == null || imageView.getDrawable() == null) return ret; // Get image dimensions // Get image matrix values and place them in an array float[] f = new float[9]; imageView.getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = imageView.getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); ret[2] = actW; ret[3] = actH; // Get image position // We assume that the image is centered into ImageView int imgViewW = imageView.getWidth(); int imgViewH = imageView.getHeight(); int top = (int) (imgViewH - actH)/2; int left = (int) (imgViewW - actW)/2; ret[0] = left; ret[1] = top; return ret;
这将返回负值的偏移量。
Zach
Shouldn't it be: res[2] = left + actW; and res[3] = top + actH;?
res[2]和res[3],正如评论文件中所说,是宽度和高度,而不是右侧和底部。
感谢Quentis S.和Jacob Nordfalk提供的非常有用的程序。我擅自将返回值从数组改为Rect对象。请看我下面的答案。
Jacob Nordfalk
Jacob Nordfalk
发布于 2017-11-16
0 人赞同

你应该使用getImageMatrix()。

float[] imageMatrix = new float[9];
getImageMatrix().getValues(imageMatrix);
scale = imageMatrix[Matrix.MSCALE_X];
transX = imageMatrix[Matrix.MTRANS_X];
试图在ImageView中获得一个图像的显示尺寸

Regis St-Gelais
Regis St-Gelais
发布于 2017-11-16
0 人赞同

感谢Quentis S.和Jacob Nordfalk提供的非常有用的例程。

我擅自将返回值从一个数组改为一个Rect对象。

* Returns the bitmap position inside an imageView. * @param imageView source ImageView * @return Rect position of the bitmap in the ImageView public static final Rect getBitmapPositionInsideImageView(ImageView imageView) Rect rect = new Rect(); if (imageView == null || imageView.getDrawable() == null) return rect; // Get image dimensions // Get image matrix values and place them in an array float[] f = new float[9]; imageView.getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = imageView.getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); // Get image position // We assume that the image is centered into ImageView int imgViewW = imageView.getWidth(); int imgViewH = imageView.getHeight(); rect.top = (int) (imgViewH - actH) / 2; rect.left = (int) (imgViewW - actW) / 2; rect.bottom = rect.top + actH; rect.right = rect.left + actW; return rect;
saci nassim
saci nassim
发布于 2017-11-16
0 人赞同

覆盖onLayout方法

    //inside puzzleView
    float[] matrix = new float[9];
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        matrix = getMatrix();
    public void getMatrix(){
         return matrix;
    private float[] getMatrix() {
        final float[] matrix = new float[9];
        getImageMatrix().getValues(matrix);
        return matrix;

并使用这个来获取数值

       // Extract the scale and translation values from the matrix.
       float scaleX = matrix[Matrix.MSCALE_X];
       float scaleY = matrix[Matrix.MSCALE_Y];