如果实现一个带动画的下拉的Dialog
沿用上篇的基类,实现实际上的子类:
public class DropDownFilterDialogForPhone extends DropDownFilterDialog {
private boolean mShowAnimation = true;
private boolean mIsInAnimation;
private boolean mFinishShowDialog = false;
public DropDownFilterDialogForPhone(Context context) {
super(context);
Window window = getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drop_down_filter_dialog);
}
@Override
protected void onStart() {
super.onStart();
if (mShowAnimation) {
Animation downAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.drop_down_menu_down_anim);
downAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
mFinishShowDialog = true;
mIsInAnimation = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}
});
mDropDownMenuLayout.startAnimation(downAnimation);
mIsInAnimation = true;
} else {
mFinishShowDialog = true;
}
}
public void hideDropDownFilter(boolean showAnimation) {
Animation upAnimation = AnimationUtils.loadAnimation(mContext, R.anim.drop_down_menu_up_anim);
upAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
dismiss();
mIsInAnimation = false;
}
});
startGridViewUpAnimation(upAnimation);
mDropdownClickListener.onDropdownHide();
mIsInAnimation = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mFinishShowDialog) {
if (!mIsInAnimation) {
hideDropDownFilter(true);
}
return true;
}
}
return false;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mFinishShowDialog) {
if (!mIsInAnimation) {
hideDropDownFilter(true);
}
return true;
}
}
return super.dispatchKeyEvent(event);
}
@Override
protected void onStop() {
super.onStop();
}
public void showDialog(boolean showAnimation, View banner) {
Window window = getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
int positionY = mContext.getResources().getDimensionPixelSize(R.dimen.header_hight);
if (banner == null) {
lp.y = positionY;
} else {
lp.y = positionY + banner.getMeasuredHeight();
}
mShowAnimation = showAnimation;
show();
}
public void startGridViewUpAnimation(Animation animation) {
mDropDownMenuLayout.startAnimation(animation);
}
}
@Override
public void onClick(View v) {
if (null == mHeaderClickListener) {
return;
}
super.onClick(v);
switch (v.getId()) {
case R.id.title_layout:
if(mBtnDropDownImageview.getVisibility() == View.GONE) {
return;
}
if (!mIsShowDialog) {
// will show dialog
showDropDownFilter(true);
mIsShowDialog = true;
} else {
mDropDownFilterDialog.hideDropDownFilter(true);
mIsShowDialog = false;
}
break;
}
}
public void setOnDropDownMenuClick(DropDownMenuClicked mDropDownMenuClicked) {
this.mDropDownMenuClicked = mDropDownMenuClicked;
}
public void setDropDownMenuVisible(int visible) {
if(visible == View.VISIBLE) {
mBtnDropDownImageview.setVisibility(View.VISIBLE);
}else{
mBtnDropDownImageview.setVisibility(View.GONE);
}
}
public void rotatePlusButton(Context context, boolean isUp) {
AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(
context, isUp ? R.anim.flip_up : R.anim.flip_down);
animatorSet.setTarget(mBtnDropDownImageview);
animatorSet.start();
}
private void showDropDownFilter(boolean showAnimation) {
if (mDropDownFilterDialog == null) {
if(false) {
mDropDownFilterDialog = new DropDownFilterDialogForTablet(getContext());
}else{
mDropDownFilterDialog = new DropDownFilterDialogForPhone(getContext());
}
}
rotatePlusButton(mContext, false);
mDropDownFilterDialog.setCurrentIndex(mCurrentIndex);
mDropDownFilterDialog.setTopMenuItemList(mDropDownItemList);
mDropDownFilterDialog.showDialog(showAnimation, mBanner);
mDropDownFilterDialog.setDropDownClickListener(new DropDownFilterDialog.OnDropdownClickListener() {
@Override
public void onDropdownHide() {
rotatePlusButton(mContext, true);
mIsShowDialog = false;
}
@Override
public void onClickItem(int index) {
if (index == mCurrentIndex) {
return;
}
mCurrentIndex = index;
mDropDownMenuClicked.onDropDownMenuClicked(index);
}
});
}
/*****************************************init filter*************************************************/
public int getCurrentIndex() {
return mCurrentIndex;
}
public void initMessageFilterWithState(int state) {
mCurrentIndex = state;
switch (state) {
case STATE_ALL:
setText(R.string.messages_bar_item_all);
break;
case STATE_VOICE:
setText(R.string.messages_bar_item_voice);
break;
case STATE_FAX:
setText(R.string.messages_bar_item_fax);
break;
case STATE_TEXT:
setText(R.string.messages_bar_item_text);
break;
}
}
动画的定义:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="-100%"
android:toYDelta="0%"
android:duration="@integer/gridview_duration"
/>
</set>
在Titlebar里面点击的代码可以这样写: