https://github.com/Bigkoo/Android-PickerView
Este é um controle PickerView semelhante ao iOS com um seletor de tempo e um seletor de opção. Os recursos detalhados da nova versão são os seguintes:
——TimePickerView selecionador de tempo, suporta ano, mês, dia, hora, ano, mês, dia, ano, mês, hora e outros formatos.
——Seletor de opçõesOptionsPickerView, suporta seleção de opção de um, dois e três níveis e pode definir se deseja vincular.
- Suporta três níveis de ligação
- Defina se deseja vincular
- Definir modo de loop
- Suporte para layout personalizado.
- Suporte para configuração do divisor de itens.
- Suporte para configuração de espaçamento de item.
- O seletor de hora suporta a configuração de data de início e término
- Suporte "ano, mês, dia, hora, minuto, segundo", "província, cidade, distrito" e outras opções de exibição de unidade (etiqueta), ocultar e personalizar.
- Suporta texto personalizado, cor, tamanho do texto e outros atributos
- Quando o comprimento do texto do item é muito longo, o texto será adaptado ao comprimento do item para evitar o problema de exibição incompleta
- Modo de diálogo de suporte.
- Suporte a contêiner de configuração personalizada.
- Retorno de chamada em tempo real.
Se estiver interessado em estudar o mecanismo de implementação do efeito de roda de rolagem 3D, você pode ler este blog se quiser estudar o código-fonte por completo:
Análise do código-fonte da série Android-PickerView (dois)
Precauções para uso
- Nota: Quando definimos a posição inicial da hora, precisamos prestar atenção especial à configuração do mês
- Motivo: o mês no componente Calendário começa em 0, ou seja, 0-11 representa 1-12 meses
- Caso de uso errado: startDate.set (2013,1,1); endDate.set (2020,12,1);
- Caso de uso correto: startDate.set (2013,0,1); endDate.set (2020,11,1);
Instruções de atualização da versão V4.1.9 (20/10/2019)
- Solução: O problema de cruzar ocasionalmente a fronteira no dia lunar.
- Otimização: exibe o problema de capitalização padrão em chinês e inglês.
- Novo: O número máximo de itens visíveis fornece API para os desenvolvedores definirem. (setItemVisibleCount ())
- Recentemente adicionado: a roda de rolagem tem um gradiente de transparência do meio para ambos os lados e fornece uma configuração de API de switch. (IsAlphaGradient (true))
- Novo: O estilo da linha divisória circular do item selecionado. (DividerType.CIRCLE)
Instruções de atualização da versão V4.1.8 (24/04/2019)
- Atualize a versão do gradle, a biblioteca de base do wheelview foi alterada de compilar para dependência de API para evitar a incapacidade de introduzir o gradle 5.0+.
- Corrija o problema de atribuição setTextXOffset.
Instruções de atualização da versão V4.1.7 (10/01/2019)
- Corrigido o problema de que, quando o WheelView era inicializado, os dados estavam vazios e altura = 0, o que fazia com que não fossem exibidos.
- Adicionada a entrada de monitoramento de evento de clique do botão cancelar.
- Adicionadas anotações de parâmetro para padronizar os tipos de dados.
- O método setBackgroundId é descartado e o método de atualização é denominado setOutSideColor.
Para obter mais detalhes históricos da versão, consulte: log de atualização (versão 4.x)
Nome do método e parâmetros, consulte: nome do método e documento de descrição do parâmetro
Como usar:
Exemplo de uso da biblioteca Android-PickerView:
1. Adicionar dependência Jcenter warehouse Gradle:
compile 'com.contrarywind: Android-PickerView: 4.1.9'
ou
Maven
<dependency>
<groupId>com.contrarywind</groupId>
<artifactId>Android-PickerView</artifactId>
<version>4.1.9</version>
<type>pom</type>
</dependency>
2. Adicione o seguinte código ao projeto:
// 选择 选择 器 TimePickerView pvTime = new TimePickerBuilder (MainActivity.this, new OnTimeSelectListener () { @Override public void onTimeSelect (Date date, View v) { Toast.makeText (MainActivity.this, getTime (date), Toast.LENGTH) .show (); } }). build ();
// Seletor condicional OptionsPickerView pvOptions = new OptionsPickerBuilder (MainActivity.this, new OnOptionsSelectListener () { @Override public void onOptionsSelect (int options1, int option2, int options3, View v) { // Retornado são três níveis de seleção Location String tx = options1Items.get (options1) .getPickerViewText () + options2Items.get (options1) .get (opção2) + options3Items.get (options1) .get (opção2) .get (options3) .getPickerViewText (); tvOptions. setText (tx) ; } }). build (); pvOptions.setPicker (options1Items, options2Items, options3Items); pvOptions.show ();
É isso ~
3. Se o estilo padrão não corresponder ao seu gosto, você pode personalizar vários atributos:
Calendar selectedDate = Calendar.getInstance (); Calendar startDate = Calendar.getInstance (); //startDate.set(2013,1,1); Calendar endDate = Calendar.getInstance (); //endDate.set(2020,1, 1); // Razão para o método de configuração correto: os cuidados são explicados startDate.set (2013,0,1); endDate.set (2020,11,31); pvTime = new TimePickerBuilder (this, new OnTimeSelectListener () { @Override public void onTimeSelect (Date date, View v) {// Selecionar callback de evento tvTime.setText (getTime (date)); } }) .setType (new boolean [] {true, true, true, true, true, true }) // Todos são exibidos por padrão. SetCancelText ("Cancelar") // Cancelar o texto do botão .setSubmitText ("Sure") // Botão de confirmação text.setContentSize (18) // Roda de rolagem do texto size.setTitleSize (20) // Título do texto size.setTitleText ("Title") // Title text.setOutSideCancelable (false) / / Clique na tela, quando o ponto estiver fora do controle, se deseja cancelar o display.isCyclic (true) // Se rolar em um loop.setTitleColor (Color.BLACK) // texto do título color.setSubmitColor (Color.BLUE ) // Texto do botão OK color.setCancelColor (Color.BLUE) // Cancelar cor do texto do botão. SetTitleBgColor (0xFF666666) // Cor de fundo do título Modo noturno .setBgColor (0xFF333333) // Cor de fundo da roda de rolagem Modo noturno .setDate (selectedDate) // Se não for definido, o padrão é System Time * / .setRangDate (startDate, endDate) // Defina o início e o fim do ano, mês e dia .setLabel ("ano", "mês", "dia", "hora", "minuto", "segundo") // A configuração padrão é ano, mês, dia, hora, minuto e segundo. .isCenterLabel (false) // Se exibir apenas o texto do rótulo do item selecionado no meio, false significa que cada item tem um rótulo. .isDialog (true) // Se é exibido como um diálogo style.build ();
pvOptions = new OptionsPickerBuilder (this, new OptionsPickerView.OnOptionsSelectListener () { @Override public void onOptionsSelect (int options1, int option2, int options3, View v) { // 的 的 分别 是 三个 级别 的 选中 位置 String tx = options1Items. get (options1) .getPickerViewText () + options2Items.get (options1) .get (option2) + options3Items.get (options1) .get (option2) .get (options3) .getPickerViewText (); tvOptions.setText (tx); } }) .setOptionsSelectChangeListener (new OnOptionsSelectChangeListener () { @Override public void onOptionsSelectChanged (int options1, int options2, int options3) { String str = "options1:" + options1 + "\ noptions2:" + options2 + "\ noptions3:" + options3; Toast.makeText (MainActivity.this, str, Toast.LENGTH_SHORT) .show (); } }) .setSubmitText ("OK") // Botão OK text.setCancelText ("Cancelar") // Botão Cancelar text.setTitleText ("Seleção de cidade") // Title.setSubCalSize ( 18) // Determine e cancele o texto size.setTitleSize (20) // Título do texto size.setTitleColor (Color.BLACK) // Cor do texto do título size.setSubmitColor (Color.BLUE) // Cor do texto do botão OK .setCancelColor (Color.BLUE) // Texto do botão Cancelar color.setTitleBgColor (0xFF333333) // Cor de fundo do título Modo noturno .setBgColor (0xFF000000) // Cor de fundo da roda de rolagem Modo noturno .setContentTextSize (18) // Tamanho do texto da roda de rolagem . setLinkage (false) // Definir se deseja vincular, o padrão é true.setLabels ("Province", "City", "District") // Definir a unidade de três níveis selecionada.isCenterLabel (false) // Se exibir apenas o texto do rótulo do item selecionado no meio, se falso, cada item possui um rótulo. .setCyclic (false, false, false) // Ciclo ou não. setSelectOptions (1, 1, 1) // Define o item selecionado padrão. setOutSideCancelable (false) // Clique no padrão de dispensar externo true .Construir(); .isDialog (true) // Se deve exibir como estilo de diálogo .isRestoreItem (true) // Se restaurar ao alternar, o primeiro item é selecionado por padrão. pvOptions.setPicker (options1Items, options2Items, options3Items); // Adicionar fonte de dados
4. Se você precisar personalizar o layout:
// Observação: no layout personalizado, o layout com id de optionspicker ou timepicker e seus subcontroles devem estar presentes, caso contrário, ele relatará um ponteiro nulo. // Para obter detalhes, consulte os dois layouts personalizados na demonstração pvCustomOptions = new OptionsPickerBuilder (this, new OptionsPickerView.OnOptionsSelectListener () { @Override public void onOptionsSelect (int options1, int option2, int options3, View v) { // Retornados são três níveis de posições selecionadas String tx = cardItem.get (options1) .getPickerViewText (); btn_CustomOptions.setText (tx); } }) .setLayoutRes (R.layout.pickerview_custom_options, new CustomListener () { @Override public void customLayout (Ver v) { // Controle de inicialização e manipulação de eventos no layout personalizado ivCancel.setOnClickListener View.OnClickListener () { final TextView tvSubmit = (TextView) v.findViewById (R.id.tv_finish); final TextView tvAdd = (TextView) v.findViewById (R.id.tv_add); ImageView ivCancel = (ImageView) v.findViewById (R.id.iv_cancel); tvSubmit.setOnClickListener (new View.OnClickListener () { @Override public void onClick (View v) { pvCustomOptions.returnData (tvSubmit); } }); @Override public void onClick (Ver v) { pvCustomOptions.dismiss (); } }); tvAdd.setOnClickListener (new View.OnClickListener () { @Override public void onClick (Exibir v) { getData (); pvCustomOptions.setPicker (cardItem); } }); } }) .build (); pvCustomOptions.setPicker (cardItem); // 添加 数据
5. Se você tiver alguma dúvida sobre o uso, consulte o código de demonstração
Por favor, me cutuque para ver o código de demonstração
6. Se você só precisa do controle básico WheelView para estender a lógica de implementação por si só, pode adicionar diretamente a biblioteca de controle básico. O Gradle depende de:
compile 'com.contrarywind:wheelview:4.1.0'
WheelView usa exemplo de código:
layout xml:
<com.contrarywind.view.WheelView android: id = "@ + id / wheelview" android: layout_width = "match_parent" android: layout_height = "wrap_content" />
Código Java:
WheelView wheelView = findViewById (R.id.wheelview); wheelView.setCyclic (false); Lista final <String> mOptionsItems = new ArrayList <> (); mOptionsItems.add ("item0"); mOptionsItems.add ("item1"); mOptionsItems.add ("item2"); wheelView.setAdapter (new ArrayWheelAdapter (mOptionsItems)); wheelView.setOnItemSelectedListener (novo OnItemSelectedListener () { @Override public void onItemSelected (int index) { Toast.makeText (MainActivity.this "" + mOptionsItems.get (índice), Toast.LENGTH_SHORT) .mostrar (); } });
Imagem de efeito (o seletor de condição em "Vida portátil" do cartão de crédito do China Merchants Bank, eles usam minha biblioteca, você pode consultá-la para projetos reais)
obrigado
- WheelView
- androidWheelView