Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将图像从拇指缩放到中心_Android_Image_Zooming - Fatal编程技术网

Android将图像从拇指缩放到中心

Android将图像从拇指缩放到中心,android,image,zooming,Android,Image,Zooming,我按照下面的教程在Android中从thumb缩放图像 除了我希望缩放后的图像在视图中居中并具有最大大小(而不是像教程中那样填充父对象或匹配父对象)之外,一切都很好。我有相同的代码,但我的XML在尝试将图像居中时有所不同,但它不起作用。有什么问题 <FrameLayout..... <RelativeLayout android:id="@+id/te" android:layout_width="fill_parent" android:layout_hei

我按照下面的教程在Android中从thumb缩放图像

除了我希望缩放后的图像在视图中居中并具有最大大小(而不是像教程中那样填充父对象或匹配父对象)之外,一切都很好。我有相同的代码,但我的XML在尝试将图像居中时有所不同,但它不起作用。有什么问题

<FrameLayout.....
<RelativeLayout
    android:id="@+id/te"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView
        android:id="@+id/memory_expanded_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxHeight="150dp"
        android:maxWidth="150dp"
        android:adjustViewBounds="true"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:scaleType="fitCenter"
        android:visibility="invisible"
        android:contentDescription="@string/description_zoom_touch_close" />

</RelativeLayout>
</FrameLayout>

您需要修改
最终边界
,以匹配图像的实际大小。像这样的

int imageHeight = expandedImageView.getHeight();
int imageWidth = expandedImageView.getWidth();
int horizontalMargin = 0,  verticalMargin = 0;
if (imageHeight < finalBounds.height()) {
    verticalMargin = (finalBounds.height() / 2) - (imageHeight / 2);
}
if (imageWidth < finalBounds.width()) {
    horizontalMargin = (finalBounds.width() / 2) - (imageWidth / 2);
}
finalBounds.set(finalBounds.left + horizontalMargin, finalBounds.top + verticalMargin, finalBounds.right - horizontalMargin, finalBounds.bottom - verticalMargin);
int-imageHeight=expandedImageView.getHeight();
int imageWidth=expandedImageView.getWidth();
int水平边距=0,垂直边距=0;
if(imageHeight
完整代码:

布局:

<Framelayout
...
...
<ImageView
   android:id="@+id/memory_expanded_image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:contentDescription="@string/description_zoom_touch_close"
   android:visibility="invisible"/>

我尝试了这段代码(修改最终边界)。现在,缩放后的图像不在右上角(在OP案例中也是如此),但也不在视图的中心。它位于容器视图中心的下方和右侧。您是否也更改了xml?请检查答案。您能指出,在这个XML中什么是重要的吗?是“换行内容”吗?因为我设置了layout\u width和layout\u height id dp,这可能是个问题吗?是的。
layout\u width
layout\u height
应该是换行内容。并删除maxHeight、maxwidth、adjustViewBounds、layout\u centerInParent、gravity、scaleType属性
<Framelayout
...
...
<ImageView
   android:id="@+id/memory_expanded_image"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:contentDescription="@string/description_zoom_touch_close"
   android:visibility="invisible"/>
private void zoomImageFromThumb(final View thumbView, int imageResId) {
        // If there's an animation in progress, cancel it immediately and proceed with this one.
        if (mCurrentAnimator != null) {
            mCurrentAnimator.cancel();
        }

        // Load the high-resolution "zoomed-in" image.
        final ImageView expandedImageView = (ImageView) findViewById(R.id.memory_expanded_image);
        expandedImageView.setImageResource(imageResId);

        // Calculate the starting and ending bounds for the zoomed-in image. This step
        // involves lots of math. Yay, math.
        final Rect startBounds = new Rect();
        final Rect finalBounds = new Rect();
        final Point globalOffset = new Point();

        // The start bounds are the global visible rectangle of the thumbnail, and the
        // final bounds are the global visible rectangle of the container view. Also
        // set the container view's offset as the origin for the bounds, since that's
        // the origin for the positioning animation properties (X, Y).
        thumbView.getGlobalVisibleRect(startBounds);
        findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffset);
        startBounds.offset(-globalOffset.x, -globalOffset.y);
        finalBounds.offset(-globalOffset.x, -globalOffset.y);

        //modify the final rect to match actual size of the image
        int imageHeight = expandedImageView.getHeight();
        int imageWidth = expandedImageView.getWidth();
        int horizontalMargin = 0,  verticalMargin = 0;
        if (imageHeight < finalBounds.height()) {
            verticalMargin = (finalBounds.height() / 2) - (imageHeight / 2);
        }
        if (imageWidth < finalBounds.width()) {
            horizontalMargin = (finalBounds.width() / 2) - (imageWidth / 2);
        }
        finalBounds.set(finalBounds.left + horizontalMargin, finalBounds.top + verticalMargin, finalBounds.right - horizontalMargin, finalBounds.bottom - verticalMargin);


        // Adjust the start bounds to be the same aspect ratio as the final bounds using the
        // "center crop" technique. This prevents undesirable stretching during the animation.
        // Also calculate the start scaling factor (the end scaling factor is always 1.0).
        float startScale;
        if ((float) finalBounds.width() / finalBounds.height()
                > (float) startBounds.width() / startBounds.height()) {
            // Extend start bounds horizontally
            startScale = (float) startBounds.height() / finalBounds.height();
            float startWidth = startScale * finalBounds.width();
            float deltaWidth = (startWidth - startBounds.width()) / 2;
            startBounds.left -= deltaWidth;
            startBounds.right += deltaWidth;
        } else {
            // Extend start bounds vertically
            startScale = (float) startBounds.width() / finalBounds.width();
            float startHeight = startScale * finalBounds.height();
            float deltaHeight = (startHeight - startBounds.height()) / 2;
            startBounds.top -= deltaHeight;
            startBounds.bottom += deltaHeight;
        }

        // Hide the thumbnail and show the zoomed-in view. When the animation begins,
        // it will position the zoomed-in view in the place of the thumbnail.
        thumbView.setAlpha(0f);
        expandedImageView.setVisibility(View.VISIBLE);

        // Set the pivot point for SCALE_X and SCALE_Y transformations to the top-left corner of
        // the zoomed-in view (the default is the center of the view).
        expandedImageView.setPivotX(0f);
        expandedImageView.setPivotY(0f);

        // Construct and run the parallel animation of the four translation and scale properties
        // (X, Y, SCALE_X, and SCALE_Y).
        AnimatorSet set = new AnimatorSet();
        set
                .play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left,
                        finalBounds.left))
                .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top,
                        finalBounds.top))
                .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f))
                .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f));
        set.setDuration(mShortAnimationDuration);
        set.setInterpolator(new DecelerateInterpolator());
        set.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mCurrentAnimator = null;
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                mCurrentAnimator = null;
            }
        });
        set.start();
        mCurrentAnimator = set;

        // Upon clicking the zoomed-in image, it should zoom back down to the original bounds
        // and show the thumbnail instead of the expanded image.
        final float startScaleFinal = startScale;
        expandedImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mCurrentAnimator != null) {
                    mCurrentAnimator.cancel();
                }

                // Animate the four positioning/sizing properties in parallel, back to their
                // original values.
                AnimatorSet set = new AnimatorSet();
                set
                        .play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left))
                        .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top))
                        .with(ObjectAnimator
                                .ofFloat(expandedImageView, View.SCALE_X, startScaleFinal))
                        .with(ObjectAnimator
                                .ofFloat(expandedImageView, View.SCALE_Y, startScaleFinal));
                set.setDuration(mShortAnimationDuration);
                set.setInterpolator(new DecelerateInterpolator());
                set.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        thumbView.setAlpha(1f);
                        expandedImageView.setVisibility(View.GONE);
                        mCurrentAnimator = null;
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                        thumbView.setAlpha(1f);
                        expandedImageView.setVisibility(View.GONE);
                        mCurrentAnimator = null;
                    }
                });
                set.start();
                mCurrentAnimator = set;
            }
        });
    }