我正在编写一个显示一些图形的小应用程序,现在我正在尝试根据对象的年龄(通过System.currentTimeMillis()
保存)更改颜色,因此最老的是蓝色和最新的对象显示红色左右。有谁知道算法vel ita(左右)?
答案 0 :(得分:1)
假设您希望最旧的对象为蓝色,并且最新对象为红色,并且您知道所有对象“年龄”(让我们称之为{{ 1}})
timestamp
如果要缩放要显示的阴影数,只需按照步长缩放比例即可。例如:
// mesure the difference in age of the newest and oldest objects
double agediff = newest.timestamp - oldest.timestamp;
// for any given object :
// 1. color ratio from 0.0=old to 1.0=new
double ratio = (someObject.timestamp - oldest.timestamp) / ageDiff;
// 2. get red and blue values
int red = 255 - (255 * ratio);
int blue = 255 * ratio;
// 3. construct Color
Color objectColor = new Color(red, 0, blue);
或者,如果您想要从最新TTL值扩展到最大TTL值(例如,// the maximum number of shades between blue and red
int step = 4; // the value cannot be 1 (otherwise use a Color constant!)
double stepScale = 256 / (step - 1);
double halfStepScale = stepScale / 2;
ratio = Math.ceil((int) ((ratio * 256 + halfStepScale) / stepScale) * stepScale) / 256d;
或60 seconds
),只需将60000 millis
替换为此值并更改你的算法包括溢出检查:
oldest.timestamp
** 修改 **
如果你想要蓝色/红色以外的其他渐变,你可以拥有:
// our "oldest" timestamp is now pre-defined:
long oldestTs = newest.timestamp - ttlTimestamp; // ttlTimestamp = 60000;
// mesure the difference in age of the newest and the TTL (ex: 60000)
double agediff = newest.timestamp - oldestTs;
// for any given object :
// 1. color ratio from 0.0=old to 1.0=new
double ratio = (someObject.timestamp - oldestTs) / ageDiff;
if (ratio < 0.0) ratio = 0.0; // prevent overflow
// etc.
答案 1 :(得分:0)
颜色=年龄&gt; 5280? Color.RED:年龄&gt; 1000? Color.BLACK:年龄&gt; 30? Color.YouGetTheIdea
答案 2 :(得分:0)
你可以根据每个对象的年龄得到一个度量,可以是毫秒,小时,也可以是基于上述的自定义度量,即任何&lt; 1小时是1等。
这为你提供了衡量标准。你可以迭代通过对象找到9min和max的当前限制,或者你甚至可以在计算度量时这样做:每次小于min时,存储新的min等。
现在你传播了。最后一件事就是应用颜色。假设我们的对象范围从10毫秒到1000毫秒。您可以将其拆分为3个区域:例如10 - 100,100-500,500 -1000,并根据该区域应用颜色。