Browse Source

activity转场(取消activity之间的动画,截图传给下一个activity再动画,有局限性)

LAPTOP-K69FCNBP\crius 2 years ago
parent
commit
06b0f64dbf

+ 7 - 1
app/src/main/AndroidManifest.xml

@@ -9,7 +9,13 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme">
+        android:theme="@style/AppTheme.NoActionBar">
+        <activity
+            android:name=".Transition2Activity"
+            android:exported="false" />
+        <activity
+            android:name=".TransitionActivity"
+            android:exported="false" />
         <activity
             android:name=".MainActivity"
             android:label="@string/app_name"

+ 13 - 3
app/src/main/java/com/yxf/clippathlayout/sample/MainActivity.java

@@ -1,5 +1,9 @@
 package com.yxf.clippathlayout.sample;
 
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
 import android.os.Bundle;
 import android.support.design.widget.NavigationView;
 import android.support.v4.app.Fragment;
@@ -10,17 +14,18 @@ import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
+import android.util.DisplayMetrics;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.WindowManager;
 
 import com.yxf.clippathlayout.pathgenerator.AnimTransition;
-import com.yxf.clippathlayout.pathgenerator.CirclePathGenerator;
-import com.yxf.clippathlayout.pathgenerator.OvalPathGenerator;
-import com.yxf.clippathlayout.pathgenerator.RhombusPathGenerator;
 import com.yxf.clippathlayout.transition.TransitionAdapter;
 import com.yxf.clippathlayout.transition.TransitionFragmentContainer;
 import com.yxf.clippathlayout.transition.generator.RandomTransitionPathGenerator;
 
+import java.io.ByteArrayOutputStream;
 import java.lang.ref.WeakReference;
 
 public class MainActivity extends AppCompatActivity
@@ -117,6 +122,8 @@ public class MainActivity extends AppCompatActivity
     }
 
 
+
+
     @SuppressWarnings("StatementWithEmptyBody")
     @Override
     public boolean onNavigationItemSelected(MenuItem item) {
@@ -135,6 +142,9 @@ public class MainActivity extends AppCompatActivity
             switchFragment(new ViewTransitionFragment());
         } else if (id == R.id.nav_scroll_transition) {
             switchFragment(new ScrollTransitionFragment());
+        } else if (id == R.id.nav_activity) {
+            Intent intent = new Intent(MainActivity.this, Transition2Activity.class);
+            startActivity(intent);
         }
 
         DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

+ 67 - 0
app/src/main/java/com/yxf/clippathlayout/sample/Transition2Activity.java

@@ -0,0 +1,67 @@
+package com.yxf.clippathlayout.sample;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+
+import java.io.ByteArrayOutputStream;
+
+public class Transition2Activity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_transition2);
+        Button btnTransition = findViewById(R.id.btn_transition);
+        btnTransition.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Bitmap screenshots = activityShot(Transition2Activity.this);
+                Intent intent = new Intent(Transition2Activity.this, TransitionActivity.class);
+                ByteArrayOutputStream bs = new ByteArrayOutputStream();
+                screenshots.compress(Bitmap.CompressFormat.JPEG, 100, bs);
+                byte[] bitmapByte = bs.toByteArray();
+                intent.putExtra("bitmap", bitmapByte);
+                startActivity(intent);
+                overridePendingTransition(0, 0);
+            }
+        });
+    }
+    /**
+     * Activity screenCap
+     *
+     * @param activity
+     * @return
+     */
+    public static Bitmap activityShot(Activity activity) {
+        /*获取windows中最顶层的view*/
+        View view = activity.getWindow().getDecorView();
+        //允许当前窗口保存缓存信息
+        view.setDrawingCacheEnabled(true);
+        view.buildDrawingCache();
+        //获取状态栏高度
+        Rect rect = new Rect();
+        view.getWindowVisibleDisplayFrame(rect);
+        int statusBarHeight = rect.top;
+        WindowManager windowManager = activity.getWindowManager();
+        //获取屏幕宽和高
+        DisplayMetrics outMetrics = new DisplayMetrics();
+        windowManager.getDefaultDisplay().getMetrics(outMetrics);
+        int width = outMetrics.widthPixels;
+        int height = outMetrics.heightPixels;
+        //去掉状态栏
+        Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeight, width,
+                height-statusBarHeight);
+        //销毁缓存信息
+        view.destroyDrawingCache();
+        view.setDrawingCacheEnabled(false);
+        return bitmap;
+    }
+}

+ 38 - 0
app/src/main/java/com/yxf/clippathlayout/sample/TransitionActivity.java

@@ -0,0 +1,38 @@
+package com.yxf.clippathlayout.sample;
+
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.yxf.clippathlayout.pathgenerator.AnimTransition;
+import com.yxf.clippathlayout.transition.TransitionAdapter;
+import com.yxf.clippathlayout.transition.TransitionFrameLayout;
+import com.yxf.clippathlayout.transition.generator.RandomTransitionPathGenerator;
+
+public class TransitionActivity extends AppCompatActivity {
+
+    TransitionFrameLayout mLayout;
+    View mRedView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_transition);
+        Intent intent = this.getIntent();
+        ImageView iv = findViewById(R.id.iv);
+        byte[] byteTemp = intent.getByteArrayExtra("bitmap");
+        Bitmap bitmap = BitmapFactory.decodeByteArray(byteTemp, 0, byteTemp.length);
+        iv.setImageBitmap(bitmap);
+        mLayout = findViewById(R.id.transition_layout);
+        RandomTransitionPathGenerator generator =
+                new RandomTransitionPathGenerator(new AnimTransition());
+        mLayout.setAdapter(new TransitionAdapter(generator));
+        mRedView = findViewById(R.id.red_view);
+        TransitionAdapter adapter = mLayout.switchView(mRedView);
+        adapter.animate();
+    }
+}

+ 15 - 0
app/src/main/res/anim/screen_zoom_in.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+    android:interpolator="@android:anim/accelerate_interpolator">
+    <scale
+        android:duration="400"
+        android:fromAlpha="0.0"
+        android:fromXScale="1.4"
+        android:fromYScale="1.4"
+        android:pivotX="40%p"
+        android:pivotY="40%p"
+        android:toAlpha="1.0"
+        android:toXScale="1.0"
+        android:toYScale="1.0" />
+
+</set>

+ 24 - 0
app/src/main/res/layout/activity_transition.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.yxf.clippathlayout.transition.TransitionFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/transition_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".TransitionActivity">
+
+    <TextView
+        android:id="@+id/red_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#88ff0000"
+        android:gravity="center"
+        android:text="红色界面"
+        android:textSize="30sp" />
+    <ImageView
+        android:id="@+id/iv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="fitXY" />
+
+</com.yxf.clippathlayout.transition.TransitionFrameLayout>

+ 17 - 0
app/src/main/res/layout/activity_transition2.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#00ff00"
+    android:gravity="center"
+    tools:context=".Transition2Activity">
+
+    <Button
+        android:id="@+id/btn_transition"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="跳转动画"/>
+
+</LinearLayout>

+ 4 - 0
app/src/main/res/menu/activity_main_drawer.xml

@@ -28,5 +28,9 @@
             android:id="@+id/nav_scroll_transition"
             android:icon="@drawable/ic_menu_gallery"
             android:title="滚动切换" />
+        <item
+            android:id="@+id/nav_activity"
+            android:icon="@drawable/ic_menu_gallery"
+            android:title="跳转activity" />
     </group>
 </menu>

+ 2 - 1
clippathlayout/src/main/java/com/yxf/clippathlayout/transition/TransitionAdapter.java

@@ -9,6 +9,7 @@ import android.graphics.Rect;
 import android.view.View;
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
 
 import com.yxf.clippathlayout.Utils;
 import com.yxf.clippathlayout.pathgenerator.PathGenerator;
@@ -26,7 +27,7 @@ public class TransitionAdapter implements PathGenerator, ProgressController {
 
     private int mDefaultDuration = DEFAULT_ANIMATOR_DURATION;
 
-    private Interpolator mDefaultInterpolator = new AccelerateInterpolator();
+    private Interpolator mDefaultInterpolator = new LinearInterpolator();  // 插值器,匀速
 
     private PathGenerator mPathGenerator;
     private TransitionLayout mTransitionLayout;