activity-啟動動畫的設定(下面彈出出現,彈入下面消失)


1.今天為了把一個activity以dialog的形式顯示,而且實現從開始的時候從底部往上彈出,結束的時候,從上往下消失,做了如下的工作。

1)如果把一個activity以dialog的形式顯示?

這個只需要設置theme的樣式為*.dialog就行了,如下 在AndroidManifest.xml設置屬性

        <activity android:name=".ui.EditSlideDurationActivity"
            android:label="@string/change_duration_activity"
            android:theme="@style/Mms.Theme.Edit.Dialog">
        </activity>

 

Mms.Theme.Edit.Dialog   是在funui_style.xml中定義的一個style

    <style name="Mms.Theme.Edit.Dialog" parent="@android:style/Theme.Funui.Dialog">
    </style>

2) 這個就能實現它以dialog的樣式實現了,但是這時候你會發現,它是顯示在屏幕的中央,而且是一個小方塊,並不會充滿這個屏幕的寬度,這時候還需要進行如下的操作,就是在這個activity中設置顯示的位置,而在這個activity的xml中設置寬度

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="360dp"
    android:layout_height="165dp"
    android:orientation="vertical" >

 

其實,還有兩外一個方法,就是在代碼里面進行設定,如下

import android.view.Window;
import android.view.WindowManager;
//在oncreate里添加如下代碼
       Window w = getWindow();
       WindowManager.LayoutParams attrs = w.getAttributes();
       attrs.width = WindowManager.LayoutParams.MATCH_PARENT;
       w.setAttributes(attrs);

 注意:上面的代碼,必須用在dialog 創建完成以后,如下

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"StorageDefaultPathDialog onCreate()");
        mSDCardStateFilter = new IntentFilter(SD_ACTION);
        mSDCardStateFilter.addDataScheme("file");
        mReceiver = mSDStateReceiver;
        mInsertOtg = getIntent().getBooleanExtra(INSERT_OTG, false);
//放在這里是沒有效果的
        createDialog();
/* Vanzo:zhangshuli on: Thu, 02 Jul 2015 16:11:42 +0800
 */
        Window w = getWindow();
        WindowManager.LayoutParams attrs = w.getAttributes();
        attrs.width = WindowManager.LayoutParams.MATCH_PARENT;
        w.setAttributes(attrs);
// End of Vanzo: zhangshuli
    }   

    private void createDialog() {
        final AlertController.AlertParams p = mAlertParams;
        p.mTitle = mInsertOtg ? getString(com.mediatek.internal.R.string.usb_storage_ready_title) : 
                getString(com.mediatek.internal.R.string.sdcard_ready_title);
        p.mView = createView();
        p.mViewSpacingSpecified=true;
        p.mViewSpacingLeft=15;
        p.mViewSpacingRight=15;
        p.mViewSpacingTop=5;
        p.mViewSpacingBottom=5;
        p.mPositiveButtonText = getString(android.R.string.yes);
        p.mPositiveButtonListener = this;
        p.mNegativeButtonText = getString(android.R.string.no);
        p.mNegativeButtonListener = this;
        setupAlert();
    } 

 

另外,在代碼中添加一個位置顯示設置

import android.view.Gravity;

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.edit_slide_duration);
/* Vanzo:zhangshuli on: Mon, 16 Mar 2015 16:29:50 +0000
 */
        getWindow().setGravity(Gravity.BOTTOM);
// End of Vanzo: zhangshuli
}

這時候確實是能夠實現activity以充滿屏幕寬度和在屏幕底部的方式存在。

 

3)動畫效果添加

最開始是看得網上的方法,如下

 

 
<style name="Mms.Theme.Edit.Dialog" parent="@android:style/Theme.Funui.Dialog">
        <item name="android:windowAnimationStyle">@style/Animation</item>
    </style>


   <style name="Animation">
        <item name="windowEnterAnimation">@anim/push_bottom_in</item>
        <item name="windowExitAnimation">@anim/push_bottom_out</item>
    </style>

這個方法看起來似乎有點效果,但是,你會發現,它其實是在動畫退出的時候閃爍一下。后來想着是不是因為在代碼中設置才可以消除,因為感覺可能是跟activity轉變為dialog以后顯示有沖突呢

代碼中設置的話,需要用到以下方法

overridePendingTransition(0, R.anim.push_bottom_out);

第一個參數:是即將出現的那個activity的動畫效果
第二個參數:是即將消息的activity的動畫效果

代碼如下,也就是在啟動它的地方添加動畫,注意一定要在啟動以后添加動畫

 builder.setSingleChoiceItems(arrayAdapter, checkedItem,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if ((which >= 0) && (which < NUM_DIRECT_DURATIONS)) {
                    mSlideshowEditor.changeDuration(
                            mPosition, (which + 1) * 1000);
                } else {
                    Intent intent = new Intent(SlideEditorActivity.this,
                            EditSlideDurationActivity.class);
                    intent.putExtra(EditSlideDurationActivity.SLIDE_INDEX, mPosition);
                    intent.putExtra(EditSlideDurationActivity.SLIDE_TOTAL,
                            mSlideshowModel.size());
                    intent.putExtra(EditSlideDurationActivity.SLIDE_DUR, dur); // in seconds
                    startActivityForResult(intent, REQUEST_CODE_CHANGE_DURATION);
/* Vanzo:zhangshuli on: Tue, 17 Mar 2015 11:00:57 +0000
 */
                    overridePendingTransition(R.anim.push_bottom_in, 0)
// End of Vanzo: zhangshuli
                }

 

結果發現還是沒有效果

后來又在網上找了如下的方法,

    <style name="Mms.Theme.Edit.Dialog" parent="@android:style/Theme.Funui.Dialog">
        <item name="android:windowAnimationStyle">@style/AnimBottom</item>
    </style>
    <style name="AnimBottom" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/push_bottom_in</item>
        <item name="android:activityOpenExitAnimation">@anim/push_bottom_in</item>
        <item name="android:activityCloseExitAnimation">@anim/push_bottom_out</item>
        <item name="android:activityCloseEnterAnimation">@anim/push_bottom_out</item>
    </style>
</resources>

我們可以發現這個屬性引用名雖然跟前面的一樣,但是里面的屬性卻不同。然后我就用了這個方法,這個方法其實是可以的。但是,它設定的是啟動activity跟被啟動activity的關系,所以你設定了它以后,所有activity

的啟動方式都變了,這個方法失敗了。

最后,終於找到了一個方法,如下

如下

 

/* Vanzo:zhangshuli on: Mon, 16 Mar 2015 20:42:26 +0000
 */
//這個是沒有什么效果的
@Override
protected void onDestroy() { super.onDestroy(); finish(); overridePendingTransition(0, R.anim.push_bottom_out); android.util.Log.e("zhangshuli", "ondestroy"); }
//這個是關鍵 @Override
public void finish() { super.finish(); overridePendingTransition(0, R.anim.push_bottom_out); android.util.Log.e("zhangshuli", "finish"); } // End of Vanzo: zhangshuli

也就是說,要想這個overridePendingTransition(0, R.anim.push_bottom_out); 有效果,它必須放在startactivity() 或者finish()的后面,而且只生效一次

 動畫如下

<!--in.xml-->

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="3000"
        android:fromYDelta="100%p"
        android:toYDelta="0"
     />

</set>

<!--out.xml-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="3000"
        android:fromYDelta="0"
        android:toYDelta="100%p"
    />

</set>

這樣就實現了activity以dialog的樣式顯示,而且從底部彈出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM