ITPub博客

首页 > IT职业 > IT职场 > Android 中的转场动画及兼容处理

Android 中的转场动画及兼容处理

IT职场 作者:dead_lee 时间:2021-09-09 09:48:10 0 删除 编辑

Android 中的动画有很多,除了在一个界面上使用帧动画、属性动画将一个或多个 View 进行动画处理以外,还可以用于两个界面之间过渡、跳转。在 Android 5.0 之前,我们已经有了 overridePendingTransition() 方法来实现一些转场效果。然而,在 Android 5.0 以后,转场效果更加炫酷。 比如下面的动画:

图片描述

本篇文章,主要就是解说如何实现上述的效果。主要内容包括:

  • Android 5.0+ 的转场动画

  • Android 4.X 模拟实现 Android 5.0+ 转场效果。

Demo 来查看。
private void initial() {    // 获取上一个界面传入的信息
    mRect = getIntent().getSourceBounds();
    mRescourceId = getIntent().getExtras().getInt(EXTRA_IMAGE);    // 获取上一个界面中,图片的宽度和高度
    mOriginWidth = mRect.right - mRect.left;
    mOriginHeight = mRect.bottom - mRect.top;    // 设置 ImageView 的位置,使其和上一个界面中图片的位置重合
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mOriginWidth, mOriginHeight);
    params.setMargins(mRect.left, mRect.top - getStatusBarHeight(), mRect.right, mRect.bottom);
    mImageView.setLayoutParams(params);    // 设置 ImageView 的图片和缩放类型
    mImageView.setImageResource(mRescourceId);
    mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);    // 根据上一个界面传入的图片资源 ID,获取图片的 Bitmap 对象。
    BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(mRescourceId);
    Bitmap bitmap = bitmapDrawable.getBitmap();    // 计算图片缩放比例和位移距离
    getBundleInfo(bitmap);    // 创建一个 Pallette 对象
    mImagePalette = Palette.from(bitmap).generate();    // 使用 Palette 设置背景颜色
    mContainer.setBackgroundColor(
            mImagePalette.getVibrantColor(ContextCompat.getColor(this, android.R.color.black)));
}

在12行,通过设置 Margin 的形式来确定图片的位置,需要注意的是,由于状态栏是在父控件 FramLayout 之外的,因此我们要将 Rect.top 的值减去状态栏的高度,这样才是相对于屏幕的绝对位置。然后,getBundleInfo() 方法的代码如下:

private void getBundleInfo(Bitmap bitmap) {    // 计算图片缩放比例,并存储在 bundle 中
    if (bitmap.getWidth() >= bitmap.getHeight()) {
        mScaleBundle.putFloat(SCALE_WIDTH, (float) mScreenWidth / mOriginWidth);
        mScaleBundle.putFloat(SCALE_HEIGHT, (float) bitmap.getHeight() / mOriginHeight);
    } else {
        mScaleBundle.putFloat(SCALE_WIDTH, (float) bitmap.getWidth() / mOriginWidth);
        mScaleBundle.putFloat(SCALE_HEIGHT, (float) mScreenHeight / mOriginHeight);
    }    // 计算位移距离,并将数据存储到 bundle 中
    mTransitionBundle.putFloat(TRANSITION_X, mScreenWidth / 2 - (mRect.left + (mRect.right - mRect.left) / 2));
    mTransitionBundle.putFloat(TRANSITION_Y, mScreenHeight / 2 - (mRect.top + (mRect.bottom - mRect.top) / 2));
}

http://www.apkbus.com/blog-856294-76889.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4686/viewspace-2812654/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-06-25

  • 博文量
    82
  • 访问量
    15430