使用缩放动画

时间:2018-06-02 00:20:27

标签: java android

如果您愿意,我会在Android的开发者页面中引用建议的解决方案解决方案是如何在您单击它时放大图像但是在应用它之后以及当我单击图像时应用程序关闭并给我一个错误发生这是错误跟踪器的图片任何人都可以帮我解决问题

https://developer.android.com/training/animation/zoom

我在添加文件xml和java

后重新提交了这个问题

包含100张可供查看的图像的XML文件样本

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/photo_1"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_margin="@dimen/fab_margin"
            android:layout_weight="1"
            android:src="@drawable/allah_jl_jlalh"
            app:civ_border_color="@color/colorAccent"
            app:civ_border_width="3dp"
            tools:ignore="RtlHardcoded" />

        <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/photo_2"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_margin="@dimen/fab_margin"
            android:layout_weight="1"
            android:src="@drawable/alrahman"
            app:civ_border_color="@color/colorAccent"
            app:civ_border_width="3dp"
            tools:ignore="RtlHardcoded" />

        <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/photo_3"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_margin="@dimen/fab_margin"
            android:layout_weight="1"
            android:src="@drawable/alrahem"
            app:civ_border_color="@color/colorAccent"
            app:civ_border_width="3dp"
            tools:ignore="RtlHardcoded" />

    </LinearLayout>
<ImageView
        android:id="@+id/expanded_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible" />

java文件:

public class Athkar7 extends AppCompatActivity {
private Animator mCurrentAnimator;

private int mShortAnimationDuration;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_athkar7 );

    final CircleImageView thumb1View = (CircleImageView) findViewById( R.id.photo_1 );
    thumb1View.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            zoomImageFromThumb( thumb1View,R.drawable.alrahman );
        }
    } );

    // Retrieve and cache the system's default "short" animation time.
    mShortAnimationDuration = getResources().getInteger(
            android.R.integer.config_shortAnimTime );
}
public 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.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 );

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

enter image description here

此代码适用于您在单个活动中设置以供查看的100张图像 在这里,我有另一个问题,当我通过应用程序滑块突然退出活动并返回到MainActivity时,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

使用此library解决您的问题。