Android 中的轉場動畫及相容處理

dead_lee發表於2021-09-09

Android 中的動畫有很多,除了在一個介面上使用幀動畫、屬性動畫將一個或多個 View 進行動畫處理以外,還可以用於兩個介面之間過渡、跳轉。在 Android 5.0 之前,我們已經有了 overridePendingTransition() 方法來實現一些轉場效果。然而,在 Android 5.0 以後,轉場效果更加炫酷。 比如下面的動畫:

圖片描述

本篇文章,主要就是解說如何實現上述的效果。主要內容包括:

  • Android 5.0+ 的轉場動畫

  • Android 4.X 模擬實現 Android 5.0+ 轉場效果。

 來檢視。
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部落格 ” ,連結:http://blog.itpub.net/4686/viewspace-2812654/,如需轉載,請註明出處,否則將追究法律責任。

相關文章