Преглед на файлове

Merge pull request #91 from plusCubed/master

Fix button insets and stacking algorithm
Aidan Follestad преди 10 години
родител
ревизия
1069e86295

+ 2 - 2
build.gradle

@@ -3,8 +3,8 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:1.0.0-rc1'
-        classpath 'com.novoda:bintray-release:0.2.4'
+        classpath 'com.android.tools.build:gradle:1.0.0-rc4'
+        classpath 'com.novoda:bintray-release:0.2.5'
     }
 }
 

+ 9 - 13
library/src/main/java/com/afollestad/materialdialogs/MaterialDialog.java

@@ -8,7 +8,6 @@ import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.DataSetObserver;
 import android.graphics.Color;
-import android.graphics.Paint;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
@@ -392,13 +391,12 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
 
     private int calculateMaxButtonWidth() {
         /**
-         * Max button width = (DialogWidth - 16dp - 16dp - 8dp) / 2
+         * Max button width = (DialogWidth - Side margins) / [Number of buttons]
          * From: http://www.google.com/design/spec/components/dialogs.html#dialogs-specs
          */
         final int dialogWidth = getWindow().getDecorView().getMeasuredWidth();
-        final int eightDp = (int) getContext().getResources().getDimension(R.dimen.md_button_padding_horizontal_external);
-        final int sixteenDp = (int) getContext().getResources().getDimension(R.dimen.md_button_padding_frame_side);
-        return (dialogWidth - sixteenDp - sixteenDp - eightDp) / 2;
+        final int margins = (int) getContext().getResources().getDimension(R.dimen.md_button_padding_frame_side);
+        return (dialogWidth - 2 * margins) / numberOfActionButtons();
     }
 
     /**
@@ -432,12 +430,10 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         }
         final int maxWidth = calculateMaxButtonWidth();
         Log.v("MD_Stacking", "Max button width: " + maxWidth);
-        final Paint paint = positiveButton.getPaint();
-        final int eightDp = (int) getContext().getResources().getDimension(R.dimen.md_button_padding_horizontal_external);
         isStacked = false;
 
         if (this.positiveText != null) {
-            final int positiveWidth = (int) paint.measureText(positiveButton.getText().toString()) + eightDp;
+            final int positiveWidth = positiveButton.getWidth();
             isStacked = positiveWidth > maxWidth;
             Log.v("MD_Stacking", "Positive button width: " + positiveWidth);
         } else {
@@ -445,7 +441,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         }
 
         if (!isStacked && this.neutralText != null) {
-            final int neutralWidth = (int) paint.measureText(neutralButton.getText().toString()) + eightDp;
+            final int neutralWidth = neutralButton.getWidth();
             isStacked = neutralWidth > maxWidth;
             Log.v("MD_Stacking", "Neutral button width: " + neutralWidth);
         } else {
@@ -453,7 +449,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
         }
 
         if (!isStacked && this.negativeText != null) {
-            final int negativeWidth = (int) paint.measureText(negativeButton.getText().toString()) + eightDp;
+            final int negativeWidth = negativeButton.getWidth();
             isStacked = negativeWidth > maxWidth;
             Log.v("MD_Stacking", "Negative button width: " + negativeWidth);
         } else {
@@ -490,7 +486,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
             setTypeface(positiveButton, mediumFont);
             positiveButton.setText(this.positiveText);
             positiveButton.setTextColor(getActionTextStateList(this.positiveColor));
-            setBackgroundCompat(positiveButton, DialogUtils.resolveDrawable(getContext(), R.attr.md_selector));
+            setBackgroundCompat(positiveButton, DialogUtils.resolveDrawable(getContext(), isStacked ? R.attr.md_selector : R.attr.md_btn_selector));
             positiveButton.setTag(POSITIVE);
             positiveButton.setOnClickListener(this);
         } else {
@@ -503,7 +499,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
             setTypeface(neutralButton, mediumFont);
             neutralButton.setVisibility(View.VISIBLE);
             neutralButton.setTextColor(getActionTextStateList(this.neutralColor));
-            setBackgroundCompat(neutralButton, DialogUtils.resolveDrawable(getContext(), R.attr.md_selector));
+            setBackgroundCompat(neutralButton, DialogUtils.resolveDrawable(getContext(), isStacked ? R.attr.md_selector : R.attr.md_btn_selector));
             neutralButton.setText(this.neutralText);
             neutralButton.setTag(NEUTRAL);
             neutralButton.setOnClickListener(this);
@@ -517,7 +513,7 @@ public class MaterialDialog extends DialogBase implements View.OnClickListener,
             setTypeface(negativeButton, mediumFont);
             negativeButton.setVisibility(View.VISIBLE);
             negativeButton.setTextColor(getActionTextStateList(this.negativeColor));
-            setBackgroundCompat(negativeButton, DialogUtils.resolveDrawable(getContext(), R.attr.md_selector));
+            setBackgroundCompat(negativeButton, DialogUtils.resolveDrawable(getContext(), isStacked ? R.attr.md_selector : R.attr.md_btn_selector));
             negativeButton.setText(this.negativeText);
             negativeButton.setTag(NEGATIVE);
             negativeButton.setOnClickListener(this);

+ 1 - 1
library/src/main/res/drawable-v21/md_selector_ripple.xml → library/src/main/res/drawable-v21/md_btn_selector_ripple.xml

@@ -1,6 +1,6 @@
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
     android:color="?android:colorControlHighlight">
 
-    <item android:drawable="@drawable/md_selector" />
+    <item android:drawable="@drawable/md_btn_selector" />
 
 </ripple>

+ 1 - 1
library/src/main/res/drawable-v21/md_selector_ripple_dark.xml → library/src/main/res/drawable-v21/md_btn_selector_ripple_dark.xml

@@ -1,6 +1,6 @@
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
     android:color="?android:colorControlHighlight">
 
-    <item android:drawable="@drawable/md_selector_dark" />
+    <item android:drawable="@drawable/md_btn_selector_dark" />
 
 </ripple>

+ 17 - 0
library/src/main/res/drawable/md_btn_selected.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    android:insetBottom="@dimen/md_button_inset_vertical"
+    android:insetLeft="@dimen/md_button_inset_horizontal"
+    android:insetRight="@dimen/md_button_inset_horizontal"
+    android:insetTop="@dimen/md_button_inset_vertical">
+    <shape xmlns:android="http://schemas.android.com/apk/res/android"
+        android:shape="rectangle">
+        <corners android:radius="@dimen/md_action_corner_radius" />
+        <solid android:color="#D5D5D5" />
+        <padding
+            android:bottom="@dimen/md_button_padding_vertical"
+            android:left="@dimen/md_button_padding_horizontal"
+            android:right="@dimen/md_button_padding_horizontal"
+            android:top="@dimen/md_button_padding_vertical" />
+    </shape>
+</inset>

+ 17 - 0
library/src/main/res/drawable/md_btn_selected_dark.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+    android:insetBottom="@dimen/md_button_inset_vertical"
+    android:insetLeft="@dimen/md_button_inset_horizontal"
+    android:insetRight="@dimen/md_button_inset_horizontal"
+    android:insetTop="@dimen/md_button_inset_vertical">
+    <shape xmlns:android="http://schemas.android.com/apk/res/android"
+        android:shape="rectangle">
+        <corners android:radius="@dimen/md_action_corner_radius" />
+        <solid android:color="#404040" />
+        <padding
+            android:bottom="@dimen/md_button_padding_vertical"
+            android:left="@dimen/md_button_padding_horizontal"
+            android:right="@dimen/md_button_padding_horizontal"
+            android:top="@dimen/md_button_padding_vertical" />
+    </shape>
+</inset>

+ 7 - 0
library/src/main/res/drawable/md_btn_selector.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
+
+    <item android:drawable="@drawable/md_btn_selected" android:state_pressed="true" />
+    <item android:drawable="@drawable/md_transparent" />
+
+</selector>

+ 7 - 0
library/src/main/res/drawable/md_btn_selector_dark.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
+
+    <item android:drawable="@drawable/md_btn_selected_dark" android:state_pressed="true" />
+    <item android:drawable="@drawable/md_transparent" />
+
+</selector>

+ 0 - 1
library/src/main/res/drawable/md_item_selected.xml

@@ -2,5 +2,4 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <solid android:color="#D5D5D5" />
-    <corners android:radius="@dimen/md_action_corner_radius" />
 </shape>

+ 0 - 1
library/src/main/res/drawable/md_item_selected_dark.xml

@@ -2,5 +2,4 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <solid android:color="#404040" />
-    <corners android:radius="@dimen/md_action_corner_radius" />
 </shape>

+ 1 - 1
library/src/main/res/drawable/md_selector.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
 
-    <item android:state_pressed="true" android:drawable="@drawable/md_item_selected" />
+    <item android:drawable="@drawable/md_item_selected" android:state_pressed="true" />
     <item android:drawable="@drawable/md_transparent" />
 
 </selector>

+ 1 - 1
library/src/main/res/drawable/md_selector_dark.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
 
-    <item android:state_pressed="true" android:drawable="@drawable/md_item_selected_dark" />
+    <item android:drawable="@drawable/md_item_selected_dark" android:state_pressed="true" />
     <item android:drawable="@drawable/md_transparent" />
 
 </selector>

+ 2 - 1
library/src/main/res/values-v11/styles.xml

@@ -3,13 +3,14 @@
 
     <style name="MD_Light" parent="android:Theme.Holo.Light.Dialog">
         <item name="md_divider">@color/md_divider_black</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector</item>
         <item name="md_selector">@drawable/md_selector</item>
         <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 
     <style name="MD_Dark" parent="android:Theme.Holo.Dialog">
         <item name="md_divider">@color/md_divider_white</item>
-        <item name="md_selector">@drawable/md_selector_dark</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector_dark</item>
         <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 

+ 4 - 2
library/src/main/res/values-v21/styles.xml

@@ -3,12 +3,14 @@
 
     <style name="MD_Light" parent="android:Theme.Material.Light.Dialog.Alert">
         <item name="md_divider">@color/md_divider_black</item>
-        <item name="md_selector">@drawable/md_selector_ripple</item>
+        <item name="md_selector">?android:selectableItemBackground</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector_ripple</item>
     </style>
 
     <style name="MD_Dark" parent="android:Theme.Material.Dialog.Alert">
         <item name="md_divider">@color/md_divider_white</item>
-        <item name="md_selector">@drawable/md_selector_ripple_dark</item>
+        <item name="md_selector">?android:selectableItemBackground</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector_ripple_dark</item>
     </style>
 
 </resources>

+ 1 - 0
library/src/main/res/values/attrs.xml

@@ -2,6 +2,7 @@
 <resources>
 
     <attr name="md_selector" format="reference" />
+    <attr name="md_btn_selector" format="reference" />
     <attr name="md_divider" format="color" />
 
     <attr name="md_dark_theme" format="boolean" />

+ 14 - 7
library/src/main/res/values/dimens.xml

@@ -6,17 +6,24 @@
     <dimen name="md_dialog_frame_margin">24dp</dimen>
     <dimen name="md_main_frame_margin">16dp</dimen>
     <dimen name="md_title_margin_plainlist">8dp</dimen>
-    <dimen name="md_button_min_width">64dp</dimen>
+
+    <!-- 64dp + 8dp (left and right insets) -->
+    <dimen name="md_button_min_width">72dp</dimen>
 
     <!-- Above and below buttons, 36+12=48 for the height of the button frame -->
-    <dimen name="md_button_padding_vertical">12dp</dimen>
-    <dimen name="md_button_padding_horizontal_internal">8dp</dimen>
-    <dimen name="md_button_padding_horizontal_external">8dp</dimen>
+    <dimen name="md_button_inset_vertical">6dp</dimen>
+    <dimen name="md_button_inset_horizontal">4dp</dimen>
+    <dimen name="md_button_padding_horizontal">8dp</dimen>
+    <dimen name="md_button_padding_vertical">4dp</dimen>
+
     <dimen name="md_button_padding_horizontal_internalexternal">32dp</dimen>
-    <dimen name="md_button_padding_frame_side">16dp</dimen>
+
+    <!-- 16dp - 4dp (inset) -->
+    <dimen name="md_button_padding_frame_side">12dp</dimen>
+    <dimen name="md_neutral_button_margin">12dp</dimen>
+
     <dimen name="md_button_padding_frame_bottom">8dp</dimen>
     <dimen name="md_button_height">48dp</dimen>
-    <dimen name="md_neutral_button_margin">16dp</dimen>
 
     <dimen name="md_title_textsize">20sp</dimen>
     <dimen name="md_content_textsize">18sp</dimen>
@@ -26,6 +33,6 @@
     <dimen name="md_listitem_control_margin">16dp</dimen>
     <dimen name="md_icon_margin">16dp</dimen>
     <dimen name="md_listitem_margin_left">24dp</dimen>
-    <dimen name="md_action_corner_radius">4dp</dimen>
+    <dimen name="md_action_corner_radius">2dp</dimen>
 
 </resources>

+ 2 - 6
library/src/main/res/values/styles.xml

@@ -3,12 +3,13 @@
 
     <style name="MD_Light" parent="Theme_Light_Dialog">
         <item name="md_divider">@color/md_divider_black</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector</item>
         <item name="md_selector">@drawable/md_selector</item>
     </style>
 
     <style name="MD_Dark" parent="android:Theme.Dialog">
         <item name="md_divider">@color/md_divider_white</item>
-        <item name="md_selector">@drawable/md_selector_dark</item>
+        <item name="md_btn_selector">@drawable/md_btn_selector_dark</item>
         <item name="android:windowFrame">@null</item>
         <item name="android:windowBackground">@android:color/transparent</item>
         <item name="android:windowContentOverlay">@null</item>
@@ -35,11 +36,6 @@
         <item name="android:layout_height">@dimen/md_button_height</item>
         <item name="android:minWidth">@dimen/md_button_min_width</item>
 
-        <item name="android:paddingTop">@dimen/md_button_padding_vertical</item>
-        <item name="android:paddingBottom">@dimen/md_button_padding_vertical</item>
-        <item name="android:paddingLeft">@dimen/md_button_padding_horizontal_internal</item>
-        <item name="android:paddingRight">@dimen/md_button_padding_horizontal_internal</item>
-        <item name="android:layout_marginLeft">@dimen/md_button_padding_horizontal_external</item>
     </style>
 
     <!-- Light dialog theme for devices prior Honeycomb -->