Quellcode durchsuchen

Long pressing preset color circles in the color chooser will show their hex in a toast tooltip, resolves https://github.com/afollestad/material-dialogs/issues/778

Aidan Follestad vor 9 Jahren
Ursprung
Commit
8f8ab21b9e

+ 32 - 1
commons/src/main/java/com/afollestad/materialdialogs/color/CircleView.java

@@ -6,6 +6,7 @@ import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.RippleDrawable;
 import android.graphics.drawable.ShapeDrawable;
@@ -15,9 +16,13 @@ import android.os.Build;
 import android.support.annotation.ColorInt;
 import android.support.annotation.ColorRes;
 import android.support.annotation.FloatRange;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
 import android.util.TypedValue;
+import android.view.Gravity;
 import android.widget.FrameLayout;
+import android.widget.Toast;
 
 import com.afollestad.materialdialogs.util.DialogUtils;
 
@@ -141,7 +146,7 @@ public class CircleView extends FrameLayout {
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         final int outerRadius = getMeasuredWidth() / 2;
-        if(mSelected) {
+        if (mSelected) {
             final int whiteRadius = outerRadius - borderWidthLarge;
             final int innerRadius = whiteRadius - borderWidthSmall;
             canvas.drawCircle(getMeasuredWidth() / 2,
@@ -200,4 +205,30 @@ public class CircleView extends FrameLayout {
     public static int shiftColorUp(@ColorInt int color) {
         return shiftColor(color, 1.1f);
     }
+
+    public void showHint(int color) {
+        final int[] screenPos = new int[2];
+        final Rect displayFrame = new Rect();
+        getLocationOnScreen(screenPos);
+        getWindowVisibleDisplayFrame(displayFrame);
+        final Context context = getContext();
+        final int width = getWidth();
+        final int height = getHeight();
+        final int midy = screenPos[1] + height / 2;
+        int referenceX = screenPos[0] + width / 2;
+        if (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_LTR) {
+            final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
+            referenceX = screenWidth - referenceX; // mirror
+        }
+        Toast cheatSheet = Toast.makeText(context, String.format("#%06X", 0xFFFFFF & color), Toast.LENGTH_SHORT);
+        if (midy < displayFrame.height()) {
+            // Show along the top; follow action buttons
+            cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX,
+                    screenPos[1] + height - displayFrame.top);
+        } else {
+            // Show along the bottom center
+            cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
+        }
+        cheatSheet.show();
+    }
 }

+ 16 - 3
commons/src/main/java/com/afollestad/materialdialogs/color/ColorChooserDialog.java

@@ -41,7 +41,7 @@ import java.lang.annotation.RetentionPolicy;
  * @author Aidan Follestad (afollestad)
  */
 @SuppressWarnings({"FieldCanBeLocal", "ConstantConditions"})
-public class ColorChooserDialog extends DialogFragment implements View.OnClickListener {
+public class ColorChooserDialog extends DialogFragment implements View.OnClickListener, View.OnLongClickListener {
 
     @Retention(RetentionPolicy.SOURCE)
     @StringDef({
@@ -153,7 +153,8 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
     @Override
     public void onClick(View v) {
         if (v.getTag() != null) {
-            final int index = (Integer) v.getTag();
+            final String[] tag = ((String) v.getTag()).split(":");
+            final int index = Integer.parseInt(tag[0]);
             final MaterialDialog dialog = (MaterialDialog) getDialog();
             final Builder builder = getBuilder();
 
@@ -174,6 +175,17 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
         }
     }
 
+    @Override
+    public boolean onLongClick(View v) {
+        if (v.getTag() != null) {
+            final String[] tag = ((String) v.getTag()).split(":");
+            final int color = Integer.parseInt(tag[1]);
+            ((CircleView) v).showHint(color);
+            return true;
+        }
+        return false;
+    }
+
     private void invalidateDynamicButtonColors() {
         final MaterialDialog dialog = (MaterialDialog) getDialog();
         if (dialog == null) return;
@@ -500,8 +512,9 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
             if (isInSub())
                 child.setSelected(subIndex() == position);
             else child.setSelected(topIndex() == position);
-            child.setTag(position);
+            child.setTag(String.format("%d:%d", position, color));
             child.setOnClickListener(ColorChooserDialog.this);
+            child.setOnLongClickListener(ColorChooserDialog.this);
             return convertView;
         }
     }