[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/dialog\" />\n            <option value=\"$PROJECT_DIR$/sweeploadingview\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"true\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/Dialog.iml\" filepath=\"$PROJECT_DIR$/Dialog.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/Dialog2.iml\" filepath=\"$PROJECT_DIR$/Dialog2.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/dialog/dialog.iml\" filepath=\"$PROJECT_DIR$/dialog/dialog.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/dialog/dialog.iml\" filepath=\"$PROJECT_DIR$/dialog/dialog.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/sweeploadingview/sweeploadingview.iml\" filepath=\"$PROJECT_DIR$/sweeploadingview/sweeploadingview.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "# Dialog\n\n\n![预览](https://github.com/Alex-Cin/Dialog/blob/master/preview/preview.gif)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n    defaultConfig {\n        applicationId \"com.alex.dialogdemo\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(include: ['*.jar'], dir: 'libs')\n    compile project(':dialog')\n    compile project(':sweeploadingview')\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in E:\\Android\\sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.alex.dialogdemo\">\n    <!-- 在SDCard中创建与删除文件权限 -->\n    <uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>\n    <!-- 往SDCard写入数据权限 -->\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <!-- 从SDCard读取数据权限 -->\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <!-- 申请联网权限-->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <!-- 检测网络状态 -->\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <!-- 申请读通讯录权限-->\n    <uses-permission android:name=\"android.permission.READ_CONTACTS\"/>\n    <!-- 申请写通讯录权限-->\n    <uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>\n    <!-- 申请拨号权限-->\n    <uses-permission android:name=\"android.permission.CALL_PHONE\"/>\n    <!-- 申请写通话记录权限-->\n    <uses-permission android:name=\"android.permission.WRITE_CALL_LOG\"/>\n    <!-- 申请读通话记录权限-->\n    <uses-permission android:name=\"android.permission.READ_CALL_LOG\"/>\n    <!-- 申请发送短信权限-->\n    <uses-permission android:name=\"android.permission.SEND_SMS\"/>\n    <!-- 申请写短信记录权限-->\n    <uses-permission android:name=\"android.permission.WRITE_SMS\"/>\n    <!-- 申请读短信记录权限-->\n    <uses-permission android:name=\"android.permission.READ_SMS\"/>\n    <!-- 申请监控电量变化 -->\n    <uses-permission android:name=\"android.permission.BATTERY_STATS\"/>\n    <!-- 申请开机启动权限 -->\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>\n    <!-- 打开Camera的权限 -->\n    <uses-permission android:name=\"android.permission.CAMERA\"/>\n\n    <uses-feature android:name=\"android.hardware.camera\"/>\n    <uses-feature android:name=\"android.hardware.autofocus\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"></uses-permission>\n    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"></uses-permission>\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\"></uses-permission>\n    <!-- 开启闪光灯权限 -->\n    <uses-permission android:name=\"android.permission.FLASHLIGHT\"/>\n\n    <!-- 开启闪光灯权限 -->\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n\n    <uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/alex_theme_no_title\">\n        <activity android:name=\".ui.MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/App.java",
    "content": "package com.alex.dialogdemo;\n\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/BottomDialog.java",
    "content": "package com.alex.dialogdemo.dialog;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.base.Bottom2TopDialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\n\n/**\n * 作者：Alex\n * 时间：2016年09月10日    17:40\n * 简述：\n */\n\npublic class BottomDialog extends Bottom2TopDialog<BottomDialog> {\n    public BottomDialog(Context context) {\n        super(context);\n    }\n\n    @Override\n    public int getLayoutRes() {\n        return R.layout.dialog_notice;\n    }\n\n    @Override\n    public void onCreateData() {\n        setOnCilckListener(R.id.tv_submit,R.id.tv_cancel);\n    }\n\n    @Override\n    public void onClick(View v, int id) {\n        if(R.id.tv_submit == id){\n           onDialogClickListener(ClickPosition.SUBMIT);\n        }else  if(R.id.tv_cancel == id){\n            onDialogClickListener(ClickPosition.CANCEL);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/LoadingDialog.java",
    "content": "package com.alex.dialogdemo.dialog;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.base.SimpleDialog;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    21:29\n * 简述：\n */\n@SuppressWarnings(\"all\")\npublic class LoadingDialog extends SimpleDialog<LoadingDialog> {\n\n    /*super(context,R.style.alex_dialog_base_light_style);*/\n    public LoadingDialog(Context context) {\n        super(context);\n    }\n\n    /**\n     * 配置 对话框的 布局文件\n     */\n    @Override\n    public int getLayoutRes() {\n        return R.layout.dialog_loading;\n    }\n\n    /**\n     * 在 这里 进行 finndView  设置点击事件\n     */\n    @Override\n    public void onCreateData() {\n        setCancelable(true);\n        setCanceledOnTouchOutside(false);\n    }\n\n    @Override\n    public void onClick(View v, int id) {\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/NoticeDialog.java",
    "content": "package com.alex.dialogdemo.dialog;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.base.Top2BottomDialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\n/**\n * 作者：Alex\n * 时间：2016年09月10日    17:40\n * 简述：\n */\n\npublic class NoticeDialog extends Top2BottomDialog<NoticeDialog> {\n    public NoticeDialog(Context context) {\n        super(context);\n    }\n\n    @Override\n    public int getLayoutRes() {\n        return R.layout.dialog_notice;\n    }\n\n    @Override\n    public void onCreateData() {\n        setOnCilckListener(R.id.tv_submit,R.id.tv_cancel);\n    }\n\n    @Override\n    public void onClick(View v, int id) {\n        if(R.id.tv_submit == id){\n           onDialogClickListener(ClickPosition.SUBMIT);\n        }else  if(R.id.tv_cancel == id){\n            onDialogClickListener(ClickPosition.CANCEL);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/OneButtonDialog.java",
    "content": "package com.alex.dialogdemo.dialog;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.base.CenterScaleDialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\n\n/**\n * 作者：Alex\n * 时间：2016年09月09日    23:52\n * 简述：\n */\n\npublic class OneButtonDialog extends CenterScaleDialog<OneButtonDialog> {\n\n    public OneButtonDialog(Context context) {\n        super(context);\n    }\n\n    /**\n     * 配置 对话框的 布局文件\n     */\n    @Override\n    public int getLayoutRes() {\n        return R.layout.dialog_one_button;\n    }\n\n    /**\n     * 在 这里 进行 findView  设置点击事件\n     */\n    @Override\n    public void onCreateData() {\n        setOnCilckListener(R.id.tv_submit);\n    }\n\n    /**\n     * 处理按钮点击事件 并绑定 onDialogClickListener\n     *\n     * @param v\n     */\n    @Override\n    public void onClick(View v, int id) {\n        if (R.id.tv_submit == v.getId()) {\n            if (onDialogClickListener != null) {\n                onDialogClickListener.onDialogClick(this, ClickPosition.SUBMIT);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/SelectedProductDialog.java",
    "content": "package com.alex.dialogdemo.dialog;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.base.TaoBaoDialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\n\n/**\n * 作者：Alex\n * 时间：2016年09月09日    23:52\n * 简述：\n */\n\npublic class SelectedProductDialog extends TaoBaoDialog<SelectedProductDialog> {\n\n    public SelectedProductDialog(Context context, View rootView) {\n        super(context, rootView, R.style.alex_dialog_base_light_style);\n    }\n\n    /**\n     * 配置 对话框的 布局文件\n     */\n    @Override\n    public int getLayoutRes() {\n        return R.layout.dialog_selected_product;\n    }\n\n    /**\n     * 在 这里 进行 findView  设置点击事件\n     */\n    @Override\n    public void onCreateData() {\n        setScaleWidth(1F);\n        setOnCilckListener(R.id.tv_submit);\n    }\n\n    /**\n     * 处理按钮点击事件 并绑定 onDialogClickListener\n     *\n     * @param v\n     */\n    @Override\n    public void onClick(View v, int id) {\n        if (R.id.tv_submit == v.getId()) {\n            if (onDialogClickListener != null) {\n                onDialogClickListener.onDialogClick(this, ClickPosition.SUBMIT);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/Bottom2TopDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.content.Context;\n\nimport com.alex.dialogdemo.R;\n\nimport org.alex.dialog.annotation.AnimType;\n\n/**\n * 作者：Alex\n * 时间：2016/12/7 13 27\n * 简述：\n */\npublic abstract class Bottom2TopDialog<D extends Bottom2TopDialog> extends SimpleDialog<D> {\n    public Bottom2TopDialog(Context context) {\n        super(context, R.style.alex_dialog_base_light_style);\n    }\n    /**\n     * 显示对话框，无动画\n     */\n    @Override\n    public void show() {\n        show(AnimType.BOTTOM_2_TOP);\n    }\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     *\n     * @param animType\n     */\n    @Override\n    public void show(@AnimType int animType) {\n        super.show(animType);\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/CenterNormalDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.content.Context;\n\nimport com.alex.dialogdemo.R;\n\nimport org.alex.dialog.annotation.AnimType;\n\n/**\n * 作者：Alex\n * 时间：2016年09月10日    17:33\n * 简述：\n */\n\npublic abstract class CenterNormalDialog<D extends CenterNormalDialog> extends SimpleDialog<D> {\n    public CenterNormalDialog(Context context) {\n        super(context, R.style.alex_dialog_base_light_style);\n\n    }\n\n    /**\n     * 显示对话框，无动画\n     */\n    @Override\n    public void show() {\n        show(AnimType.CENTER_NORMAL);\n    }\n\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     *\n     * @param animType\n     */\n    @Override\n    public void show(@AnimType int animType) {\n        super.show(animType);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/CenterScaleDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.content.Context;\n\nimport com.alex.dialogdemo.R;\n\nimport org.alex.dialog.annotation.AnimType;\n/**\n * 作者：Alex\n * 时间：2016年09月10日    17:33\n * 简述：\n */\n\npublic abstract class CenterScaleDialog<D extends CenterScaleDialog> extends SimpleDialog<D> {\n    public CenterScaleDialog(Context context) {\n        super(context, R.style.alex_dialog_base_light_style);\n\n    }\n\n    /**\n     * 显示对话框，无动画\n     */\n    @Override\n    public void show() {\n        show(AnimType.CENTER_SCALE);\n    }\n\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     *\n     * @param animType\n     */\n    @Override\n    public void show(@AnimType int animType) {\n        super.show(animType);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/SimpleDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.content.Context;\nimport android.view.Gravity;\nimport android.view.Window;\n\nimport com.alex.dialogdemo.R;\n\nimport org.alex.dialog.annotation.AnimType;\nimport org.alex.dialog.base.BaseDialog;\n\n/**\n * 作者：Alex\n * 时间：2016/12/7 13 22\n * 简述：\n */\n\npublic abstract class SimpleDialog<D extends SimpleDialog> extends BaseDialog<D> {\n    public SimpleDialog(Context context) {\n        super(context, R.style.alex_dialog_base_light_style);\n    }\n\n    public SimpleDialog(Context context, int theme) {\n        super(context, theme);\n    }\n\n    /**\n     * 显示对话框，无动画\n     */\n    @Override\n    public void show() {\n        if (Gravity.BOTTOM == gravity) {\n            show(AnimType.BOTTOM_2_TOP);\n        } else if (Gravity.TOP == gravity) {\n            show(AnimType.TOP_2_BOTTOM);\n        } else if (Gravity.CENTER == gravity) {\n            show(animType);\n        } else {\n            super.show();\n        }\n    }\n\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     */\n    public void show(@AnimType int animType) {\n        Window window = getWindow();\n        /*如果根据  AnimType 的类型，强制选择Dialog出现的位置*/\n        if (AnimType.BOTTOM_2_TOP == animType) {\n            setGravity(Gravity.BOTTOM);\n            window.setWindowAnimations(R.style.alex_dialog_anim_bottom2top);\n        } else if (AnimType.TOP_2_BOTTOM == animType) {\n            setGravity(Gravity.TOP);\n            window.setWindowAnimations(R.style.alex_dialog_anim_top2bottom);\n        } else if (AnimType.CENTER_SCALE == animType) {\n            setGravity(Gravity.CENTER);\n            window.setWindowAnimations(R.style.alex_dialog_anim_scale);\n        } else if (AnimType.CENTER_NORMAL == animType) {\n            setGravity(Gravity.CENTER);\n            window.setWindowAnimations(R.style.alex_dialog_anim_alpha);\n        }\n        super.show();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/TaoBaoDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.animation.ObjectAnimator;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.view.View;\n\nimport org.alex.dialog.anim.BaseAnimatorSet;\nimport org.alex.dialog.annotation.AnimType;\n\n/**\n * 作者：Alex\n * 时间：2016/12/7 13 28\n * 简述：\n */\npublic abstract class TaoBaoDialog<D extends TaoBaoDialog> extends SimpleDialog<D> {\n    private BaseAnimatorSet inAnimSet;\n    private BaseAnimatorSet outAnimSet;\n    private View rootView;\n    protected int duration;\n    protected int backgroundColor;\n    private View parentView;\n    public TaoBaoDialog(Context context, View rootView, int theme) {\n        super(context, theme);\n        this.rootView = rootView;\n        initView();\n    }\n    protected void initView() {\n        duration = 300;\n        backgroundColor = Color.parseColor(\"#111111\");\n        parentView = (View) rootView.getParent();\n        parentView.setBackgroundColor(backgroundColor);\n        inAnimSet = new WindowsInAs();\n        outAnimSet = new WindowsOutAs();\n    }\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     */\n    @Override\n    public void show() {\n        show(AnimType.BOTTOM_2_TOP);\n    }\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     *\n     * @param animType\n     */\n    @Override\n    public void show(@AnimType int animType) {\n        super.show(AnimType.BOTTOM_2_TOP);\n        parentView.setBackgroundColor(backgroundColor);\n        if (rootView != null && inAnimSet != null) {\n            inAnimSet.duration(duration).playOn(rootView);\n        }\n    }\n    @Override\n    public void dismiss() {\n        super.dismiss();\n        new Handler(){\n            @Override\n            public void handleMessage(Message msg) {\n                super.handleMessage(msg);\n                parentView.setBackgroundColor(0);\n            }\n        }.sendEmptyMessageDelayed(100, duration);\n        if (rootView != null && outAnimSet != null) {\n            outAnimSet.duration(duration).playOn(rootView);\n        }\n    }\n    private final class WindowsInAs extends BaseAnimatorSet {\n        @Override\n        public void setAnimation(View view) {\n            ObjectAnimator rotationX = ObjectAnimator.ofFloat(view, \"rotationX\", 10, 0f).setDuration(150);\n            rotationX.setStartDelay(200);\n            animatorSet.playTogether(\n                    ObjectAnimator.ofFloat(view, \"scaleX\", 1.0f, 0.8f).setDuration(350),\n                    ObjectAnimator.ofFloat(view, \"scaleY\", 1.0f, 0.8f).setDuration(350),\n                    ObjectAnimator.ofFloat(view, \"rotationX\", 0f, 10).setDuration(200),\n                    rotationX,\n                    ObjectAnimator.ofFloat(view, \"translationY\", 0, -0.1f * displayMetrics.heightPixels).setDuration(350)\n            );\n        }\n    }\n    private final class WindowsOutAs extends BaseAnimatorSet {\n        @Override\n        public void setAnimation(View view) {\n            ObjectAnimator rotationX = ObjectAnimator.ofFloat(view, \"rotationX\", 10, 0f).setDuration(150);\n            rotationX.setStartDelay(200);\n            animatorSet.playTogether(\n                    ObjectAnimator.ofFloat(view, \"scaleX\", 0.8f, 1.0f).setDuration(350),\n                    ObjectAnimator.ofFloat(view, \"scaleY\", 0.8f, 1.0f).setDuration(350),\n                    ObjectAnimator.ofFloat(view, \"rotationX\", 0f, 10).setDuration(200),\n                    rotationX,\n                    ObjectAnimator.ofFloat(view, \"translationY\", -0.1f * displayMetrics.heightPixels, 0).setDuration(350)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/dialog/base/Top2BottomDialog.java",
    "content": "package com.alex.dialogdemo.dialog.base;\n\nimport android.content.Context;\n\nimport com.alex.dialogdemo.R;\n\nimport org.alex.dialog.annotation.AnimType;\n\n/**\n * 作者：Alex\n * 时间：2016/12/7 13 27\n * 简述：\n */\npublic abstract class Top2BottomDialog<D extends Top2BottomDialog> extends SimpleDialog<D> {\n    public Top2BottomDialog(Context context) {\n        super(context, R.style.alex_dialog_base_light_style);\n    }\n    /**\n     * 显示对话框，无动画\n     */\n    @Override\n    public void show() {\n        show(AnimType.TOP_2_BOTTOM);\n    }\n    /**\n     * 显示对话框，强制转换对话框的动画类型\n     *\n     * @param animType\n     */\n    @Override\n    public void show(@AnimType int animType) {\n        super.show(animType);\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/alex/dialogdemo/ui/MainActivity.java",
    "content": "package com.alex.dialogdemo.ui;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.view.Window;\n\nimport com.alex.dialogdemo.R;\nimport com.alex.dialogdemo.dialog.BottomDialog;\nimport com.alex.dialogdemo.dialog.LoadingDialog;\nimport com.alex.dialogdemo.dialog.NoticeDialog;\nimport com.alex.dialogdemo.dialog.OneButtonDialog;\nimport com.alex.dialogdemo.dialog.SelectedProductDialog;\nimport com.alex.dialogdemo.dialog.base.SimpleDialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\nimport org.alex.dialog.callback.OnDialogClickListener;\n\npublic class MainActivity extends AppCompatActivity implements View.OnClickListener {\n    private LoadingDialog loadingDialog;\n    private NoticeDialog noticeDialog;\n    private OneButtonDialog oneButtonDialog;\n    private SelectedProductDialog selectedProductDialog;\n    private BottomDialog bottomDialog;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        initView();\n    }\n\n    private void initView() {\n        MyOnDialogClickListener onDialogClickListener = new MyOnDialogClickListener();\n        loadingDialog = new LoadingDialog(this);\n        noticeDialog = new NoticeDialog(this).setOnDialogClickListener(onDialogClickListener);\n        bottomDialog = new BottomDialog(this).setOnDialogClickListener(onDialogClickListener);\n        oneButtonDialog = new OneButtonDialog(this).setOnDialogClickListener(onDialogClickListener);\n        selectedProductDialog = new SelectedProductDialog(this, findViewById(Window.ID_ANDROID_CONTENT)).setOnDialogClickListener(onDialogClickListener);\n\n        findViewById(R.id.bt_1).setOnClickListener(this);\n        findViewById(R.id.bt_2).setOnClickListener(this);\n        findViewById(R.id.bt_3).setOnClickListener(this);\n        findViewById(R.id.bt_4).setOnClickListener(this);\n        findViewById(R.id.bt_5).setOnClickListener(this);\n    }\n\n    @Override\n    public void onClick(View view) {\n        if (R.id.bt_1 == view.getId()) {\n            loadingDialog.show();\n\n        } else if (R.id.bt_2 == view.getId()) {\n            noticeDialog.show();\n\n        } else if (R.id.bt_3 == view.getId()) {\n            selectedProductDialog.show();\n\n        } else if (R.id.bt_4 == view.getId()) {\n            bottomDialog.show();\n        } else if (R.id.bt_5 == view.getId()) {\n            oneButtonDialog.show();\n        }\n\n    }\n    private final class MyOnDialogClickListener implements OnDialogClickListener<SimpleDialog> {\n\n        @Override\n        public void onDialogClick(SimpleDialog dialog, @ClickPosition String clickPosition) {\n            //LogUtil.e(\"tag = \" + dialog.tag + \" clickPosition =\" + clickPosition);\n            dialog.dismiss();\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (loadingDialog != null) {\n            loadingDialog.destody();\n        }\n        loadingDialog = null;\n        if (noticeDialog != null) {\n            noticeDialog.destody();\n        }\n        noticeDialog = null;\n        if (oneButtonDialog != null) {\n            oneButtonDialog.destody();\n        }\n        oneButtonDialog = null;\n        if (selectedProductDialog != null) {\n            selectedProductDialog.destody();\n        }\n        selectedProductDialog = null;\n        if(bottomDialog!=null){\n            bottomDialog.destody();\n        }\n        bottomDialog = null;\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_bottom2top_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromYDelta=\"100%\"\n    android:fromXDelta=\"0\"\n    android:toXDelta=\"0\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_bottom2top_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXDelta=\"0\"\n    android:fromYDelta=\"0\"\n    android:toYDelta=\"100%\"\n    android:toXDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_fade_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"200\"\n    android:fromAlpha=\"0.0\"\n    android:toAlpha=\"1.0\" />\n"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_fade_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"200\"\n    android:fromAlpha=\"1.0\"\n    android:toAlpha=\"0.0\" />\n"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_scale_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<scale xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"200\"\n    android:fromXScale=\"0.5\"\n    android:fromYScale=\"0.5\"\n    android:interpolator=\"@android:anim/overshoot_interpolator\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\"\n    android:repeatCount=\"0\"\n    android:repeatMode=\"restart\"\n    android:startOffset=\"0\"\n    android:toXScale=\"1.05\"\n    android:toYScale=\"1.05\" />\n\n"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_scale_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<scale xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXScale=\"1.0\"\n    android:fromYScale=\"1.0\"\n    android:interpolator=\"@android:anim/decelerate_interpolator\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\"\n    android:repeatCount=\"0\"\n    android:repeatMode=\"restart\"\n    android:startOffset=\"0\"\n    android:toXScale=\"0.00\"\n    android:toYScale=\"0.00\" />\n\n"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_top2bottom_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromYDelta=\"-100%\"\n    android:fromXDelta=\"0\"\n    android:toXDelta=\"0\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "app/src/main/res/anim/alex_dialog_anim_top2bottom_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromYDelta=\"0\"\n    android:fromXDelta=\"0\"\n    android:toXDelta=\"0\"\n    android:toYDelta=\"-100%\" >\n\n</translate>"
  },
  {
    "path": "app/src/main/res/drawable/alex_dialog_layer_list_shadow_rectangle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_1\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_2\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_3\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_4\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_5\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_6\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_7\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogShadowColor_8\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n\n    <item>\n        <shape android:shape=\"oval\">\n            <solid android:color=\"@color/alexDialogBodyColor\" />\n            <corners android:radius=\"@dimen/alexDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/alexDialogPadding\"\n                android:left=\"@dimen/alexDialogPadding\"\n                android:right=\"@dimen/alexDialogPadding\"\n                android:top=\"@dimen/alexDialogPadding\" />\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/layer_list_shadow_dialog_one_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_1\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_2\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_3\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_4\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_5\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_6\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_7\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/oneButtonDialogShadowColor_8\" />\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners android:radius=\"@dimen/oneButtonDialogRadius\" />\n            <solid android:color=\"@color/oneButtonDialogBodyColor\" />\n            <padding\n                android:bottom=\"@dimen/oneButtonDialogPaddingBottom\"\n                android:left=\"@dimen/oneButtonDialogPaddingLeft\"\n                android:right=\"@dimen/oneButtonDialogPaddingRight\"\n                android:top=\"@dimen/oneButtonDialogPaddingTop\" />\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/layer_list_shadow_rectangle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_1\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_2\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_3\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_4\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_5\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_6\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_7\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@color/cardShadowColor_8\" />\n            <corners android:radius=\"@dimen/cardRadius\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners android:radius=\"3dp\" />\n            <solid android:color=\"@color/cardBodyColor\" />\n            <padding\n                android:bottom=\"@dimen/cardPaddingBottom\"\n                android:left=\"@dimen/cardPaddingLeft\"\n                android:right=\"@dimen/cardPaddingRight\"\n                android:top=\"@dimen/cardPaddingTop\" />\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/selector_dialog_one_button_submit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_pressed=\"true\">\n        <shape android:shape=\"rectangle\">\n\n            <solid android:color=\"#BBBBBB\" />\n            <corners android:radius=\"4dp\" />\n        </shape>\n    </item>\n    <item  >\n        <shape android:shape=\"rectangle\">\n\n            <solid android:color=\"#DDDDDD\" />\n            <corners android:radius=\"4dp\" />\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              android:id=\"@+id/activity_main\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:background=\"#FFFFFF\"\n\n              android:orientation=\"vertical\"\n              tools:context=\".ui.MainActivity\">\n\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"48dp\"\n        android:background=\"@color/colorPrimary\"\n        android:gravity=\"center\"\n        android:text=\"对话框\"\n        android:textColor=\"#FFFFFF\"/>\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n\n            <Button\n                android:id=\"@+id/bt_1\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"Loading\"\n                android:textAllCaps=\"false\"/>\n\n            <Button\n                android:id=\"@+id/bt_2\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"类 通知\"\n                android:textAllCaps=\"false\"/>\n\n            <Button\n                android:id=\"@+id/bt_3\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"仿 淘宝\"\n                android:textAllCaps=\"false\"/>\n\n            <Button\n                android:id=\"@+id/bt_4\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"底部 弹出\"\n                android:textAllCaps=\"false\"/>\n\n            <Button\n                android:id=\"@+id/bt_5\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\"\n                android:text=\"普通的\"\n                android:textAllCaps=\"false\"/>\n        </LinearLayout>\n    </ScrollView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_loading.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n    >\n\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:background=\"@drawable/alex_dialog_layer_list_shadow_rectangle\"\n        android:padding=\"12dp\">\n\n        <org.alex.sweeploadingview.SweepLoadingView\n            xmlns:SweepLoadingView=\"http://schemas.android.com/apk/res-auto\"\n            android:id=\"@+id/slv\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:layout_centerInParent=\"true\"\n            SweepLoadingView:slv_circleColor=\"@color/alex_title_color\"\n            SweepLoadingView:slv_circleWidth=\"4dp\"\n            SweepLoadingView:slv_duration=\"800\"\n            SweepLoadingView:slv_gapAngle=\"30\"\n            SweepLoadingView:slv_strokeCap=\"round\"/>\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_notice.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"#FFFFFF\"\n    android:orientation=\"vertical\">\n\n\n    <RelativeLayout\n        android:id=\"@+id/layout_body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"160dp\"\n        android:layout_centerInParent=\"true\"\n\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"温馨提示\"\n            android:textColor=\"#666666\"\n            android:textSize=\"18sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_content\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n\n            android:layout_centerInParent=\"true\"\n\n            android:text=\"您的智商余额不足，请及时充值\"\n            android:textColor=\"#999999\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_submit\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n\n            android:layout_marginBottom=\"8dp\"\n            android:layout_marginLeft=\"64dp\"\n            android:background=\"@drawable/selector_dialog_one_button_submit\"\n            android:clickable=\"true\"\n            android:paddingBottom=\"4dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:text=\"确定\"\n            android:textColor=\"#333333\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_cancel\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginBottom=\"8dp\"\n            android:layout_marginRight=\"64dp\"\n            android:background=\"@drawable/selector_dialog_one_button_submit\"\n            android:clickable=\"true\"\n            android:paddingBottom=\"4dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:text=\"取消\"\n            android:textColor=\"#333333\"\n            android:textSize=\"14sp\" />\n    </RelativeLayout>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_one_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n\n    <RelativeLayout\n        android:id=\"@+id/layout_body\"\n        android:layout_width=\"260dp\"\n        android:layout_height=\"160dp\"\n        android:layout_centerInParent=\"true\"\n        android:background=\"@drawable/layer_list_shadow_dialog_one_button\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"温馨提示\"\n            android:textColor=\"#666666\"\n            android:textSize=\"18sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_content\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n\n            android:layout_centerInParent=\"true\"\n\n            android:text=\"您的智商余额不足，请及时充值\"\n            android:textColor=\"#999999\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_submit\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:clickable=\"true\"\n            android:textColor=\"#333333\"\n            android:textSize=\"14sp\"\n            android:background=\"@drawable/selector_dialog_one_button_submit\"\n            android:layout_centerHorizontal=\"true\"\n            android:paddingLeft=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingTop=\"4dp\"\n            android:paddingBottom=\"4dp\"\n            android:layout_marginBottom=\"8dp\"\n            android:text=\"确定\" />\n    </RelativeLayout>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_selected_product.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"#FFFFFF\"\n    android:orientation=\"vertical\">\n\n\n    <RelativeLayout\n        android:id=\"@+id/layout_body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"360dp\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"温馨提示\"\n            android:textColor=\"#666666\"\n            android:textSize=\"18sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_content\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n\n            android:layout_centerInParent=\"true\"\n\n            android:lineSpacingMultiplier=\"1.5\"\n            android:paddingLeft=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:text=\"您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值；您的智商余额不足，请及时充值\"\n            android:textColor=\"#999999\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_submit\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginBottom=\"16dp\"\n            android:layout_marginLeft=\"32dp\"\n            android:layout_marginRight=\"32dp\"\n            android:background=\"@drawable/selector_dialog_one_button_submit\"\n            android:clickable=\"true\"\n            android:gravity=\"center\"\n            android:paddingBottom=\"8dp\"\n            android:paddingLeft=\"16dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingTop=\"8dp\"\n            android:text=\"确定\"\n            android:textColor=\"#333333\"\n            android:textSize=\"14sp\" />\n    </RelativeLayout>\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/values/alex_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"alex_item_layout\">#FFFFFF</color>\n    <color name=\"alex_item_layout_press\">#F7F7F7</color>\n    <color name=\"alex_item_layout_ripple\">#E1E1E1</color>\n    <!--主布局的颜色，背景的主色调-->\n    <color name=\"alex_background_color\">#EEEEEE</color>\n    <!-- 标题颜色 -->\n    <color name=\"alex_title_color\">#FF5722</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_anim_alpha_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_anim_alpha\" parent=\"android:Animation\">\n        <item name=\"@android:windowEnterAnimation\">@anim/alex_dialog_anim_fade_in</item>\n        <item name=\"@android:windowExitAnimation\">@anim/alex_dialog_anim_fade_out</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_anim_bottom2top_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_anim_bottom2top\" parent=\"android:Animation\">\n        <item name=\"@android:windowEnterAnimation\">@anim/alex_dialog_anim_bottom2top_in</item>\n        <item name=\"@android:windowExitAnimation\">@anim/alex_dialog_anim_bottom2top_out</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_anim_sacle_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_anim_scale\" parent=\"android:Animation\">\n        <item name=\"@android:windowEnterAnimation\">@anim/alex_dialog_anim_scale_in</item>\n    <!--     <item name=\"@android:windowExitAnimation\">@anim/alex_dialog_anim_scale_out</item> -->\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_anim_top2bottom_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_anim_top2bottom\" parent=\"android:Animation\">\n        <item name=\"@android:windowEnterAnimation\">@anim/alex_dialog_anim_top2bottom_in</item>\n        <item name=\"@android:windowExitAnimation\">@anim/alex_dialog_anim_top2bottom_out</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_base_dim_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_base_dim_style\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@null</item>\n        <item name=\"android:windowBackground\">@null</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_base_light_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_dialog_base_light_style\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@null</item>\n        <item name=\"android:windowBackground\">@null</item>\n        <item name=\"android:backgroundDimEnabled\">false</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dialog_shadow_color_radius.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"alexDialogBodyColor\">#EEFFFFFF</color>\n    <color name=\"alexDialogShadowColor_1\">#0a8c8c8c</color>\n    <color name=\"alexDialogShadowColor_2\">#0f898989</color>\n    <color name=\"alexDialogShadowColor_3\">#14898989</color>\n    <color name=\"alexDialogShadowColor_4\">#19898989</color>\n    <color name=\"alexDialogShadowColor_5\">#1e898989</color>\n    <color name=\"alexDialogShadowColor_6\">#23898989</color>\n    <color name=\"alexDialogShadowColor_7\">#28898989</color>\n    <color name=\"alexDialogShadowColor_8\">#2d898989</color>\n    <dimen name=\"alexDialogPadding\">1px</dimen>\n    <dimen name=\"alexDialogRadius\">10dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!--顶部标题栏的 颜色-->\n    <dimen name=\"alex_title_height\">48dp</dimen>\n    <!--顶部标题栏的 标题字体大小-->\n    <dimen name=\"alex_title_text_size\">20sp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/alex_string.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"alex_digits_pwd\" >_0123456789abcdefghigjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/shadow_color_radius.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"cardBodyColor\">#FFFFFF</color>\n    <color name=\"cardShadowColor_1\">#0a8c8c8c</color>\n    <color name=\"cardShadowColor_2\">#0f898989</color>\n    <color name=\"cardShadowColor_3\">#14898989</color>\n    <color name=\"cardShadowColor_4\">#19898989</color>\n    <color name=\"cardShadowColor_5\">#1e898989</color>\n    <color name=\"cardShadowColor_6\">#23898989</color>\n    <color name=\"cardShadowColor_7\">#28898989</color>\n    <color name=\"cardShadowColor_8\">#2d898989</color>\n    <dimen name=\"cardPaddingLeft\">0px</dimen>\n    <dimen name=\"cardPaddingTop\">0px</dimen>\n    <dimen name=\"cardPaddingRight\">0px</dimen>\n    <dimen name=\"cardPaddingBottom\">1px</dimen>\n    <dimen name=\"cardRadius\">0dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/shadow_color_radius_dialog_one_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"oneButtonDialogBodyColor\">#EEFFFFFF</color>\n    <color name=\"oneButtonDialogShadowColor_1\">#0a8c8c8c</color>\n    <color name=\"oneButtonDialogShadowColor_2\">#0f898989</color>\n    <color name=\"oneButtonDialogShadowColor_3\">#14898989</color>\n    <color name=\"oneButtonDialogShadowColor_4\">#19898989</color>\n    <color name=\"oneButtonDialogShadowColor_5\">#1e898989</color>\n    <color name=\"oneButtonDialogShadowColor_6\">#23898989</color>\n    <color name=\"oneButtonDialogShadowColor_7\">#28898989</color>\n    <color name=\"oneButtonDialogShadowColor_8\">#2d898989</color>\n    <dimen name=\"oneButtonDialogPaddingLeft\">1px</dimen>\n    <dimen name=\"oneButtonDialogPaddingTop\">1px</dimen>\n    <dimen name=\"oneButtonDialogPaddingRight\">1px</dimen>\n    <dimen name=\"oneButtonDialogPaddingBottom\">1px</dimen>\n    <dimen name=\"oneButtonDialogRadius\">8dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Dialog</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.3'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\next {\n    compileSdkVersion = 25\n    buildToolsVersion = \"25.0.0\"\n    minSdkVersion = 16\n    targetSdkVersion = 21\n    libs = [\n            appcompat_v7: 'com.android.support:appcompat-v7:25.0.1',\n            design      : 'com.android.support:design:25.0.1',\n            recyclerview: 'com.android.support:recyclerview-v7:25.0.1',\n    ]\n}\n\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "dialog/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "dialog/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(include: ['*.jar'], dir: 'libs')\n\n    Map<String, String> libs = rootProject.ext.libs\n    compile libs.appcompat_v7\n}\n"
  },
  {
    "path": "dialog/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in E:\\Android\\sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "dialog/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"org.alex.dialog\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/anim/BaseAnimatorSet.java",
    "content": "package org.alex.dialog.anim;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorSet;\nimport android.view.View;\nimport android.view.animation.Interpolator;\n\n/**\n * 作者：Alex\n * 时间：2016年09月10日    12:58\n * 简述：\n */\n\npublic abstract class BaseAnimatorSet {\n    /**\n     * 动画时长,系统默认250\n     */\n    protected long duration = 500;\n    protected AnimatorSet animatorSet = new AnimatorSet();\n    private Interpolator interpolator;\n    private long delay;\n    private AnimatorListener listener;\n\n    public abstract void setAnimation(View view);\n\n    protected void start(final View view) {\n        /** 设置动画中心点:pivotX--->X轴方向动画中心点,pivotY--->Y轴方向动画中心点 */\n        // ViewHelper.setPivotX(view, view.getMeasuredWidth() / 2.0f);\n        // ViewHelper.setPivotY(view, view.getMeasuredHeight() / 2.0f);\n        reset(view);\n        setAnimation(view);\n\n        animatorSet.setDuration(duration);\n        if (interpolator != null) {\n            animatorSet.setInterpolator(interpolator);\n        }\n\n        if (delay > 0) {\n            animatorSet.setStartDelay(delay);\n        }\n\n        if (listener != null) {\n            animatorSet.addListener(new Animator.AnimatorListener() {\n                @Override\n                public void onAnimationStart(Animator animator) {\n                    listener.onAnimationStart(animator);\n                }\n\n                @Override\n                public void onAnimationRepeat(Animator animator) {\n                    listener.onAnimationRepeat(animator);\n                }\n\n                @Override\n                public void onAnimationEnd(Animator animator) {\n                    listener.onAnimationEnd(animator);\n                }\n\n                @Override\n                public void onAnimationCancel(Animator animator) {\n                    listener.onAnimationCancel(animator);\n                }\n            });\n        }\n\n        animatorSet.start();\n    }\n\n    public static void reset(View view) {\n        view.setAlpha(1);\n        view.setScaleX(1);\n        view.setScaleY(1);\n        view.setTranslationX(0);\n        view.setTranslationY(0);\n        view.setRotation(0);\n        view.setRotationY(0);\n        view.setRotationX(0);\n    }\n\n    /**\n     * 设置动画时长\n     */\n    public BaseAnimatorSet duration(long duration) {\n        this.duration = duration;\n        return this;\n    }\n\n    /**\n     * 设置动画时长\n     */\n    public BaseAnimatorSet delay(long delay) {\n        this.delay = delay;\n        return this;\n    }\n\n    /**\n     * 设置动画插补器\n     */\n    public BaseAnimatorSet interpolator(Interpolator interpolator) {\n        this.interpolator = interpolator;\n        return this;\n    }\n\n    /**\n     * 动画监听\n     */\n    public BaseAnimatorSet listener(AnimatorListener listener) {\n        this.listener = listener;\n        return this;\n    }\n\n    /**\n     * 在View上执行动画\n     */\n    public void playOn(View view) {\n        start(view);\n    }\n\n    public interface AnimatorListener {\n        void onAnimationStart(Animator animator);\n\n        void onAnimationRepeat(Animator animator);\n\n        void onAnimationEnd(Animator animator);\n\n        void onAnimationCancel(Animator animator);\n    }\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/annotation/AnimType.java",
    "content": "package org.alex.dialog.annotation;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Inherited;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 作者：Alex\n * <br/>\n * 时间：2016/9/5 18:05\n * <br/>\n * 简述：\n */\n@SuppressWarnings(\"all\")\n@Documented\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.SOURCE)\n@Inherited\n@IntDef(value = {\n        AnimType.CENTER_NORMAL,\n        AnimType.CENTER_SCALE,\n        AnimType.BOTTOM_2_TOP,\n        AnimType.TOP_2_BOTTOM\n\n})\n\npublic @interface AnimType {\n    /**\n     * 居中 无效果\n     */\n    public static final int CENTER_NORMAL = 0;\n    /**\n     * 居中缩放\n     * 进入：居中，由小变大\n     * 退出：居中，由大变小\n     */\n    public static final int CENTER_SCALE = 1;\n    /**\n     * 底部进入\n     * 进入：从底部，到顶部\n     * 退出：从顶部，到底部\n     */\n    public static final int BOTTOM_2_TOP = 2;\n    /**\n     * 顶部进入\n     * 进入：从顶部，到底部\n     * 退出：从底部，到顶部\n     */\n    public static final int TOP_2_BOTTOM = 3;\n\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/annotation/ClickPosition.java",
    "content": "package org.alex.dialog.annotation;\n\nimport android.support.annotation.StringDef;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Inherited;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 作者：Alex\n * <br/>\n * 时间：2016/9/5 17:59\n * <br/>\n * 简述：\n */\n@SuppressWarnings(\"all\")\n@Documented\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.SOURCE)\n@Inherited\n@StringDef(value = {\n        ClickPosition.LEFT,\n        ClickPosition.TOP,\n        ClickPosition.RIGHT,\n        ClickPosition.BOTTOM,\n        ClickPosition.CENTER,\n        ClickPosition.SUBMIT,\n        ClickPosition.CANCEL,\n        ClickPosition.OPEN,\n        ClickPosition.CLOSE,\n        ClickPosition.AGREE,\n        ClickPosition.REFUSE,\n        ClickPosition.ACCEPT,\n        ClickPosition.UPDATE,\n        ClickPosition.DELETE,\n        ClickPosition.ALTER,\n        ClickPosition.FORGET,\n        ClickPosition.IGNORE,\n        ClickPosition.STOP,\n        ClickPosition.SEND\n})\n\npublic @interface ClickPosition {\n    /**\n     * 左按钮\n     */\n    public static final String LEFT = \"LEFT\";\n\n    /**\n     * 顶部按钮\n     */\n    public static final String TOP = \"TOP\";\n    /**\n     * 右按钮\n     */\n    public static final String RIGHT = \"RIGHT\";\n    /**\n     * 底部按钮\n     */\n    public static final String BOTTOM = \"BOTTOM\";\n    /**\n     * 中间按钮\n     */\n    public static final String CENTER = \"CENTER\";\n    /**\n     * 确定按钮\n     */\n    public static final String SUBMIT = \"SUBMIT\";\n    /**\n     * 取消按钮\n     */\n    public static final String CANCEL = \"CANCEL\";\n\n    /**\n     * 关闭按钮\n     */\n    public static final String CLOSE = \"CLOSE\";\n    /**\n     * 打开按钮\n     */\n    public static final String OPEN = \"OPEN\";\n    /**\n     * 同意按钮\n     */\n    public static final String AGREE = \"AGREE\";\n    /**\n     * 拒绝按钮\n     */\n    public static final String REFUSE = \"REFUSE\";\n    /**\n     * 接受按钮\n     */\n    public static final String ACCEPT = \"ACCEPT\";\n    /**\n     * 升级按钮\n     */\n    public static final String UPDATE = \"UPDATE\";\n    /**\n     * 删除按钮\n     */\n    public static final String DELETE = \"DELETE\";\n    /**\n     * 修改按钮\n     */\n    public static final String ALTER = \"ALTER\";\n    /**\n     * 忘记按钮\n     */\n    public static final String FORGET = \"FORGET\";\n    /**\n     * 忽略按钮\n     */\n    public static final String IGNORE = \"IGNORE\";\n    /**\n     * 停止按钮\n     */\n    public static final String STOP = \"STOP\";\n    /**\n     * 发送按钮\n     */\n    public static final String SEND = \"SEND\";\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/annotation/OnKeyType.java",
    "content": "package org.alex.dialog.annotation;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Inherited;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 作者：Alex\n * <br/>\n * 时间：2016/9/5 18:05\n * <br/>\n * 简述：\n */\n@SuppressWarnings(\"all\")\n@Documented\n@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.SOURCE)\n@Inherited\n@IntDef(value = {OnKeyType.DISMISS_KILL_ACTIVITY, OnKeyType.DISMISS_NOT_KILL_ACTIVITY, OnKeyType.NOT_DISMISS_NOT_KILL_ACTIVITY})\n\npublic @interface OnKeyType {\n    /**\n     * 隐藏对话框 - 结束Activity\n     */\n    public static final int DISMISS_KILL_ACTIVITY = 0;\n    /**\n     * 隐藏对话框 - 不结束Activity\n     */\n    public static final int DISMISS_NOT_KILL_ACTIVITY = 1;\n    /**\n     * 不隐藏对话框 - 不结束Activity\n     */\n    public static final int NOT_DISMISS_NOT_KILL_ACTIVITY = 2;\n\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/base/BaseDialog.java",
    "content": "package org.alex.dialog.base;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.graphics.drawable.ColorDrawable;\nimport android.support.annotation.IdRes;\nimport android.support.annotation.LayoutRes;\nimport android.support.annotation.NonNull;\nimport android.util.DisplayMetrics;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.EditText;\nimport android.widget.FrameLayout;\nimport android.widget.TextView;\n\nimport org.alex.dialog.annotation.AnimType;\nimport org.alex.dialog.annotation.ClickPosition;\nimport org.alex.dialog.callback.OnDialogClickListener;\nimport org.alex.dialog.callback.SimpleOnKeyListener;\nimport org.alex.dialog.helper.OnClickHelper;\nimport org.alex.dialog.util.StatusBarUtils;\n\n/**\n * 作者：Alex\n * 时间：2016年09月10日    15:20\n * 简述：\n */\n\n@SuppressWarnings(\"all\")\npublic abstract class BaseDialog<D extends BaseDialog> extends Dialog implements View.OnClickListener {\n    /**\n     * 对话框 根视图\n     */\n    protected View rootView;\n\n    /**\n     * dialog width scale(宽度比例)\n     */\n    protected float scaleWidth = 1;\n    /**\n     * dialog height scale(高度比例)\n     */\n    protected float scaleHeight;\n    /**\n     * max height(最大高度)\n     */\n    protected float maxHeight;\n    /**\n     * (DisplayMetrics)设备密度\n     */\n    protected DisplayMetrics displayMetrics;\n    protected Context context;\n    protected int gravity;\n    protected int animType;\n    /**\n     * Dialog的标记\n     */\n    public Object tag;\n    public OnDialogClickListener onDialogClickListener;\n\n    /**\n     * Creates a dialog window that uses the default dialog theme.\n     * <p>\n     * The supplied {@code context} is used to obtain the window manager and\n     * base theme used to present the dialog.\n     *\n     * @param context the context in which the dialog should run\n     * @see android.R.styleable#Theme_dialogTheme\n     */\n    public BaseDialog(Context context) {\n        super(context);\n        this.context = context;\n        initBaseDialogTheme();\n        initDialog();\n    }\n\n    public BaseDialog(Context context, int theme) {\n        super(context, theme);\n        this.context = context;\n        initBaseDialogTheme();\n        initDialog();\n    }\n\n    protected void initDialog() {\n        displayMetrics = getContext().getResources().getDisplayMetrics();\n        maxHeight = displayMetrics.heightPixels - StatusBarUtils.getHeight(context);\n        rootView = LayoutInflater.from(getContext()).inflate(getLayoutRes(), null);\n        tag = getClass().getSimpleName();\n        setContentView(rootView);\n        setCanceledOnTouchOutside(false);\n        OnClickHelper.getInstance().onBindClickListener(rootView, this);\n        onCreateData();\n    }\n\n    /**\n     * 配置 对话框的 布局文件\n     */\n    @LayoutRes\n    public abstract int getLayoutRes();\n\n    /**\n     * 在 这里 进行 findView  设置点击事件\n     */\n    public abstract void onCreateData();\n\n    public D tag(@NonNull Object tag) {\n        if (tag != null) {\n            this.tag = tag;\n        }\n        return (D) this;\n    }\n\n    public Object tag() {\n        return tag;\n    }\n\n    /**\n     * 设置监听器\n     */\n    public D setOnDialogClickListener(OnDialogClickListener onDialogClickListener) {\n        this.onDialogClickListener = onDialogClickListener;\n        return (D) this;\n    }\n\n    /**\n     * 销毁一切资源\n     */\n    public void destody() {\n        super.dismiss();\n        context = null;\n        rootView.destroyDrawingCache();\n        rootView = null;\n        displayMetrics = null;\n        onDialogClickListener = null;\n    }\n\n    /**\n     * 设置 对话框 高度比 (0, 1]\n     */\n    public D setScaleHeight(float scaleHeight) {\n        this.scaleHeight = scaleHeight;\n        return (D) this;\n    }\n\n    /**\n     * 设置 对话框 宽度比 (0, 1]\n     */\n    public D setScaleWidth(float scaleWidth) {\n        this.scaleWidth = scaleWidth;\n        return (D) this;\n    }\n\n    @Override\n    public void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        int width;\n        if (scaleWidth == 0) {\n            width = ViewGroup.LayoutParams.WRAP_CONTENT;\n        } else {\n            width = (int) (displayMetrics.widthPixels * scaleWidth);\n        }\n        int height;\n        if (scaleHeight == 0) {\n            height = ViewGroup.LayoutParams.WRAP_CONTENT;\n        } else if (scaleHeight == 1) {\n            height = ViewGroup.LayoutParams.MATCH_PARENT;\n        } else {\n            height = (int) (maxHeight * scaleHeight);\n        }\n        rootView.setLayoutParams(new FrameLayout.LayoutParams(width, height));\n    }\n\n    /**\n     * set dialog theme(设置对话框主题)\n     */\n    protected void initBaseDialogTheme() {\n        animType = AnimType.CENTER_NORMAL;\n        /*android:windowNoTitle*/\n        requestWindowFeature(Window.FEATURE_NO_TITLE);\n        Window window = getWindow();\n        /* android:windowBackground*/\n        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));\n        /*android:backgroundDimEnabled默认是true的*/\n        //window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);\n    }\n\n    public <T extends View> T findView(@IdRes int id) {\n        return (T) rootView.findViewById(id);\n    }\n\n\n    public D setText(@IdRes int id, @NonNull String text) {\n        View view = findView(id);\n        setText(view, text);\n        return (D) this;\n    }\n\n    public D setText(@NonNull View view, @NonNull String text) {\n        if ((view == null) || (text == null)) {\n            return (D) this;\n        }\n        if (view instanceof TextView) {\n            ((TextView) view).setText(text);\n        }\n        if (view instanceof EditText) {\n            ((EditText) view).setSelection(text.length());\n        }\n        return (D) this;\n    }\n\n    public D setOnCilckListener(@IdRes int id) {\n        View view = findView(id);\n        if (view == null) {\n            return (D) this;\n        }\n        view.setOnClickListener(this);\n        return (D) this;\n    }\n\n    public D setOnCilckListener(@IdRes int... id) {\n        for (int i = 0; (id != null) && (i < id.length); i++) {\n            setOnCilckListener(id[i]);\n        }\n        return (D) this;\n    }\n\n    /**\n     * 处理按钮点击事件 并绑定 onDialogClickListener\n     */\n    @Override\n    public void onClick(View v) {\n        onClick(v, v.getId());\n    }\n\n    /**\n     * 处理按钮点击事件 并绑定 onDialogClickListener\n     */\n    public abstract void onClick(View v, int id);\n\n    public void onDialogClickListener(@ClickPosition String clickPosition) {\n        if (onDialogClickListener != null) {\n            onDialogClickListener.onDialogClick((D) this, clickPosition);\n        }\n    }\n\n    /**\n     * 设置 物理按键的 监听事件\n     *\n     * @param simpleOnKeyListener\n     */\n    public D setOnKeyListener(SimpleOnKeyListener simpleOnKeyListener) {\n        super.setOnKeyListener(simpleOnKeyListener);\n        return (D) this;\n    }\n\n    /**\n     * 设置对话框的显示位置\n     */\n    public D setGravity(int gravity) {\n        this.gravity = gravity;\n        Window dialogWindow = getWindow();\n        dialogWindow.setGravity(gravity);\n        return (D) this;\n    }\n\n    /**\n     * 设置对话框的显示位置，以及Y轴的向下偏移量（单位 dp）\n     */\n    public D setGravity(int gravity, int yDP) {\n        this.gravity = gravity;\n        Window dialogWindow = getWindow();\n        WindowManager.LayoutParams lp = dialogWindow.getAttributes();\n        lp.x = 0;\n        lp.y = (int) (yDP * context.getResources().getDisplayMetrics().density);\n        dialogWindow.setGravity(gravity);\n        return (D) this;\n    }\n\n    public D setAnimType(@AnimType int animType) {\n        this.animType = animType;\n        /*如果根据  AnimType 的类型，强制选择Dialog出现的位置*/\n        if (AnimType.BOTTOM_2_TOP == animType) {\n            setGravity(Gravity.BOTTOM);\n        } else if (AnimType.TOP_2_BOTTOM == animType) {\n            setGravity(Gravity.TOP);\n        } else if (AnimType.CENTER_SCALE == animType) {\n            setGravity(Gravity.CENTER);\n        } else if (AnimType.CENTER_NORMAL == animType) {\n            setGravity(Gravity.CENTER);\n        }\n        return (D) this;\n    }\n\n    private void attachView(View view) {\n        int[] position = new int[2];\n        view.getLocationInWindow(position);\n\n        Window window = getWindow();\n        WindowManager.LayoutParams params = window.getAttributes();\n\n        window.setGravity(Gravity.LEFT | Gravity.TOP);\n        params.x = position[0] + getViewWidth(view) / 2;\n        params.y = position[1] + getViewHeight(view) / 2;\n\n        window.setAttributes(params);\n    }\n\n    /**\n     * 测量这个view\n     * 最后通过getMeasuredWidth()获取宽度和高度.\n     *\n     * @param view 要测量的view\n     * @return 测量过的view\n     */\n    private void measureView(View view) {\n        ViewGroup.LayoutParams p = view.getLayoutParams();\n        if (p == null) {\n            p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);\n        }\n\n        int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);\n        int lpHeight = p.height;\n        int childHeightSpec;\n        if (lpHeight > 0) {\n            childHeightSpec = View.MeasureSpec.makeMeasureSpec(lpHeight, View.MeasureSpec.EXACTLY);\n        } else {\n            childHeightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);\n        }\n        view.measure(childWidthSpec, childHeightSpec);\n    }\n\n    /**\n     * 获得这个View的宽度\n     * 测量这个view，最后通过getMeasuredWidth()获取宽度.\n     *\n     * @param view 要测量的view\n     * @return 测量过的view的宽度\n     */\n    protected int getViewWidth(View view) {\n        measureView(view);\n        return view.getMeasuredWidth();\n    }\n\n    /**\n     * 获得这个View的高度\n     * 测量这个view，最后通过getMeasuredHeight()获取高度.\n     *\n     * @param view 要测量的view\n     * @return 测量过的view的高度\n     */\n    protected int getViewHeight(View view) {\n        measureView(view);\n        return view.getMeasuredHeight();\n    }\n}\n\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/callback/OnDialogClickListener.java",
    "content": "package org.alex.dialog.callback;\n\nimport android.app.Dialog;\n\nimport org.alex.dialog.annotation.ClickPosition;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    21:29\n * 简述：\n */\n@SuppressWarnings(\"all\")\npublic interface OnDialogClickListener<D extends Dialog>\n{\n\tpublic  void onDialogClick(D dialog, @ClickPosition String clickPosition);\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/callback/OnWait2DismissListener.java",
    "content": "package org.alex.dialog.callback;\n\nimport android.app.Dialog;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    21:29\n * 简述：\n */\n@SuppressWarnings(\"all\")\npublic interface OnWait2DismissListener<D extends Dialog> {\n    /**\n     * @param second 为零的时候  对话框结束\n     */\n    public void onDismiss(D dialog, int second);\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/callback/SimpleOnKeyListener.java",
    "content": "package org.alex.dialog.callback;\n\nimport android.app.Activity;\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnKeyListener;\nimport android.view.KeyEvent;\n\nimport org.alex.dialog.annotation.OnKeyType;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    21:29\n * 简述：\n */\n@SuppressWarnings(\"all\")\npublic class SimpleOnKeyListener implements OnKeyListener {\n    private Activity activity;\n    private int onKeyType;\n\n    public SimpleOnKeyListener(Activity activity, @OnKeyType int onKeyType) {\n        this.onKeyType = onKeyType;\n        this.activity = activity;\n    }\n\n    public static SimpleOnKeyListener dismissNotKillActivity(Activity activity) {\n        return new SimpleOnKeyListener(activity, OnKeyType.DISMISS_NOT_KILL_ACTIVITY);\n    }\n\n    public static SimpleOnKeyListener dismissKillActivity(Activity activity) {\n        return new SimpleOnKeyListener(activity, OnKeyType.DISMISS_KILL_ACTIVITY);\n    }\n\n    public static SimpleOnKeyListener notDismissNotKillActivity(Activity activity) {\n        return new SimpleOnKeyListener(activity, OnKeyType.NOT_DISMISS_NOT_KILL_ACTIVITY);\n    }\n\n    @Override\n    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {\n        if (keyCode == KeyEvent.KEYCODE_BACK) {\n            if (OnKeyType.DISMISS_KILL_ACTIVITY == onKeyType) {\n                dialog.dismiss();\n                activity.finish();\n            } else if (OnKeyType.DISMISS_NOT_KILL_ACTIVITY == onKeyType) {\n                dialog.dismiss();\n            } else if (OnKeyType.NOT_DISMISS_NOT_KILL_ACTIVITY == onKeyType) {\n\n            }\n        }\n        return true;\n    }\n\n}"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/helper/OnClickHelper.java",
    "content": "//\n// Source code recreated from a .class file by IntelliJ IDEA\n// (powered by Fernflower decompiler)\n//\n\npackage org.alex.dialog.helper;\n\nimport android.support.annotation.NonNull;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\n\n\npublic class OnClickHelper {\n    private static OnClickHelper OnClickHelper;\n\n    private OnClickHelper() {\n    }\n\n    public static OnClickHelper getInstance() {\n        if(OnClickHelper == null) {\n            Class var0 = OnClickHelper.class;\n            synchronized(OnClickHelper.class) {\n                OnClickHelper = OnClickHelper == null?new OnClickHelper():OnClickHelper;\n            }\n        }\n\n        return OnClickHelper;\n    }\n\n    public void onBindClickListener(@NonNull View contentView, @NonNull OnClickListener onClickListener) {\n        this.setOnClickListener(contentView, onClickListener);\n    }\n\n    private void setOnClickListener(@NonNull View view, @NonNull OnClickListener onClickListener) {\n        if(view == null) {\n            //LogUtil.w(\"控件为空\");\n        } else {\n            view.setOnClickListener(onClickListener);\n            if(view instanceof ViewGroup) {\n                this.setOnClickListener((ViewGroup)view, onClickListener);\n            }\n\n        }\n    }\n\n    private void setOnClickListener(@NonNull ViewGroup viewGroup, @NonNull OnClickListener onClickListener) {\n        try {\n            viewGroup.setOnClickListener(onClickListener);\n\n            for(int e = 0; e < viewGroup.getChildCount(); ++e) {\n                View v = viewGroup.getChildAt(e);\n                if(v instanceof ViewGroup) {\n                    this.setOnClickListener((ViewGroup)v, onClickListener);\n                } else if(v != null && v instanceof View) {\n                    v.setOnClickListener(onClickListener);\n                }\n            }\n        } catch (Exception var5) {\n            //LogUtil.e(var5);\n        }\n\n    }\n}\n"
  },
  {
    "path": "dialog/src/main/java/org/alex/dialog/util/StatusBarUtils.java",
    "content": "package org.alex.dialog.util;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.util.Log;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    21:29\n * 简述：\n */\n@SuppressWarnings(\"all\")\npublic class StatusBarUtils {\n    public static int getHeight(Context context) {\n        int statusBarHeight = 0;\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);\n        }\n        Log.d(StatusBarUtils.class.getSimpleName(), \"statusBarHeight--->\" + statusBarHeight);\n        if (isFlymeOs4x()) {\n            return 2 * statusBarHeight;\n        }\n\n        return statusBarHeight;\n    }\n\n    public static boolean isFlymeOs4x() {\n        String sysVersion = android.os.Build.VERSION.RELEASE;\n        if (\"4.4.4\".equals(sysVersion)) {\n            String sysIncrement = android.os.Build.VERSION.INCREMENTAL;\n            String displayId = android.os.Build.DISPLAY;\n            if (!TextUtils.isEmpty(sysIncrement)) {\n                return sysIncrement.contains(\"Flyme_OS_4\");\n            } else {\n                return displayId.contains(\"Flyme OS 4\");\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "dialog/src/main/res/values/alex_theme_no_title_app.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"alex_theme_no_title\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"android:windowActionBar\">false</item>\n        <item name=\"android:windowNoTitle\">true</item>\n    </style>\n</resources>"
  },
  {
    "path": "dialog/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Dialog</string>\n</resources>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':dialog', ':sweeploadingview'\n"
  },
  {
    "path": "sweeploadingview/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "sweeploadingview/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n\n    defaultConfig {\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    Map<String, String> libs = rootProject.ext.libs\n    compile libs.appcompat_v7\n}\n"
  },
  {
    "path": "sweeploadingview/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in E:\\Android\\sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "sweeploadingview/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"org.alex.sweeploadingview\">\n\n    <application android:allowBackup=\"true\"\n                 android:label=\"@string/app_name\"\n                 android:supportsRtl=\"true\"\n    >\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "sweeploadingview/src/main/java/org/alex/callback/SimpleAnimatorListener.java",
    "content": "package org.alex.callback;\n\nimport android.animation.Animator;\n\n/**\n * 作者：Alex\n * 时间：2016年09月03日    10:06\n * 简述：\n */\n\n@SuppressWarnings(\"all\")\npublic abstract class SimpleAnimatorListener implements Animator.AnimatorListener {\n    @Override\n    public  void onAnimationStart(Animator animation){\n\n    }\n\n    @Override\n    public  void onAnimationEnd(Animator animation){\n\n    }\n\n    @Override\n    public void onAnimationCancel(Animator animation) {\n\n    }\n\n    @Override\n    public void onAnimationRepeat(Animator animation) {\n\n    }\n}\n"
  },
  {
    "path": "sweeploadingview/src/main/java/org/alex/sweeploadingview/SweepLoadingView.java",
    "content": "package org.alex.sweeploadingview;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.PaintFlagsDrawFilter;\nimport android.graphics.RectF;\nimport android.support.annotation.ColorInt;\nimport android.support.annotation.FloatRange;\nimport android.util.AttributeSet;\nimport android.util.Property;\nimport android.view.View;\nimport android.view.animation.AccelerateDecelerateInterpolator;\nimport android.view.animation.LinearInterpolator;\n\nimport org.alex.callback.SimpleAnimatorListener;\n\n\n/**\n * 作者：Alex\n * <br/>\n * 时间：2016/8/24 16:31\n * <br/>\n * 博客地址：http://www.jianshu.com/users/c3c4ea133871/subscriptions\n * <br/>\n * <br/>\n */\n@SuppressWarnings(\"all\")\npublic class SweepLoadingView extends View {\n    private RectF rectF;\n    private Paint paint;\n    private int circleColor;\n    private int circleWidth;\n    private int strokeCap;\n    /**\n     * 扫描一周 需要的时间\n     */\n    private int swipeDuration;\n    /**\n     * 起点的角度\n     */\n    private float startAngle;\n    /**\n     * 扫描的角度\n     */\n    private float sweepAngle;\n\n    /**\n     * 终点 和 起点的间隔 角度\n     */\n    private float gapAngle;\n    /**\n     * 起始点的偏移量\n     */\n    private float startAngleOffset;\n    private ObjectAnimator sweepObjectAnimator;\n    private ObjectAnimator startAngleObjectAnimator;\n    /**\n     * 扫描一周\n     */\n    private boolean isSweepRepeat;\n\n    public SweepLoadingView(Context context) {\n        super(context);\n        initView(null);\n    }\n\n    public SweepLoadingView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initView(attrs);\n    }\n\n    private void initView(AttributeSet attrs) {\n        startAngleOffset = 0;\n        isSweepRepeat = false;\n        Context context = getContext();\n        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SweepLoadingView);\n        circleWidth = typedArray.getDimensionPixelSize(R.styleable.SweepLoadingView_slv_circleWidth, 0);\n        circleColor = typedArray.getColor(R.styleable.SweepLoadingView_slv_circleColor, Color.parseColor(\"#FF5722\"));\n        strokeCap = typedArray.getInt(R.styleable.SweepLoadingView_slv_strokeCap, 0);\n        swipeDuration = typedArray.getInt(R.styleable.SweepLoadingView_slv_duration, 1200);\n        gapAngle = typedArray.getFloat(R.styleable.SweepLoadingView_slv_gapAngle, 45F);\n        rectF = new RectF();\n        paint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        paint.setStyle(Paint.Style.STROKE);\n        paint.setFlags(Paint.ANTI_ALIAS_FLAG);\n        paint.setStrokeCap((strokeCap == 0) ? Paint.Cap.ROUND : Paint.Cap.SQUARE);\n        paint.setStrokeWidth(circleWidth);\n        paint.setColor(circleColor);\n        initObjectAnimation();\n    }\n\n    private void initObjectAnimation() {\n        sweepObjectAnimator = ObjectAnimator.ofFloat(this, new AngleProperty(Float.class, \"sweepAngle\"), 360F - gapAngle * 2);\n        sweepObjectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());\n        sweepObjectAnimator.setDuration(swipeDuration);\n        sweepObjectAnimator.setRepeatCount(Integer.MAX_VALUE);\n        sweepObjectAnimator.setRepeatMode(ValueAnimator.RESTART);\n        sweepObjectAnimator.addListener(new SweepAngleAnimatorListener());\n\n        startAngleObjectAnimator = ObjectAnimator.ofFloat(this, new AngleProperty(Float.class, \"startAngle\"), 360F);\n        startAngleObjectAnimator.setInterpolator(new LinearInterpolator());\n        startAngleObjectAnimator.setDuration(1500);\n        startAngleObjectAnimator.setRepeatCount(Integer.MAX_VALUE);\n        startAngleObjectAnimator.setRepeatMode(ValueAnimator.RESTART);\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        int min = Math.min(w, h);\n        int dWidth = circleWidth / 2;\n        rectF.left = dWidth;\n        rectF.right = min - dWidth;\n        rectF.top = dWidth;\n        rectF.bottom = min - dWidth;\n    }\n\n    @Override\n    public void draw(Canvas canvas) {\n        super.draw(canvas);\n        canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));\n        float startAngle = this.startAngle - startAngleOffset;\n        float sweepAngle = this.sweepAngle;\n        if (isSweepRepeat) {\n            startAngle += sweepAngle;\n            sweepAngle = 360 - sweepAngle - gapAngle;\n        } else {\n            sweepAngle += gapAngle;\n        }\n        canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        startSweepAnimation();\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        super.onDetachedFromWindow();\n        stopSweepAnimation();\n    }\n\n    @Override\n    protected void onVisibilityChanged(View changedView, int visibility) {\n        super.onVisibilityChanged(changedView, visibility);\n        if (visibility == VISIBLE) {\n            startSweepAnimation();\n        } else {\n            stopSweepAnimation();\n        }\n    }\n\n    private void startSweepAnimation() {\n        if (!sweepObjectAnimator.isStarted()) {\n            //LogUtil.e(\"开始\");\n            sweepObjectAnimator.start();\n        }\n        if (!startAngleObjectAnimator.isStarted()) {\n            startAngleObjectAnimator.start();\n        }\n    }\n\n    private void stopSweepAnimation() {\n        //LogUtil.e(\"停止\");\n        sweepObjectAnimator.cancel();\n        startAngleObjectAnimator.cancel();\n    }\n\n    private final class SweepAngleAnimatorListener extends SimpleAnimatorListener {\n        @Override\n        public void onAnimationRepeat(Animator animation) {\n            handleSweepRepeat();\n        }\n    }\n\n    /**\n     * 处理扫描一周的 情况\n     */\n    private void handleSweepRepeat() {\n        if (isSweepRepeat) {\n            startAngleOffset = (startAngleOffset + gapAngle * 2) % 360;\n        }\n        isSweepRepeat = !isSweepRepeat;\n    }\n\n    private final class AngleProperty extends Property<SweepLoadingView, Float> {\n        private String name;\n\n        public AngleProperty(Class<Float> type, String name) {\n            super(type, name);\n            this.name = name;\n        }\n\n        @Override\n        public Float get(SweepLoadingView object) {\n            if (\"sweepAngle\".equals(name)) {\n                return object.getSweepAngle();\n            } else {\n                return object.getStartAngle();\n            }\n        }\n\n        @Override\n        public void set(SweepLoadingView object, Float value) {\n            if (\"sweepAngle\".equals(name)) {\n                object.setSweepAngle(value);\n            } else {\n                object.setStartAngle(value);\n            }\n        }\n    }\n\n    private float getSweepAngle() {\n        return sweepAngle;\n    }\n\n    private void setSweepAngle(float sweepAngle) {\n        this.sweepAngle = sweepAngle;\n        invalidate();\n    }\n\n    private float getStartAngle() {\n        return startAngle;\n    }\n\n    private void setStartAngle(float startAngle) {\n        this.startAngle = startAngle;\n        invalidate();\n    }\n\n    private void setCircleColor(@ColorInt int color) {\n        this.circleColor = color;\n        invalidate();\n    }\n\n    private void setCircleWidth(int width) {\n        if (width < 1) {\n            width = 4;\n        }\n        width = (int) dp2Px(width);\n        this.circleWidth = width;\n        invalidate();\n    }\n\n    private void setGapAngle(@FloatRange(from = 5F, to = 60F) float angle) {\n        if ((angle < 5) || (angle > 60)) {\n            angle = 45F;\n        }\n        this.gapAngle = angle;\n        invalidate();\n    }\n\n    /**\n     * 数据转换: dp---->px\n     */\n    private float dp2Px(float dp) {\n        return dp * getContext().getResources().getDisplayMetrics().density;\n    }\n}\n"
  },
  {
    "path": "sweeploadingview/src/main/res/values/alex_sweep_loading_view_attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"SweepLoadingView\">\n        <!-- 加载环的颜色 -->\n        <attr name=\"slv_circleColor\" format=\"color\"/>\n        <!-- 加载环的宽度 -->\n        <attr name=\"slv_circleWidth\" format=\"dimension\"/>\n        <!-- 较大弧度环 转一圈 需要的时间 -->\n        <attr name=\"slv_duration\" format=\"integer\"/>\n        <!-- 终点 和 起点的间隔 角度 -->\n        <attr name=\"slv_gapAngle\" format=\"float\"/>\n        <!--右按钮 的 功能 枚举-->\n        <attr name=\"slv_strokeCap\" format=\"enum\">\n            <!--两端 是 半圆形-->\n            <enum name=\"round\" value=\"0\"/>\n            <!--两端 是 矩形-->\n            <enum name=\"square\" value=\"1\"/>\n        </attr>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "sweeploadingview/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">SweepLoadingView</string>\n</resources>\n"
  }
]