android自定義帶入場出場動畫dialog
阿新 • • 發佈:2019-02-18
先上效果圖
res資料夾下建一個anim資料夾,然後anim資料夾下建這倆xml:dialog_in.xml和dialog_out.xml
dialog_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:fillEnabled="true" android:shareInterpolator="true" android:interpolator="@android:anim/accelerate_interpolator"dialog_out.xml> <!--anim/accelerate_interpolator加速度變化--> <!--android:interpolator="@android:anim/accelerate_interpolator"插值器必須在set的節點裡設--> <!--大小變化--> <scale android:fromXScale="1.0" android:toXScale="1.0" android:fromYScale="0.0" android:toYScale="1.0" android:pivotX="0%" android:pivotY="100%"android:duration="1000"/> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:fillEnabled="true" android:shareInterpolator="true" android:interpolator="@android:anim/bounce_interpolator"> <!--@android:anim/bounce_interpolator回彈效果--> <!--fillBefore是指動畫結束時畫面停留在第一幀,fillAfter是指動畫結束是畫面停留在最後一幀。--> <!--最關鍵的問題是這2個引數不能在</alpha>,</scale>,</translate>,</rotate>中設定,這是沒有用的,必須--> <!--在動畫xml檔案的</set>節點中設定--> <!--大小變化--> <scale android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.0" android:toYScale="0.0" /> </set>
value資料夾下styles.xml裡面加上倆:
<!--dialog的背景屬性--> <style name="MyReasonDialog" parent="android:style/Theme.Dialog"> <!--背景顏色及和透明程度--> <item name="android:windowBackground">@color/bantouming</item> <!--是否去除標題 --> <item name="android:windowNoTitle">true</item> <!--是否去除邊框--> <item name="android:windowFrame">@null</item> <!--是否浮現在activity之上--> <item name="android:windowIsFloating">true</item> <!--是否模糊--> <item name="android:backgroundDimEnabled">true</item> <item name="android:windowContentOverlay">@null</item> </style> <!--動畫的style--> <style name="MyReasonDialogAnim" parent="android:Animation" mce_bogus="1"> <item name="android:windowEnterAnimation">@anim/dialog_in</item> <item name="android:windowExitAnimation">@anim/dialog_out</item> </style>color裡面加上一個半透明背景色:
<color name="bantouming">#0ef8fdf8</color>
接下來就是dialog的佈局:my_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="260dp" android:layout_height="200dp" android:gravity="center_horizontal" android:orientation="vertical" android:padding="10dp" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:background="@android:color/white" > <LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="點選右邊小圖示退出" android:gravity="center_vertical"/> <ImageView android:id="@+id/exit_img" android:layout_width="30dp" android:layout_height="match_parent" android:src="@mipmap/ic_launcher"/> </LinearLayout> <ImageView android:layout_width="match_parent" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> <Button android:id="@+id/queding_btn" android:layout_width="match_parent" android:layout_height="35dp" android:text="確定"/> </LinearLayout> </RelativeLayout>
再就是重寫dialog類:MyDialog.class
/** * 自定義對話方塊 */ public class MyDialog extends Dialog { private Button quedingBtn; //確定按鈕 private ImageView exitImg; //退出按鈕 //介面的例項 private OnQudingListener qudingListener; //確定監聽例項 private OnExitListener onExitListener; //退出監聽例項 Context context; public MyDialog(Context context) { //關聯style super(context, R.style.MyReasonDialog); Window window = getWindow(); //設定動畫效果 window.setWindowAnimations(R.style.MyReasonDialogAnim); this.context = context; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //關聯佈局樣式 setContentView(R.layout.my_dialog); //按空白處不能取消動畫 setCanceledOnTouchOutside(false); setCancelable(false); //初始化介面控制元件 initView(); //初始化介面資料 initEvent(); } /** * 初始化介面控制元件的顯示資料 */ private void initEvent() { quedingBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { qudingListener.qudingclick(); } }); exitImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onExitListener.exitclick(); } }); } /** * 確定例項賦值 */ public void setquedingclickListener(OnQudingListener onQudingListener) { qudingListener = onQudingListener; } /** * 退出例項賦值 */ public void setexitListener(OnExitListener onExitListener) { this.onExitListener = onExitListener; } /** * 初始化介面控制元件 */ private void initView() { exitImg = (ImageView) findViewById(R.id.exit_img); quedingBtn = (Button) findViewById(R.id.queding_btn); } /** * 確定鈕介面 */ public interface OnQudingListener { void qudingclick(); } /** * 退出鈕介面 */ public interface OnExitListener { void exitclick(); } }
使用方法MainActivity中:
final MyDialog myDialog=new MyDialog(MainActivity.this); myDialog.setquedingclickListener(new MyDialog.OnQudingListener() { @Override public void qudingclick() { Toast.makeText(MainActivity.this,"我最帥~~~",Toast.LENGTH_SHORT).show(); myDialog.dismiss(); } }); myDialog.setexitListener(new MyDialog.OnExitListener() { @Override public void exitclick() { myDialog.dismiss(); } }); myDialog.show(); } });大功告成!!!