2014-09-23 5 views
4

Я хотел бы реализовать эффект списка в андроиде как воспроизведенный в приложении Ultravisual Iphone:товара становится больше при скольжении ListView

enter image description here

Аналогичный эффект может быть видом на приложении Expo Milano 2015 в андроиде.

Хотелось бы, чтобы верхний элемент стал больше при сползании списка ListView.

Я понятия не имею, как это можно сделать ... Является ли это анимацией первого элемента в текущем представлении?

Если у кого-то есть пример или ключ к достижению этого, это будет здорово!

Благодаря

+0

Начните с рассказа о том, что вы сделали до сих пор. Что у вас есть, ваш адаптер, ваш макет и т. Д. И т. Д. –

+0

Я уже сделал listview с пользовательским list_item.xml, содержащим изображение и тексты. ListView хорошо отображается с помощью специального адаптера. Но пока все предметы отображаются в одном полноразмерном размере ... – Chol

ответ

7

Ну, я пытался добиться этого эффекта, и это выглядело так:

enter image description here

Прежде всего, необходимо, чтобы начать процедуру определения и макс мин размер шрифта. Я сделал это:

private final int MAX_FONTSIZE=50; 
private final int MIN_FONTSIZE=12; 

Далее вам нужно сохранить общую высоту экрана. На вашем OnCreate сохранить это следующим образом:

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    mScreenHeight = size.y; 

Затем переопределить ListView OnScroll событие и сделать что-то вроде этого:

 @Override 
     public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) { 
      if(listview.getChildCount()>0) 
      for(int i=0;i<listview.getChildCount();i++) 
      { 
       float font = Math.min(Math.max(MAX_FONTSIZE - (float)(((MAX_FONTSIZE-MIN_FONTSIZE)/(mScreenHeight*0.3)))*Math.max(listview.getChildAt(i).getTop(),0),MIN_FONTSIZE),MAX_FONTSIZE); 
       ((TextView)listview.getChildAt(i)).setTextSize(font); 
      } 
     } 

0.3 означает, что около 30% экрана всегда будет минимальный размер шрифта. Вы можете настроить это значение на все, что захотите. Помните, что listview.getChildAt(i) вернет представление, которое вы надуваете на свой адаптер. В моем случае это просто текстовое представление, поэтому безопасно передавать его в TextView. Возможно, вам придется вызвать findViewById, чтобы получить текстовое представление.

Возможно, вам также понадобится сделать TextView в центре, чтобы он выглядел красивее.

EDIT:

Поскольку оп хотите изменить размер мнение, (который не должен использоваться с этим кодом) вот некоторые взломать вы можете сделать. Начните с изменения констант min/max на то, что вы хотите (100 & 250). Затем перейдите к созданию флага, который управляет прокруткой списка или нет. На вашем onScrollStateChanged добавьте эту строку isScrolling= i == SCROLL_STATE_TOUCH_SCROLL || i == SCROLL_STATE_FLING;, где i является вторым параметром onScrollStateChanged. Затем измените строку на if(listview.getChildCount()>0 && isScrolling). Следующий шаг - изменить высоту представления. Для этого вам нужно изменить его layoutParams.

listview.getChildAt(i).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Math.round(font * getResources().getDisplayMetrics().density)));

Помните, что это, как я уже сказал, простой хак. На самом деле это не лучшее решение. Но поскольку это сложная задача, давайте придерживаться основ.

+0

Спасибо, это выглядит почти тем, что я ищу! Я думаю, что можно использовать другой размер linearLayout вместо размера шрифта. Для v.getChildCount> 0 v отображает текущую ViewGroup? Я не могу получить LinearLayout корня item_list.xml с помощью: LinearLayout linear = ((LinearLayout) listViewItems.getChildAt (i) .findViewById (R.id.linear_layout)); Что-то не так? – Chol

+0

Если вы пытаетесь получить корень представления, не вызывайте findViewById. listViewItems.getChildAt (i) уже получит root. Что касается v.getChildCount, я обновил ответ. v означает ваш список. –

+0

:) Приятно работать! Но не полностью, как и текст, мне нужно его улучшить. Сначала вы начинаете понимать ваш float font = Math.min (Math.max (MAX_FONTSIZE - (float) (((MAX_FONTSIZE-MIN_FONTSIZE)/(mScreenHeight * 0.3))) * Math.max (listview.getChildAt (i). getTop(), 0), MIN_FONTSIZE), MAX_FONTSIZE); и приспособить его, чтобы получить мой макет от 100dp до 250dp спасибо – Chol

Смежные вопросы