2

我正在尝试从 Android 中的中心点放大位图以实现缩放效果,但没有成功。我的代码是:

float scaleWidth = ((float) width + (i * 5)) / width;
float scaleHeight = ((float) height + (i * 5)) / height;

Matrix matrix = new Matrix();
matrix.setScale(scaleWidth, scaleHeight, scaleWidth / 2, scaleHeight / 2);
Bitmap rescaledBitmap = Bitmap.createBitmap(src, 0, 0, width, height, matrix, true);

result.add(rescaledBitmap);

我通过将尺寸除以 2 来设置枢轴点,但效果只是图像从 0、0 作为坐标而不是从中心缩放。我想要的是图像是固定大小,但从其中心点按比例放大(从而裁剪图像)。

4

3 回答 3

3

我将提供使用属性动画师的替代解决方案,因为我认为这是一个更清洁的解决方案。

SomeLayout.xml (这里的关键是 ViewGroup 与 View 大小相同,因此它会按照您的要求进行剪辑(如 google maps 放大))

<FrameLayout
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_gravity="center">
    <View
    android:id="@+id/zoom"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@drawable/myCoolImage"
    />
</FrameLayout>

代码:(1、2、1 将以 1x 的比例开始,然后是 2x,然后回到 1x,它需要一个值列表)

final View view = findViewById(R.id.zoom);
view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.SCALE_X, 1, 2, 1)
                    .ofFloat(view, View.SCALE_Y, 1, 2, 1)
                    .setDuration(5000);
            animator.setInterpolator(new AccelerateDecelerateInterpolator());
            animator.start();
        }
    });

因此,使用此版本图像,如果您有缩放 + 和缩放 - 带有 onClickListeners 的视图,您基本上可以模拟受控缩放,只要您知道要缩放的值。

同样如前所述,与内部视图大小相同的 ViewGroup 将强制动画剪辑到其父边界,而不是完全可见。

参考:

谷歌 Android ObjectAnimator

于 2014-05-10T05:03:27.657 回答
1

当然这会迟到,但对于所有照顾我的人来说:

double scaleFactor = 0.75; // Set this to the zoom factor
int widthOffset = (int) ((1 - scaleFactor)/2 * bmp.getWidth());
int heightOffset = (int) ((1 - scaleFactor)/2 * bmp.getHeight());
int numWidthPixels = bmp.getWidth() - 2 * widthOffset;
int numHeightPixels = bmp.getHeight() - 2 * heightOffset;
Bitmap rescaledBitmap = Bitmap.createBitmap(bmp, widthOffset, heightOffset, numWidthPixels, numHeightPixels, null, true);

此示例将放大位图的中心,放大倍数为 25%。

于 2019-02-15T10:00:30.150 回答
0

createBitmap 中的第二个和第三个参数采用左上角的 x/y 坐标。您发送的是 0,0,所以如果我理解正确...

图像已正确缩放,但图像未居中,对吗?

要使其居中,您需要找到左上角的正确 (x,y) 点。这应该是原始宽度/高度的 1/4。

所以...

Bitmap rescaledBitmap = Bitmap.createBitmap(src, (width/2), (height/2), width, height, matrix, true);

应该管用。

于 2013-09-25T14:31:12.317 回答