Переход активности Android в ListView

Я пытаюсь выполнить следующий переход активности в Android:

enter image description here

В 1 мы видим обычный ListView. Теперь ( 2 ), когда я нажимаю палец на элемент ListView и прокручиваю палец влево, все остальные элементы ListView удаляются, за исключением того, на котором мой палец. Если переход завершен, «выбранный» элемент ListView расширяется по экрану и показывает некоторый контент.

Question: Is this transition possible with stock API functions?

11
@Leonidos Расширение в (3) больше похоже на анимацию. Когда вернитесь (например, коснувшись стрелки назад), вы увидите список в (1). В (3) мне просто нужна анимация, которая показывает, что отображается выбранный вами элемент ListView.
добавлено автор Kiril, источник
Я работал над этим, но не успел продолжить. Пожалуйста, проверьте github.com/sherifelkhatib/AnimationFactory .
добавлено автор Sherif elKhatib, источник
Что внутри элемента? Что это за рост? Как вы собираетесь разрушить его?
добавлено автор Leonidos, источник
Я не знаю, возможно ли это, возможно, вы можете достичь этого, настроив эту библиотеку github. ком/bauerca/перетащить сортировки ListView
добавлено автор QAMAR, источник
Пробовали ли вы использовать комбинацию 1) скопировать вид в растровое изображение (или сделать его вторичным экземпляром), 2) анимировать scrollTo для всех других дочерних элементов в спискеList (или весь список ListView с оригинальным набором в невидимый). 3) как только это будет сделано, добавьте скопированный вид родительскому элементу listView в глобальную позицию, где он был в списке. 4) Анимируйте шкалу как обычно оттуда.
добавлено автор user123321, источник

5 ответы

Если вы нацеливаете JellyBean или выше, вы можете использовать класс ActivityOptions для настройки анимации запуска активности.

Ниже приведен псевдокод для достижения этого:

Intent i = //the intent for the new activity
View v = //the selected list item
Bundle bundle = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getWidth(), v.getHeight()).toBundle();
startActivity(i, bundle);
5
добавлено

Хотя @hasanghaforian технически корректен, подклассификация AdapterView чрезвычайно сложна. Я предлагаю вам пойти с таким подходом. Я включил полный рабочий пример.

  1. Поместите представление ListView в relativeLayout
  2. OnClick, раздуйте копию рендерера
  3. Найти глобальные координаты, где средство визуализации находится во взаимодействии с родительским элементом ListView
  4. Добавьте скопированный визуализатор в RelativeLayout (родительский элемент ListView)
  5. Анимировать списокView
  6. В конце этого оживления анимируйте новый рендерер
  7. Profit!
public class MainActivity extends Activity {

    private RelativeLayout layout;
    private ListView listView;
    private MyRenderer selectedRenderer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = new RelativeLayout(this);
        setContentView(layout);
        listView = new ListView(this);
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        layout.addView(listView, rlp);

        listView.setAdapter(new MyAdapter());
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

               //find out where the clicked view sits in relationship to the
               //parent container
                int t = view.getTop() + listView.getTop();
                int l = view.getLeft() + listView.getLeft();

               //create a copy of the listview and add it to the parent
               //container
               //at the same location it was in the listview
                selectedRenderer = new MyRenderer(view.getContext());
                RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(view.getWidth(), view
                        .getHeight());
                rlp.topMargin = t;
                rlp.leftMargin = l;
                selectedRenderer.textView.setText(((MyRenderer) view).textView.getText());
                layout.addView(selectedRenderer, rlp);
                view.setVisibility(View.INVISIBLE);

               //animate out the listView
                Animation outAni = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f,
                        Animation.RELATIVE_TO_SELF, -1f, Animation.RELATIVE_TO_SELF, 0f,
                        Animation.RELATIVE_TO_SELF, 0f);
                outAni.setDuration(1000);
                outAni.setFillAfter(true);
                outAni.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        ScaleAnimation scaleAni = new ScaleAnimation(1f, 
                                1f, 1f, 2f, 
                                Animation.RELATIVE_TO_SELF, 0.5f,
                                Animation.RELATIVE_TO_SELF, 0.5f);
                        scaleAni.setDuration(400);
                        scaleAni.setFillAfter(true);
                        selectedRenderer.startAnimation(scaleAni);
                    }
                });

                listView.startAnimation(outAni);
            }
        });
    }

    public class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return 10;
        }

        @Override
        public String getItem(int position) {
            return "Hello World " + position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyRenderer renderer;
            if (convertView != null)
                renderer = (MyRenderer) convertView;
            else
                renderer = new MyRenderer(MainActivity.this);
            renderer.textView.setText(getItem(position));
            return renderer;
        }
    }

    public class MyRenderer extends RelativeLayout {

        public TextView textView;

        public MyRenderer(Context context) {
            super(context);
            setPadding(20, 20, 20, 20);
            setBackgroundColor(0xFFFF0000);

            RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            rlp.addRule(CENTER_IN_PARENT);
            textView = new TextView(context);
            addView(textView, rlp);
        }

    }
}
4
добавлено
просто потрясающий, гораздо меньше кода, чем я ожидал. После тестирования я увидел, что анимация отлично работает, но после анимации, если я нажимаю на экран, появляется список, а copy-render не удаляется из родительского макета. Кроме того, я хотел бы, чтобы это работало в ориентациях distinc (это было бы здорово: D)
добавлено автор Jordi Coscolla, источник
Это доказательство концепции. Внедрите его в собственные нужды
добавлено автор user123321, источник

Недостатком стандартного ListView является отсутствие хорошей физики (и возможность ее изменения). Поэтому, если вы хотите изменить его, вам просто нужно реализовать свой собственный вид. Вы должны расширить подкласс класса ViewGroup , который AdapterView , так что AdaptView будет вашим полу-списком.

Details:

  1. Установите адаптер для вашего адаптера в < code> setAdapter (адаптер адаптера) .

  2. Переопределить onLayout , чтобы добавить элементы в ваш AdapterView . Вы должны измерять и добавлять элементы в виде childview в правильной позиции в свой список (на самом деле ваш AdapterView).

  3. Переопределить onTouchEvent() , поэтому ваш список может прокручиваться. А также здесь вы должны делать все магические заклинания! Когда пользователь прикасается к объекту в карьере, список должен прокручиваться, а когда он/она коснется горизонтально, вам нужно изменить положение других элементов списка и когда пользователь берет свой палец с экрана, вы должны решить, что другие предметы будут видны или выбранный элемент должен быть расширен.

Sample:

Making your own 3D list(and part 2 of that article) has a good demonstration of what I display for you.It's purpose is creating a 3D list.You can see more details,snippet codes and complete code.Although you have to change it's onTouchEvent() to reach what you want.

Note:You can do this even in API1.

Надеюсь, это поможет вам!

3
добавлено
Очень интересно. Я рассмотрю этот подход.
добавлено автор Jordi Coscolla, источник
хороший ресурс, но не делайте requestLayout в AdapterView в onTouch MotionEvent.ACTION_MOVE, как описано в разделе «Создание собственного 3D-списка». Это крайне неэффективно.
добавлено автор user123321, источник

В вашем xml-файле, под ListView, возьмите еще одно линейное расписание/относительный макет и спроектируйте его в соответствии с вашими потребностями, но убедитесь, что его видимость не исчезнет. когда вы нажимаете на элемент списка, заполняете его своим контентом и делаете все это при длительном нажатии. для анимации, масштабируйте его влево.

0
добавлено

Когда вы нажимаете на этот элемент списка, он должен вызывать анимацию, чтобы это ушло, чтобы пройти через анимацию. В этой анимации вы должны ее спроектировать и в тех анимациях, если u r использует imagesmeans go throug 9 патч-изображений

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async

Android Rus
Android Rus
68 участник(ов)