Android过渡动画之共享元素实现以及遇到的一些问题

下面是我实现的共享元素demo

1、在第一个界面为需要共享的view添加属性
android:transitionName=”transitionImg”

        <ImageView
            android:id="@+id/item_image"
            android:layout_width="100dp"
            android:layout_height="140dp"
            android:layout_margin="10dp"
            android:scaleType="centerCrop"
            android:transitionName="transitionImg"/>

2、在第二个界面为需要共享的view添加属性
android:transitionName=”transitionImg”

<ImageView
     android:id="@+id/detail_pic"
     android:transitionName="transitionImg"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:scaleType="centerCrop"/>

注意,这里的属性名字需要一致

3、在第一个界面添加跳转

if (android.os.Build.VERSION.SDK_INT > 20) {
                    mThis.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mThis, imgView, "transitionImg").toBundle());
                } else {
                    mThis.startActivity(intent);
                }

这样就实现了如上效果,但是如果需要创建多个共享元素,代码如下:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,  
        Pair.create(view1, "agreedName1"),  
        Pair.create(view2, "agreedName2")); 

注意的问题
我在做项目的时候,比如上图中的图片,都是需要从网络获取的,两个界面虽然都是一张图片,但是却加载了2次,这个导致了一个问题,大家请看效果
Android过渡动画之共享元素实现以及遇到的一些问题_第1张图片

问题出在哪里呢?我估计是出在缓存这块,因为用了一张本地的图片,加载效果就是好的。

所以我在每次点击的时候,将图片保存了下来,在第二个界面的时候再取出来,确保图片是同一张。

图片保存代码:

public static void SaveBitmap(Bitmap bitmap) {
        try {
            LogCat.i("SaveBitmap");
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File saveFile = new File(sdCardDir + File.separator + NAME, IMG_NAME);
                if (!saveFile.getParentFile().exists()) {
                    saveFile.getParentFile().mkdirs();
                }

                FileOutputStream outStream = new FileOutputStream(saveFile);
                //第二个参数影响的是图片的质量,但是图片的宽度与高度是不会受影响滴
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                outStream.flush();
                outStream.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

但是在保存图片的时候我又遇到了一些问题,我获取保存的bitmap的时候查了网上的一个方法:

imageview.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(imageview.getDrawingCache());

却发现取出来的图片比原来的模糊,后来换了个方法

Bitmap bm = ((BitmapDrawable)imgView.getDrawable()).getBitmap();

这样就好了。

你可能感兴趣的:(【Android动画】)