Dialog在android中的应用(二)

如果实现一个带动画的下拉的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里面点击的代码可以这样写:

时间: 2024-10-10 13:44:20

Dialog在android中的应用(二)的相关文章

android中的json二之json的读写

android中的json的读取 1.读取Json文件中的json内容 首先在将json文件放在目录assets下: test.json {"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason&quo

Dialog在android中的应用(一)

如果做一个如下图的Dialog,首先要定义样式: <style name="DropdownFilterDialogStyle" parent="@android:style/Theme.Light.NoTitleBar"> <item name="android:windowSoftInputMode">stateUnchanged|adjustResize</item> <item name=&quo

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

浅谈android中的自定义封装易用的Dialog

好久没写android的博客,最近在做一个android的项目,里面用到我们经常用的一个控件就是对话框,大家都知道android自带的对话框是很丑的,android5.x之后除外.所以就出现了自定义view,自己定义美观的对话框.好我们就来自定义对话框. 整体思路:定义一个类然后去继承Dialog类,然后重写相应的构造器方法.大家都知道一般的对话框的创建过程都是来一个AlertDialog.Builder对象,然后使用一些set方法来设置标题内容以及设置一些自定义的view和点击的Button以

android中给Dialog设置的动画如何自定义修改参数

============问题描述============ 在android中给Dialog设置动画的方法我只找到Dialog.getWindow().setWindowAnimation(int resID); 这样不是只能在styles里用xml定义动画吗? 但是我现在想要先用程序计算出一个屏幕上的点,在让Dialog从该点开始执行scaleAnimation. 我如何给我Dialog的动画设置起始点之类的参数呢? ============解决方案1============ 自定义一个dial

Android中使用Sqlite数据库 (二) 增删改查

定义接口 package com.example.android_db.service; import java.util.List; import java.util.Map; public interface PersonService { public boolean addPerson(Object[] params); public boolean deletePerson(Object[] params); public boolean updatePerson(Object[] p

Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识. 从这张图中可以看到,Dialog为父类, 其下有最重要的, 我们最常用的AlertDilog, 而AlertDialog的子类,则是由DatPicker, ProgressDialog,TimePick来组成. 这几个子类都是我们在程序开发中最常用的,因此要重点理解, 我们可以试着想像一下,如下

Android中Dialog对话框的调用及监听

Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文: 一般对话框 先看下整个App页面: 看下一般对话框的结果: 具体代码的实现,其中定义了两个按钮,一个是确定(PositiveBu

Android中控制Dialog呈现的时间

用线程控制dialog的呈现时间,思路很简单,直接show代码了,我也是为了方便自己记录 private void showProgressDialog() { pDialog = new ProgressDialog(mContext); pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); pDialog.setProgress(100); pDialog.setMessage("请稍等一秒..."); pDialog.se