• 缩放视图


    一、创建视图

    创建一个布局文件,在布局文件中要包含一个用来显示缩略图,一个用来显示放大图的视图。在接下来的例子中我们创建了ImageButton和ImageView,分别用来显示缩略图,和放大后的图片。

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="16dp">
    
            <ImageButton
                android:id="@+id/thumb_button_1"
                android:layout_width="100dp"
                android:layout_height="75dp"
                android:layout_marginRight="1dp"
                android:src="@drawable/thumb1"
                android:scaleType="centerCrop"
                android:contentDescription="@string/description_image_1" />
    
        </LinearLayout>
    
        <!-- This initially-hidden ImageView will hold the expanded/zoomed version of
             the images above. Without transformations applied, it takes up the entire
             screen. To achieve the "zoom" animation, this view's bounds are animated
             from the bounds of the thumbnail button above, to its final laid-out
             bounds.
             -->
    
        <ImageView
            android:id="@+id/expanded_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="invisible"
            android:contentDescription="@string/description_zoom_touch_close" />
    
    </FrameLayout>
    二、设置缩放动画

    完成布局的设计之后,我们需要使用事件处理程序来触发我们的缩放动画。下面的例子中在ImageButton中设置了点击事件的监听器,当监听用户点击图片按钮时,会触发执行我们的缩放动画。

    public class ZoomActivity extends FragmentActivity {
    
        private Animator mCurrentAnimator;
    
        // 获取全局坐标系的一个视图区域,返回一个填充的Rect对象;该Rect是基于整个屏幕的
    
    private int mShortAnimationDuration; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_zoom); final View thumb1View = findViewById(R.id.thumb_button_1); thumb1View.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { zoomImageFromThumb(thumb1View, R.drawable.image1); } }); mShortAnimationDuration = getResources().getInteger( android.R.integer.config_shortAnimTime); } ...}
    三、缩放视图

    一般来说,有需求需要我们对一个正常视图进行缩放的时候,我们需要把视图从正常尺寸进行放大。具体步骤如下:

    1.给隐藏的ImageVIew指定高分辨率的图片。下面的案例中只是单纯的在UI线程中加载了一个很大的图片资源,或许你更倾向于在子线程中来加载图片以防阻塞UI线程。在理想的情况下我们不应该让图片的尺寸大于屏幕尺寸。

    2.为ImageView计算好动画开始和结束的边界值。

    3.设置放大动画的属性

    4.设置缩小动画的属性

    private void zoomImageFromThumb(final View thumbView, int imageResId) {
    
        if (mCurrentAnimator != null) {
            mCurrentAnimator.cancel();
        }
    
    
        final ImageView expandedImageView = (ImageView) findViewById(
                R.id.expanded_image);
        expandedImageView.setImageResource(imageResId);
    
        final Rect startBounds = new Rect();
        final Rect finalBounds = new Rect();
        final Point globalOffset = new Point();
    
    
        thumbView.getGlobalVisibleRect(startBounds);
        findViewById(R.id.container)
                .getGlobalVisibleRect(finalBounds, globalOffset);
        startBounds.offset(-globalOffset.x, -globalOffset.y);
        finalBounds.offset(-globalOffset.x, -globalOffset.y);
    
    
        float startScale;
        if ((float) finalBounds.width() / finalBounds.height()
                > (float) startBounds.width() / startBounds.height()) {
    
            startScale = (float) startBounds.height() / finalBounds.height();
            float startWidth = startScale * finalBounds.width();
            float deltaWidth = (startWidth - startBounds.width()) / 2;
            startBounds.left -= deltaWidth;
            startBounds.right += deltaWidth;
        } else {
    
            startScale = (float) startBounds.width() / finalBounds.width();
            float startHeight = startScale * finalBounds.height();
            float deltaHeight = (startHeight - startBounds.height()) / 2;
            startBounds.top -= deltaHeight;
            startBounds.bottom += deltaHeight;
        }
    
    
        thumbView.setAlpha(0f);
        expandedImageView.setVisibility(View.VISIBLE);
    
    
        expandedImageView.setPivotX(0f);
        expandedImageView.setPivotY(0f);
    
    
        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;
    
    
        final float startScaleFinal = startScale;
        expandedImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mCurrentAnimator != null) {
                    mCurrentAnimator.cancel();
                }
    
    
                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;
            }
        });
    }
    具体案例已经上传至CSDN,地址:点击打开链接









  • 相关阅读:
    非确定的自动机NFA确定化为DFA--作业8
    正规式到正规文法与自动机--作业7
    正规文法与正规式--作业六
    词法分析程序的设计与实现--作业五
    文法和语文总结与梳理--作业4
    语法树,短语,直接短语,句柄--作业
    文法和语言--作业
    作业-编译原理概述
    js实现线性结构转树形结构(生成无限层级菜单)
    基于PriorityQueue(优先队列)解决TOP-K问题
  • 原文地址:https://www.cnblogs.com/bill-technology/p/4130847.html
Copyright © 2020-2023  润新知