知識
不管是網站,軟件還是小程序,都要直接或間接能為您產生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站成為營銷工具,讓軟件能切實提升企業(yè)內部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
中心打開效果
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數:26
效不雅圖:
如今給加大年夜分享一下打開Activity時中間打開的效不雅。
思路:
1.在設置打開目標Aitivity的時,先獲取當前Acitivty,設置瓜分的背景的坐標。
2.當目標Activity打開之前,根據瓜分的坐標,創(chuàng)建ImageView,高低兩部分,并且添加到目標Activity中。
3.最后設置高低兩部分IMageView的動畫,是他們一路開啟動畫。
4.當動畫停止后,要把目標Activity中的添加的兩個ImageView移除掉落。
下面經由過程代率攀來實現:
設置開啟目標Activity
public static void startActivity(Activity currActivity, Intent intent, int splitYCoord) { // 預備一個BItMap圖片,是當前的Activity界面作為的背景 prepare(currActivity, splitYCoord); currActivity.startActivity(intent); currActivity.overridePendingTransition(0, 0); }currActivity:當前的Activity
intent:開啟新的Activity的Intent
splitYCoord:想去瓜分Activity的縱坐標,-1表示平等的大年夜中心瓜分
在這個辦法里,最重要的功能獲取當前Acitivity界面作為一個Bitmap
private static void prepare(Activity currActivity, int splitYCoord) { // 獲取當前的Activity,作為一個BItMap View root = currActivity.getWindow().getDecorView() .findViewById(android.R.id.content); root.setDrawingCacheEnabled(true); mBitmap = root.getDrawingCache(); // If the split Y coordinate is -1 - We'll split the activity equally splitYCoord = (splitYCoord != -1 ? splitYCoord : mBitmap.getHeight() / 2); if (splitYCoord > mBitmap.getHeight()) throw new IllegalArgumentException("Split Y coordinate [" + splitYCoord + "] exceeds the activity's height [" + mBitmap.getHeight() + "]"); // 設置給兩個高低BitMap的坐標,是給目標Activity制造的動畫的ImageView供給的坐標 mLoc1 = new int[] { 0, splitYCoord, root.getTop() }; mLoc2 = new int[] { splitYCoord, mBitmap.getHeight(), root.getTop() }; }
主如果獲取當前的Activity的內容,生成一個BitMap,然后根據瓜分標記,把瓜分的高低兩部分ImageView的坐標劃攙扶來
在目標的Activity中oncreate()的Activity的onCreate()中的setContentView()前面調用預備動畫
public static void prepareAnimation(final Activity destActivity) { mTopImage = createImageView(destActivity, mBitmap, mLoc1); mBottomImage = createImageView(destActivity, mBitmap, mLoc2); }創(chuàng)建瓜分的ImageView,并且添加到目標Activity的窗體上
private static ImageView createImageView(Activity destActivity, Bitmap bmp, int loc[]) { MyImageView imageView = new MyImageView(destActivity); imageView.setImageBitmap(bmp); imageView.setImageOffsets(bmp.getWidth(), loc[0], loc[1]); WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(); windowParams.gravity = Gravity.TOP; windowParams.x = 0; windowParams.y = loc[2] + loc[0]; windowParams.height = loc[1] - loc[0]; windowParams.width = bmp.getWidth(); windowParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; windowParams.format = PixelFormat.TRANSLUCENT; windowParams.windowAnimations = 0; destActivity.getWindowManager().addView(imageView, windowParams); return imageView; }
public static void animate(final Activity destActivity, final int duration, final TimeInterpolator interpolator) { // Post this on the UI thread's message queue. It's needed for the items // to be already measured new Handler().post(new Runnable() { @Override public void run() { mSetAnim = new AnimatorSet(); mTopImage.setLayerType(View.LAYER_TYPE_HARDWARE, null); mBottomImage.setLayerType(View.LAYER_TYPE_HARDWARE, null); mSetAnim.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { clean(destActivity); } @Override public void onAnimationCancel(Animator animation) { clean(destActivity); } @Override public void onAnimationRepeat(Animator animation) { } }); // Animating the 2 parts away from each other Animator anim1 = ObjectAnimator.ofFloat(mTopImage, "translationY", mTopImage.getHeight() * -1); Animator anim2 = ObjectAnimator.ofFloat(mBottomImage, "translationY", mBottomImage.getHeight()); if (interpolator != null) { anim1.setInterpolator(interpolator); anim2.setInterpolator(interpolator); } mSetAnim.setDuration(duration); mSetAnim.playTogether(anim1, anim2); mSetAnim.start(); } }); }
當動畫停止,移除目標Activity的ImageView。
private static void clean(Activity activity) { if (mTopImage != null) { mTopImage.setLayerType(View.LAYER_TYPE_NONE, null); try { // If we use the regular removeView() we'll get a small UI // glitch activity.getWindowManager().removeViewImmediate(mBottomImage); } catch (Exception ignored) { } } if (mBottomImage != null) { mBottomImage.setLayerType(View.LAYER_TYPE_NONE, null); try { activity.getWindowManager().removeViewImmediate(mTopImage); } catch (Exception ignored) { } } mBitmap = null; }
履行次序:startActivity-->prepareAnimation----->animate
如不雅想給其他View設置中間打開效不雅,那么就按照這三步履行即可
應用步調:
我這是創(chuàng)建了一個BaseActivity,把預備動畫和開啟動畫放在了BaseAcitivity中
activity01.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/num1" android:gravity="center" android:text="我是美男一號" android:textColor="@android:color/holo_blue_light" android:textSize="30sp" /> </RelativeLayout>activity02.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/num2" android:gravity="center" android:text="我是不是很萌" android:textColor="@android:color/holo_green_dark" android:textSize="30sp" /> </RelativeLayout>activity03.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/bg3" android:gravity="center" android:text="風景是不是很美" android:textColor="@android:color/holo_orange_dark" android:textSize="30sp" /> </RelativeLayout>activity04.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yzk.centersplit.activity.Activity2" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@drawable/bg4" android:gravity="center" android:text="想不想擁有一個豪車" android:textColor="@android:color/holo_red_dark" android:textSize="30sp" /> </RelativeLayout>
BaseActivity.java
public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // 預備好動畫,創(chuàng)建了上一個Activity的以中心為線 ActivitySplitAnimationUtil.prepareAnimation(this); super.onCreate(savedInstanceState); // 開啟動畫 ActivitySplitAnimationUtil.animate(this, 2000); } }
Activity1.java
public class Activity1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity01); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 此時就會把當前的activity作為中心瓜分動畫的背景了 ActivitySplitAnimationUtil.startActivity(Activity1.this, new Intent(Activity1.this, Activity2.class)); } }); } }Activity2.java
public class Activity2 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity02); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ActivitySplitAnimationUtil.startActivity(Activity2.this, new Intent(Activity2.this, Activity3.class)); } }); } }Activity3.java
public class Activity3 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity03); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ActivitySplitAnimationUtil.startActivity(Activity3.this, new Intent(Activity3.this, Activity4.class)); } }); } }Activity4.java
public class Activity4 extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity04); } }
源碼下載:http://download.csdn.net/detail/forwardyzk/8332101
如不雅效不雅圖看不到,請應用360安然瀏覽器查看。不知道為什么在谷歌瀏覽器上gif圖片顯示不出來。
知道如何解決的請給你建議。
[img]http://img.blog.csdn.net/20150106144714639
private static class MyImageView extends ImageView { private Rect mSrcRect; private Rect mDstRect; private Paint mPaint; public MyImageView(Context context) { super(context); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); } /** * Setting the bitmap offests to control the visible area * * @param width * The bitmap image * @param bmp * The start Y position * @param loc * The end Y position * @return */ public void setImageOffsets(int width, int startY, int endY) { mSrcRect = new Rect(0, startY, width, endY); mDstRect = new Rect(0, 0, width, endY - startY); } @Override protected void onDraw(Canvas canvas) { Bitmap bm = null; Drawable drawable = getDrawable(); if (null != drawable && drawable instanceof BitmapDrawable) { bm = ((BitmapDrawable) drawable).getBitmap(); } if (null == bm) { super.onDraw(canvas); } else { canvas.drawBitmap(bm, mSrcRect, mDstRect, mPaint); } } }開啟動畫