EasyDialog 源码简析
给大家介绍了,我放到github上的项目easydialog,这一篇给大家介绍一下实现代码
1.创建EasyDialog类
public EasyDialog(EasyDialogBuilder builder){
Activity activity = (Activity)builder.getContext();
mBuilder = builder;
dialogView = builder.getDialogView();
LayoutInflater layoutInflater = LayoutInflater.from(builder.getContext());
decorView = (ViewGroup) activity.getWindow().getDecorView().findViewById(android.R.id.content);
rootView = (ViewGroup) layoutInflater.inflate(R.layout.view_root, decorView, false);
rootContent = (ViewGroup) rootView.findViewById(R.id.fl_root_content);
rootContent.setLayoutParams(builder.getContentParams());
rootView.setLayoutParams(builder.getRootLayoutParams());
rootContent.addView(createView(layoutInflater));
outAnim = builder.getOutAnimation();
inAnim = builder.getInAnimation();
initCancelable();
}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">
</span>
首先要获取到android最定层视图,activity.getWindow().getDecorView().findViewById(android.R.id.content);
然后在其中加入我们需要的展示的视图
2.创建动画
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
>
<translate
android:duration="200"
android:fromXDelta="0%"
android:fromYDelta="100%"
android:toXDelta="0%"
android:toYDelta="0%"
/>
</set>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">创建进入动画,退出动画类似</span>
</pre><h3>3.添加显示view</h3></div><div><p>decorView.addView(view);</p><h2>4.获取焦点,获取键盘时间,在点击返回键时,移除</h2><pre name="code" class="java">
<pre name="code" class="java">rootContent.startAnimation(inAnim);
rootContent.requestFocus();
dialogView.setOnkeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (event.getAction()) {
case KeyEvent.ACTION_UP:
if (keyCode == KeyEvent.KEYCODE_BACK) {
dismiss();
return true;
}
break;
default:
break;
}
return false;
}
});
dialogView.setDismissClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
</pre><h2>5.最后移除实现</h2><pre name="code" class="java"><pre name="code" class="java">public void dismiss(){
if(isDismissing){
return;
}
outAnim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
decorView.post(new Runnable() {
@Override
public void run() {
decorView.removeView(rootView);
isDismissing = false;
}
});
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
rootContent.startAnimation(outAnim);
isDismissing = true;
}
移除是要记得,先显示移除动画,在移除动画结束后,开启线程,移除view