zoukankan      html  css  js  c++  java
  • 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的样式显示,而且从底部弹出

  • 相关阅读:
    <C#>关于string.Empty & "" & null 的讨论
    c# checked unchecked 关键字 try
    sql2005数据库加锁后解锁
    c#对字符串转义符进行解码
    继承本质论
    javascript中parseInt和Number函数的用法区别
    BIRT 使用说明书
    最后一周
    修改字段
    SQLserver中join
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_anim_150316214.html
Copyright © 2011-2022 走看看