Я принял решение @ Zarooka в качестве отправной точки. Я думаю, что нашел ошибку. Если у вас было начальное время, которое уже было вне диапазона, то вы больше не могли его перемещать, потому что любой «onChanged» отклонялся. Вот почему я расширил setMax и setMin, чтобы перейти в допустимый диапазон при настройке mins / maxs.
package de.appdream.garooda.view;
import java.util.Calendar;
import java.util.Date;
import android.app.TimePickerDialog;
import android.content.Context;
import android.text.format.DateFormat;
import android.widget.TimePicker;
import java.lang.reflect.Field;
public class GaroodaTimePickerDialog extends TimePickerDialog {
private int minHour = -1;
private int minMinute = -1;
private int maxHour = 25;
private int maxMinute = 61;
private int currentHour = 0;
private int currentMinute = 0;
private Calendar calendar = Calendar.getInstance();
//private DateFormat dateFormat;
public GaroodaTimePickerDialog(Context context, OnTimeSetListener callBack, int hour, int minute,
boolean is24HourView) {
super(context, callBack, hour, minute, is24HourView);
currentHour = hour;
currentMinute = minute;
//dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
try {
Class<?> superclass = getClass().getSuperclass();
Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
mTimePickerField.setAccessible(true);
TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
mTimePicker.setOnTimeChangedListener(this);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
public void setMin(int hour, int minute) {
minHour = hour;
minMinute = minute;
Calendar min = Calendar.getInstance();
Calendar existing = Calendar.getInstance();
min.set(Calendar.HOUR_OF_DAY, minHour);
min.set(Calendar.MINUTE, minMinute);
existing.set(Calendar.HOUR_OF_DAY, currentHour);
existing.set(Calendar.MINUTE, currentMinute);
if (existing.before(min)) {
currentHour = minHour;
currentMinute = minMinute;
updateTime(currentHour, currentMinute);
}
}
public void setMax(int hour, int minute) {
maxHour = hour;
maxMinute = minute;
Calendar max = Calendar.getInstance();
Calendar existing = Calendar.getInstance();
max.set(Calendar.HOUR_OF_DAY, maxHour);
max.set(Calendar.MINUTE, maxMinute);
existing.set(Calendar.HOUR_OF_DAY, currentHour);
existing.set(Calendar.MINUTE, currentMinute);
if (existing.after(max)) {
currentHour = maxHour;
currentMinute = maxMinute;
updateTime(currentHour, currentMinute);
}
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
boolean validTime = true;
if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){
validTime = false;
}
if (hourOfDay > maxHour || (hourOfDay == maxHour && minute > maxMinute)){
validTime = false;
}
if (validTime) {
currentHour = hourOfDay;
currentMinute = minute;
}
updateTime(currentHour, currentMinute);
updateDialogTitle(view, currentHour, currentMinute);
}
private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
//String title = dateFormat.format(calendar.getTime());
//setTitle(title);
}
}
Когда Вы работаете в 3D среде (webGL, ThreeJS), иногда необходимо создавать 3 стоимости для различных поверхностей сеток, основная (основной цвет), более легкая и более темная:
material.color.set( 0x660000, 0xff0000, 0xff6666 ); // red cube
Мы можем создать эти 3 стоимости от основного цвета RBG: 255,0,0
function rgbToHex(rgb) {
var hex = Number(rgb).toString(16);
if (hex.length < 2) {
hex = "0" + hex;
}
return hex;
};
function convertToHex(r,g,b) {
var fact = 100; // contrast
var code = '0x';
// main color
var r_hexa = rgbToHex(r);
var g_hexa = rgbToHex(g);
var b_hexa = rgbToHex(b);
// lighter
var r_light = rgbToHex(Math.floor(r+((1-(r/255))*fact)));
var g_light = rgbToHex(Math.floor(g+((1-(g/255))*fact)));
var b_light = rgbToHex(Math.floor(b+((1-(b/255))*fact)));
// darker
var r_dark = rgbToHex(Math.floor(r-((r/255)*(fact*1.5)))); // increase contrast
var g_dark = rgbToHex(Math.floor(g-((g/255)*(fact*1.5))));
var b_dark = rgbToHex(Math.floor(b-((b/255)*(fact*1.5))));
var hexa = code+r_hexa+g_hexa+b_hexa;
var light = code+r_light+g_light+b_light;
var dark = code+r_dark+g_dark+b_dark;
console.log('HEXs -> '+dark+" + "+hexa+" + "+light)
var colors = [dark, hexa, light];
return colors;
}
В Вашем коде ThreeJS просто запишите:
var material = new THREE.MeshLambertMaterial();
var c = convertToHex(255,0,0); // red cube needed
material.color.set( Number(c[0]), Number(c[1]), Number(c[2]) );
Результаты:
// dark normal light
convertToHex(255,255,255) HEXs -> 0x696969 + 0xffffff + 0xffffff
convertToHex(255,0,0) HEXs -> 0x690000 + 0xff0000 + 0xff6464
convertToHex(255,127,0) HEXs -> 0x690000 + 0xff0000 + 0xff6464
convertToHex(100,100,100) HEXs -> 0x292929 + 0x646464 + 0xa0a0a0
convertToHex(10,10,10) HEXs -> 0x040404 + 0x0a0a0a + 0x6a6a6a
Я сделал маленький класс цвета JavaScript для RGB и Шестнадцатеричных цветов, этот класс также включает RGB и Шестнадцатеричные функции проверки. Я добавил код как отрывок к этому ответу.
var colorClass = function() {
this.validateRgb = function(color) {
return typeof color === 'object' &&
color.length === 3 &&
Math.min.apply(null, color) >= 0 &&
Math.max.apply(null, color) <= 255;
};
this.validateHex = function(color) {
return color.match(/^\#?(([0-9a-f]{3}){1,2})$/i);
};
this.hexToRgb = function(color) {
var hex = color.replace(/^\#/, '');
var length = hex.length;
return [
parseInt(length === 6 ? hex['0'] + hex['1'] : hex['0'] + hex['0'], 16),
parseInt(length === 6 ? hex['2'] + hex['3'] : hex['1'] + hex['1'], 16),
parseInt(length === 6 ? hex['4'] + hex['5'] : hex['2'] + hex['2'], 16)
];
};
this.rgbToHex = function(color) {
return '#' +
('0' + parseInt(color['0'], 10).toString(16)).slice(-2) +
('0' + parseInt(color['1'], 10).toString(16)).slice(-2) +
('0' + parseInt(color['2'], 10).toString(16)).slice(-2);
};
};
var colors = new colorClass();
console.log(colors.hexToRgb('#FFFFFF'));// [255, 255, 255]
console.log(colors.rgbToHex([255, 255, 255]));// #FFFFFF