首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >移动动画时转换ImageView (保持比率)

移动动画时转换ImageView (保持比率)
EN

Stack Overflow用户
提问于 2014-08-06 12:52:30
回答 3查看 2K关注 0票数 2

我正在制作一个动画,一个视图同时移动并将其转换成另一种形式。

以下是动画描述:

我不知道怎么做。有什么解决办法吗?

如有任何建议,敬请见谅。

=================================================================

更新

我曾经尝试过TranslateAnimation + ScaleAnimation和AnimationSet,但是我的ImageView非常容易扩展。

下面是开始映像,使用centerCrop:

以下是翻译+ScaleAnimation的结果:

但这是我想要的结果(centerCrop与上面的src相同):

如何变换+移动而又保持这样的图像比率?我不想改变我的影像比率。

谢谢你帮忙。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-12 08:34:27

以下是您从这个答案中可以期待的结果:

还请注意,这里提供的代码是为测试目的编写的,因此没有进行优化。

我使用了Animator (可用于api >= 11)来实现您所描述的效果,因为我认为TranslateAnimationScaleAnimation在结果方面还不够好。

这里发生了三件事:

  • 宽度在变化
  • 高度在变化
  • 图像视图的'x‘值正在变化

您需要为这3个参数提供最终值: finalWidth、finalHeight和最终的X放置。

我们将使用valueAnimator获取每次更新时宽度和高度的动画值,然后使用这些值更新LayoutParams of ImageView

animate按钮(在上面的gif中)调用以下方法:

代码语言:javascript
运行
复制
public void animate() {
    // This is to get the screen dimensions
    final Point p = new Point();
    getWindowManager().getDefaultDisplay().getSize(p);

    // First, define the starting values

    final int startingWidth = mImageView.getWidth();
    final int startingHeight = mImageView.getHeight();
    final int startingXValue = mImageView.getX():

    // Next, define the final values

    // For this example, the final width will be half of screen-width
    final int finalWidth = p.x / 2;

    // Just an arbitrary final value for height. You will have to decide
    // what the final height should be
    final int finalHeight = p.y - ivv.getTop() - 300; 

    // final `X` placement of the imageview
    int finalXValue = p.x / 2 - finalWidth / 2;

    // ValueAnimator to generate changes in width
    final ValueAnimator vaW = ValueAnimator.ofInt(startingWidth, finalWidth);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            // Get animated width value update
            int newWidth = (int) vaW.getAnimatedValue();

            // Get and update LayoutParams from imageview
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.width = newWidth;
            mImageView.setLayoutParams(lp);
        }
    });

    // ValueAnimator to generate changes in height      
    final ValueAnimator vaH = ValueAnimator.ofInt(startingHeight, finalHeight);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            // Get animated height value update
            int newHeight = (int) vaH.getAnimatedValue();

            // Get and update LayoutParams from imageview
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.height = newHeight;
            mImageView.setLayoutParams(lp);
        }
    });

    // Used to provide translate animation
    ObjectAnimator oa = ObjectAnimator.ofFloat(
                                    mImageView, "X", startingXValue, 
                                              finalXValue);
    // To play these 3 animators together
    AnimatorSet as = new AnimatorSet();     
    as.playTogether(vaW, vaH, oa);
    as.setDuration(5000);

    as.start();
}

本例中用于活动的布局没有什么特殊之处:

代码语言:javascript
运行
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@android:color/holo_blue_dark" >

    <Button
        android:id="@+id/bAnimate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="animate"
        android:layout_gravity="center_horizontal" />

    <ImageView
        android:id="@+id/ivToAnimate"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="animate"
        android:layout_gravity="right"
        android:src="@drawable/index"
        android:scaleType="centerCrop" />

</LinearLayout>

ImageView's 编辑:重置的位置、大小和比例尺

将起始值和最终值声明为类变量:

代码语言:javascript
运行
复制
int startingWidth, startingHeight, startingXValue, 
                   finalWidth, finalHeight, finalXValue; 

// this method will only be called ONCE. 
// Use appropriate values to initialize starting and final values
public void initialize() {
    final Point p = new Point();
    getWindowManager().getDefaultDisplay().getSize(p);

    startingWidth = mImageView.getWidth();
    startingHeight = mImageView.getHeight();
    startingXValue = mImageView.getX():

    finalWidth = p.x / 2;
    finalHeight = p.y - ivv.getTop() - 300; 
    finalXValue = p.x / 2 - finalWidth / 2;
}

// Call this method whenever you need to animate forward
// `animate()` method // refer above for comments
public void animate() {
    final ValueAnimator vaW = ValueAnimator.ofInt(startingWidth, finalWidth);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int newWidth = (int) vaW.getAnimatedValue();
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.width = newWidth;
            mImageView.setLayoutParams(lp);
        }
    });

    final ValueAnimator vaH = ValueAnimator.ofInt(startingHeight, finalHeight);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int newHeight = (int) vaH.getAnimatedValue();
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.height = newHeight;
            mImageView.setLayoutParams(lp);
        }
    });

    ObjectAnimator oa = ObjectAnimator.ofFloat(
                                    mImageView, "X", startingXValue, 
                                              finalXValue);
    AnimatorSet as = new AnimatorSet();     
    as.playTogether(vaW, vaH, oa);
    as.setDuration(5000);
    as.start();
}

动画回放:

代码语言:javascript
运行
复制
// `animateBack()` method // similar execution to `animate()`
// Notice how the starting and final values have been switched
public void animateBack() {

    final ValueAnimator vaW = ValueAnimator.ofInt(finalWidth, startingWidth);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int newWidth = (int) vaW.getAnimatedValue();
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.width = newWidth;
            mImageView.setLayoutParams(lp);
        }
    });

    final ValueAnimator vaH = ValueAnimator.ofInt(finalHeight, startingHeight);

    vaW.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int newHeight = (int) vaH.getAnimatedValue();
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) 
                                                mImageView.getLayoutParams();
            lp.height = newHeight;
            mImageView.setLayoutParams(lp);
        }
    });

    ObjectAnimator oa = ObjectAnimator.ofFloat(
                                    mImageView, "X", finalXValue, startingXValue);
    AnimatorSet as = new AnimatorSet();     
    as.playTogether(vaW, vaH, oa);
    as.setDuration(5000);
    as.start();
}
票数 8
EN

Stack Overflow用户

发布于 2014-08-06 12:55:26

第一个链接是创建一组动画。第二个链接-动画翻译。第三个链接-用于缩放的动画。创建翻译和缩放动画,将它们添加到动画集中

AnimationSet

TranslateAnimation

ScaleAnimation

票数 1
EN

Stack Overflow用户

发布于 2014-08-12 07:33:16

要在ImageView中保持相同的比率,请尝试使用以下属性:

代码语言:javascript
运行
复制
<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerInside"
        android:src="@drawable/your_image" />
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25160946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档