mudança de número animado
-
27-09-2019 - |
Pergunta
Quero criar um componente capaz de mostrar um número inteiro máximo de 5 dígitos no estilo dos antigos contadores de carros analógicos e animar a mudança de dígito.
Isso se parece com isso talvez ...
Eu tentei procurar esse tipo de exemplos, mas não consegui encontrar nada até agora.
Na sua opinião, qual é a melhor abordagem para conseguir isso?
Eu olhei para o seletor de tempo de alarme para iPhone e, até onde sei, há apenas um plano de fundo fixo e eles empurram os números para dentro ou para fora da vista. Mas como faço para colocar os dígitos neste caso e referenciá -los a um valor específico?
tnx.
Solução
Você pode tentar criar sua própria visualização, estendendo a visualização e substituindo o draw (). Aqui você pode usar linhas de números em bitmaps e editar sua posição com base no número que deseja mostrar. Não se esqueça de ligar para o invalidato () depois de definir novos números para redesenhar a visualização.
Vou colar um exemplo contendo um início para o seu projeto. O número do bitmap é uma imagem vertical com números de 1-9 (e 0 &.)
Ex.
class TickerView extends View { ..
public void setDouble(double d) {
value = d;
invalidate();
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int startx = 0;
int starty = 0;
DecimalFormat df = new DecimalFormat("#0.00");
String str = df.format(value);
String original = Double.toString(value);
Bitmap nums = BitmapFactory.decodeResource(context.getResources(),
R.drawable.numbers);
for (int i = 0; i < str.length(); i++) {
int num = 0;
try {
num = Integer.parseInt(str.charAt(i) + "");
} catch (Exception e) {
num = 10;
}
int numbefore = 0;
try {
numbefore = Integer.parseInt(original.charAt(i -1) + "");
} catch (Exception e) {
numbefore = 0;
}
canvas.drawBitmap(nums, startx + (i * 40), (starty + 40)
- (num * 50) + (numbefore), paintY);
}
paintY.setStrokeWidth(10);
canvas.drawLine(startx, starty+36, startx + (str.length() * 40), starty+36,
paintY);
canvas.drawLine(startx, starty + 90, startx + (str.length() * 40),
starty + 90, paintY);
invalidate();
}
}