Nano Hash - криптовалюты, майнинг, программирование

Android анимирует все элементы списка одновременно

Я хочу добиться одновременной анимации для всех элементов представления списка, чтобы перевести его в режим редактирования. Вот эффект, идентичный тому, к чему я стремлюсь: http://youtu.be/cFSRusFkI_I?t=2m6s Код макета элемента моего списка:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_content"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dp" >

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/nameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:textSize="16sp"
        android:textStyle="bold" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:paddingRight="5dip"
        android:src="@drawable/right_arrow" />

</RelativeLayout>

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

public void setListHandlesVisibleState(boolean state) {
    AnimatorSet as = new AnimatorSet();
    int childCount = mListView.getChildCount();
    ArrayList<Animator> list = new ArrayList<Animator>();
    for (int i = 0; i<childCount; ++i) {
        CheckBox v = (CheckBox) mListView.getChildAt(i).findViewById(
                R.id.checkbox);
        TextView tv = (TextView) mListView.getChildAt(i).findViewById(
                R.id.nameTextView);
        if (state) {
            list.add(ObjectAnimator.ofFloat(v, "x", -v.getWidth(),
                    v.getLeft()));
            list.add(ObjectAnimator.ofFloat(v, "alpha", 0, 1));
            list.add(ObjectAnimator.ofFloat(tv, "x", tv.getLeft(),
                    (float) (v.getWidth() * 0.9)));
        } else {
            list.add(ObjectAnimator.ofFloat(v, "x", v.getLeft(),
                    -v.getWidth()));
            list.add(ObjectAnimator.ofFloat(v, "alpha", 1, 0));
            list.add(ObjectAnimator.ofFloat(tv, "x",
                    (float) (v.getWidth() * 0.9), tv.getLeft()));
        }
    }
    as.addListener(this);
    as.playTogether(list);
    as.setDuration(200);
    as.start();
}
@Override
public void onAnimationEnd(Animator animation) {
    mAdapter.notifyDataSetChanged();
}

Когда список короче одного экрана (нет повторного использования представления), анимация выглядит идеально и действительно плавно. Когда представление списка длиннее, кажется, что некоторые элементы списка еще не созданы, поэтому не анимированы. Я попытался создать кеш представления в адаптере и вместо этого использовать эти представления, используя convertView в методе getView адаптера, и воспроизводить анимацию в представлениях, содержащихся в этом кеше. Я также заметил, что все многоразовые представления создаются при создании списка (когда я прокручиваю список, преобразование всегда равно != null). перед анимацией

после анимации

после анимации и прокрутки


  • Я также хочу реализовать что-то вроде вас, не могли бы вы опубликовать здесь весь код или дать мне ссылку, чтобы я мог вам помочь, и я также могу использовать этот код 18.11.2014

Ответы:


1

Посмотрите это видео DevBytes об анимации ListViews.

Решение заключается в использовании StableArrayAdapter (прямая ссылка на код). Это предотвращает повторное использование View объектов из-под вас во время выполнения анимации.

private class StableArrayAdapter extends ArrayAdapter<String> {

    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

    public StableArrayAdapter(Context context, int textViewResourceId,
            List<String> objects) {
        super(context, textViewResourceId, objects);
        for (int i = 0; i < objects.size(); ++i) {
            mIdMap.put(objects.get(i), i);
        }
    }

    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}

Вам также может быть полезно это видео.

24.03.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..