gpt4 book ai didi

android - Material 设计调色板

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:46 28 4
gpt4 key购买 nike

Google 设计了一个 color palette .给定一种颜色,我想在 Android 中动态创建调色板。

Graphic Design site 中也有类似的问题和 an open source javascript solution生成类似的调色板。找到每种颜色的因子 here用于创建颜色的函数可在 this stackoverflow answer 中找到.

我使用该答案和项目生成了一个类似于 Google 的调色板。但是,我想要一种能够返回 Google 生成的准确值的算法(请参阅第一个链接)。

问题:Google 如何计算 Material 设计的调色板颜色?


到目前为止我尝试了什么:

根据以上信息,我创建了这个示例来展示我如何生成类似的调色板。同样,我想要确切的值。

import android.app.Activity;
import android.app.AlertDialog;
import android.graphics.Color;
import android.os.AsyncTask;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.List;

/**
* @author Jared Rummler <jared.rummler@gmail.com>
*/
public class PaletteTask extends AsyncTask<Integer, Void, List<PaletteTask.Shade>> {

private static int shadeColor(int color, double percent) {
return shadeColor(String.format("#%06X", (0xFFFFFF & color)), percent);
}

private static int shadeColor(String color, double percent) {
long f = Long.parseLong(color.substring(1), 16);
double t = percent < 0 ? 0 : 255;
double p = percent < 0 ? percent * -1 : percent;
long R = f >> 16;
long G = f >> 8 & 0x00FF;
long B = f & 0x0000FF;
int red = (int) (Math.round((t - R) * p) + R);
int green = (int) (Math.round((t - G) * p) + G);
int blue = (int) (Math.round((t - B) * p) + B);
return Color.rgb(red, green, blue);
}

private final WeakReference<Activity> activityWeakReference;

private final List<Shade> shades = new LinkedList<>();

{
shades.add(new Shade(0.9, "50"));
shades.add(new Shade(0.7, "100"));
shades.add(new Shade(0.5, "200"));
shades.add(new Shade(0.333, "300"));
shades.add(new Shade(0.166, "400"));
shades.add(new Shade(0, "500"));
shades.add(new Shade(-0.125, "600"));
shades.add(new Shade(-0.25, "700"));
shades.add(new Shade(-0.375, "800"));
shades.add(new Shade(-0.5, "900"));
shades.add(new Shade(0.7, "A100"));
shades.add(new Shade(0.5, "A200"));
shades.add(new Shade(0.166, "A400"));
shades.add(new Shade(-0.25, "A700"));
}

public PaletteTask(Activity activity) {
activityWeakReference = new WeakReference<>(activity);
}

@Override protected List<Shade> doInBackground(Integer... colors) {

for (Shade shade : shades) {
shade.color = shadeColor(colors[0], shade.percent);
}

return shades;
}

@Override protected void onPostExecute(List<Shade> shades) {
Activity activity = activityWeakReference.get();
if (activity == null || activity.isFinishing()) {
return;
}

// Create a dialog that shows our generated colors:

ScrollView scrollView = new ScrollView(activity);
LinearLayout linearLayout = new LinearLayout(activity);
linearLayout.setOrientation(LinearLayout.VERTICAL);

int width, height;
width = LinearLayout.LayoutParams.MATCH_PARENT;
height = (int) (30/*dp*/ * (activity.getResources().getDisplayMetrics().densityDpi / 160f));

// add each color
for (Shade shade : shades) {
LinearLayout layoutColor = new LinearLayout(activity);
TextView textView = new TextView(activity);

layoutColor.setLayoutParams(new LinearLayout.LayoutParams(width, height));
layoutColor.setBackgroundColor(shade.color);
layoutColor.setGravity(Gravity.CENTER);

textView.setText(shade.name + " " + String.format("#%06X", (0xFFFFFF & shade.color)));

layoutColor.addView(textView);
linearLayout.addView(layoutColor);
}

scrollView.addView(linearLayout);

new AlertDialog.Builder(activity).setView(scrollView).show();
}

public static class Shade {

final double percent;
final String name;
int color;

public Shade(double percent, String name) {
this.percent = percent;
this.name = name;
}
}

}

调用AsynTask:

int materialRed500 = 0xFFF44336;
new PaletteTask(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, materialRed500);

根据上述代码创建的对话框:

color palette dialog

最佳答案

最重要的是,您无法使用始终与相应的 Google Material Design 调色板完全匹配的单一颜色生成调色板

这是因为调色板都遵循不同的颜色渐变。例如,红色调色板是使用以下进程生成的(JS 代码使用 TinyColor.js,但您仍然可以看到 HSL 修改):

return [
{ hex : tinycolor( hex ).lighten( 37.7 ).saturate( 10.4 ).spin( -13 ).toHexString(), name : '50' },
{ hex : tinycolor( hex ).lighten( 31.8 ).saturate( 10.4 ).spin( -9.5 ).toHexString(), name : '100' },
{ hex : tinycolor( hex ).lighten( 18.7 ).desaturate( 17 ).spin( -3.9 ).toHexString(), name : '200' },
{ hex : tinycolor( hex ).lighten( 9.1 ).desaturate( 20.9 ).spin( -4 ).toHexString(), name : '300' },
{ hex : tinycolor( hex ).lighten( 4.1 ).desaturate( 6.6 ).spin( -3 ).toHexString(), name : '400' },
{ hex : hex, name : '500' },
{ hex : tinycolor( hex ).darken( 3.1 ).desaturate( 12.4 ).spin( -2.7 ).toHexString(), name: '600' },
{ hex : tinycolor( hex ).darken( 7.8 ).desaturate( 24.5 ).spin( -4 ).toHexString(), name: '700' },
{ hex : tinycolor( hex ).darken( 11.7 ).desaturate( 23.2 ).spin( -4 ).toHexString(), name: '800' },
{ hex : tinycolor( hex ).darken( 17 ).desaturate( 16.1 ).spin( -4 ).toHexString(), name: '900' },
{ hex : tinycolor( hex ).lighten( 16.7 ).saturate( 10.4 ).spin( 0.6 ).toHexString(), name: 'A100' },
{ hex : tinycolor( hex ).lighten( 7.7 ).saturate( 10.4 ).spin( -4 ).toHexString(), name: 'A200' },
{ hex : tinycolor( hex ).darken( 3.9 ).saturate( 10.4 ).spin( -15.5 ).toHexString(), name: 'A400' },
{ hex : tinycolor( hex ).darken( 16.6 ).saturate( 10.4 ).spin( -4 ).toHexString(), name: 'A700' }
];

但是,当您将相同的渐变应用于靛蓝基色 (500) 时,您会发现调色板根本不匹配。在下图中,最左边的调色板是默认的 MD 调色板,左边第二个是按上述顺序生成的调色板。这两个调色板完全匹配。当我加载 MD Indigo 调色板(第三个调色板),然后使用 Indigo 500 值和红色调色板渐进代码生成一个调色板时,它会创建第 4 个调色板。正如您所看到的,虽然这种进展对于红色来说是准确的,但对于其他颜色来说却相去甚远:

enter image description here

可以找到有关此主题的更多信息 here . Google 选择的颜色很可能是由设计师手工挑选的,而不是以编程方式生成的。

编辑:此外,该 MCG 的代码已完全修改。可以找到颜色的新逻辑 here , 它使用 tinycolor.js用于修改函数。

关于android - Material 设计调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32942503/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com