Галерея: эффект в выбранном элементе



Мне нужен свиток с элементами вместе, и выбранный элемент должен развернуть часть вниз.



Введите описание изображения здесь



В настоящее время я использую галерею (я пробовал с viewflow и viewpager, но элементы имеют много пространства между ними), но мне нужно знать, как я могу сделать этот эффект.



У меня есть 2 идеи, но я не знаю, как их реализовать.

1) расширяемая часть-это LinearLayout с visibility=gone, и когда элемент выбран, этот макет должен быть виден. (Галерея не имеет "onItemSelectedListener")



2) рассматривайте каждый элемент как фрагмент (как только я использую Viewpager, который использует это, https://github.com/mrleolink/SimpleInfiniteCarousel )



Это не обязательно должна быть галерея, любая идея приветствуется



Я работаю над одним видом деятельности.

521   3  

3 ответов:

Зависит от поведения, которое вы хотите. Некоторые вопросы можно ли одновременно расширить несколько пунктов? Вы хотите, чтобы представления были выгружены (привязаны к месту) или плавно прокручивались?

Одно из моих предложений состоит в том, чтобы создать собственное представление для отдельных ячеек. Затем добавьте их программно в объект HorizontalScrollView.
 HorizontalScrollView hsv = new HorizontalScrollView(activity);
 LinearLayout hll = new LinearLayout(activity);
 hll.setOrientation(LinearLayout.HORIZONTAL);
 for(int i=0;i<items.length();i++){
      hsv.addView(new CustomExpandView(item));
 }

CustomExpandView будет использоваться для ваших ячеек и может быть чем-то вроде этого...

public class CustomExpandView extends RelativeLayout implements OnClickListener {

MyActivity mActivity = null;
ImageView ivImage, ivOverImage;
RelativeLayout rlView;

public CustomExpandView(Context context) {
    super(context);
    initialize();
}

public CustomExpandView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public void initialize() {
    mActivity = (MyActivity) this.getContext();
    LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.custom_cell_expand, this, true);

            //you can initialize subviews here
    rlView = (RelativeLayout) getChildAt(0);
    ivImage = (ImageView) rlView.getChildAt(0);
    ivOverImage = (ImageView) rlView.getChildAt(1);

 rlView.setOnFocusChangeListener(new OnFocusChangeListener(){

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            LinearLayout expand = v.findViewById(R.id.view_i_want_to_expand);
            if(hasFocus)
                expand.setVisibility(View.VISIBLE);
            else
                expand.setVisibility(View.GONE);
        }

    });
}

Ты сам дал ответ. Вы можете использовать видоискатель с фрагментами и анимацией для расширения нижней части окна. Зависит от того, хотите ли вы, чтобы окна были полноэкранными или нет. Видоискателю не обязательно нужны фрагменты, вы можете использовать обычные виды и соответствующий адаптер. Просто поиграйте с ним и посмотрите, какое решение вам больше всего нравится.

В следующий раз просто создайте код и приложение и задайте гораздо более конкретный вопрос с кодом для иллюстрации проблемы ты переживаешь.

Вы можете просто определить TableView с помощью только одного TableRow (или столько, сколько вам нужно) и установить onClickListener для каждого из этих View внутри TableRow, что сделает так, что при любом щелчке мыши выбранный View расширится.

Я не знаю, будет ли у вас статическое число View s внутри этой строки или вы построите их динамически, но это должно работать для любого из них, настоящая "работа" здесь о заполнении этой строки.

Как только у вас есть строка Views, просто объявите onClickListener() на каждом из них. Например, этого должно быть достаточно:

OnClickListener myListener = new OnClickListener() {
  @Override
  public void onClick(final View v) {
    v.setVisibility(View.VISIBLE);
  }
};

И как событие onClick для всех ваших элементов внутри TableRow:

For (View v : myTableRowViews) В. setOnClickListener(myListener);

Это имеет недостаток: вы можете знать, какой View был выбран для выбора, но изначально вы не можете знать, какой был снят, поэтому вам нужно будет отслеживать последнюю выбранную вкладку, объявляющую переменную класса и устанавливающую ее каждый раз, когда onClick() будет выбран. уволен, так что ваш слушатель станет чем-то вроде этого:

// In your class declare a variable like this
View lastSelected = null;

OnClickListener myListener = new OnClickListener() {
  @Override
  public void onClick(final View v) {
    if (lastSelected != null)
      lastSelected.setVisibility(View.GONE);

    v.setVisibility(View.VISIBLE);

    lastSelected = v;
  }
};

Кроме того, вы можете настроить анимацию на эффект, чтобы сделать его более привлекательным, но в основном это идея.

И последнее: чтобы заставить его работать таким образом, вам нужно будет установить layout_height как ваших TableRow, так и View элементов внутри, так что он может расшириться впоследствии, когда вы установите дополнительную часть как видимую. Кроме того, чтобы он выглядел хорошо, все ваши Viewдолжны быть одинаковой высоты (как в уменьшенном, так и в уменьшенном виде). расширенное состояние).

Comments

    Ничего не найдено.