Новый интерфейс карт Google Now и Google+

Google Now и Google+ (Android) используют карточный интерфейс.

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

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

Они оба имеют довольно интересную анимацию для отображения новых карт; любые мысли были бы замечательными.


person HBG    schedule 24.07.2012    source источник
comment
Просто чтобы уточнить - это больше внешний вид карты, которую я ищу. По сути, мне нужно, чтобы он вел себя как ListView, т.е. я могу динамически заполнять экран карточками, но я бы хотел, чтобы каждая строка списка выглядела как карточка. Если есть другой макет, который я мог бы адаптировать вместо этого, это было бы здорово   -  person HBG    schedule 25.07.2012
comment
Изучив видео на ютубе, я думаю, что это что-то вроде списка с двумя представлениями, одно для закрытых карточек, а другое для открытых. Существует также анимация между двумя представлениями... Я не думаю, что нам нужно заново изобретать весь API, чтобы получить аналогичный результат.   -  person pommedeterresautee    schedule 17.08.2012
comment
пожалуйста, посмотрите на мой ответ ниже   -  person confucius    schedule 31.01.2013


Ответы (6)


Я опубликовал руководство о том, как воспроизвести/создать макет в стиле Google Карт здесь.

Ключевые шаги

  1. Создать индивидуальный макет
  2. Добавить наблюдателя для рисования детей
  3. Анимация чередующихся карт

Вот фрагмент кода

@Override
public void onGlobalLayout() {
    getViewTreeObserver().removeGlobalOnLayoutListener(this);

    final int heightPx = getContext().getResources().getDisplayMetrics().heightPixels;

    boolean inversed = false;
    final int childCount = getChildCount();

    for (int i = 0; i < childCount; i++) {
        View child = getChildAt(i);

        int[] location = new int[2];

        child.getLocationOnScreen(location);

        if (location[1] > heightPx) {
            break;
        }

        if (!inversed) {
            child.startAnimation(AnimationUtils.loadAnimation(getContext(),
                    R.anim.slide_up_left));
        } else {
            child.startAnimation(AnimationUtils.loadAnimation(getContext(),
                    R.anim.slide_up_right));
        }

        inversed = !inversed;
    }

}
person Shardul    schedule 07.09.2012
comment
Неплохо! Думаю, приведенные ниже ссылки будут полезны. github.com/nadavfima/cardsui-for-android nhaarman.github.io/ListViewAnimations - person AnhSirk Dasarp; 19.07.2013
comment
@Sharddul Мне нужно динамически помещать представления в ‹com.shardul.nowlayout.NowLayout› ‹/---› . Вместо этих текстовых представлений в tutorial. Как этого добиться? Я пробовал addView(view), но :( - person AnhSirk Dasarp; 05.08.2013
comment
Можете ли вы также прикрепить код анимации для slide_up_right? - person Zen; 07.07.2015

Взгляните на http://ryanharter.com/blog/2013/01/31/how-to-make-an-android-card-list/

Копия примера:

/res/drawable/bg_card.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle"
            android:dither="true">

            <corners android:radius="2dp"/>

            <solid android:color="#ccc" />

        </shape>
    </item>

    <item android:bottom="2dp">
        <shape android:shape="rectangle"
            android:dither="true">

            <corners android:radius="2dp" />

            <solid android:color="@android:color/white" />

            <padding android:bottom="8dp"
                android:left="8dp"
                android:right="8dp"
                android:top="8dp" />
        </shape>
    </item>
</layer-list>

Используйте его в качестве фона вашего макета:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="12dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="4dp"
        android:background="@drawable/bg_card">

        <!-- Card Contents go here -->

    </LinearLayout>

</FrameLayout>
person userM1433372    schedule 15.06.2013
comment
Возможно, вам потребуется добавить поле заполнения к первому прямоугольному элементу. - person lalitm; 01.03.2014
comment
Спасибо. Исправил пример. - person userM1433372; 03.03.2014

==== Начать обновление 29.09.2014 ====

Используйте CardView из библиотеки совместимости Google (начиная с Android 2.1+):

<!-- A CardView that contains a TextView -->
<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="200dp"
    android:layout_height="200dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v7.widget.CardView>

См. https://developer.android.com/preview/material/ui-widgets.html

==== Завершить обновление ====

(как минимум) два варианта:

or

См. https://github.com/afollestad/Cards-UI/wiki/2.-Intro-Tutorial для простого ознакомления. введите здесь описание изображения

person userM1433372    schedule 16.12.2013
comment
Отличная работа, надеюсь, она поддерживает все версии Android после 11. - person Harshit; 13.02.2014
comment
Cardslib великолепен, но minsdk 14 делает его невозможным для меня. Cardsui также имеет мин 15, и это не так хорошо, ИМХО. - person frostymarvelous; 19.06.2014

Я сделал очень похожий макет, который вы можете посмотреть здесь https://github.com/Nammari/GooglePlusLayout. а демонстрационное видео здесь http://youtu.be/jvfDuJz4fw4 для анимации, которая применяется к детям, подробнее см. здесь http://nammari.tumblr.com/post/41893669349/goolge-plus-layout для сообщения в блоге, которое все разъясняет.

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

person confucius    schedule 31.01.2013
comment
Просто из любопытства, использование этой реализации может замедлить прокрутку в приложении, которое использует большие наборы данных из-за использования памяти? Он не перерабатывает представления, такие как ListView. - person João Melo; 07.02.2013
comment
возможно, вам следует прочитать сообщение в блоге и не пропустить раздел с советами по производительности ... спасибо за ваш комментарий - person confucius; 07.02.2013
comment
Мне это нравится, но из-за отсутствия переработки мне это не подходит - person frostymarvelous; 19.06.2014

Внешний вид карты не должен быть сложным. Вам просто нужен ListView без разделителей, и ваши элементы представления списка должны иметь поля.

Так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_margin="16dp"
    android:layout_height="wrap_content"
    android:background="@android:color/background_light">

     <TextView
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:paddingTop="16dp"
             android:paddingRight="16dp"
             android:paddingLeft="16dp"
             android:text="Title"
             android:textSize="18dp"
             android:textColor="@android:color/primary_text_holo_light"
             />

     <TextView
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:paddingRight="16dp"
             android:paddingLeft="16dp"
             android:text="Subtitle"
             android:textSize="14dp"
             android:textColor="@android:color/primary_text_holo_light"
             />

     <ImageView android:layout_marginTop="16dp" 
              android:layout_marginBottom="16dp" 
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:background="@drawable/background"/> 
</LinearLayout>
person Maria Neumayer    schedule 16.08.2012
comment
Согласно комментарию к основному сообщению, я думаю, что это больше связано с анимацией карточек и тем, как строится список, чем с содержанием макета. - person pommedeterresautee; 17.08.2012
comment
Спасибо за Ваш ответ. Я смог воспроизвести внешний вид - теперь я просто хотел бы получить общее ощущение! - person HBG; 29.08.2012

Имейте ту же потребность, и начали немного исследовать. Я просматривал вывод apktool, который мне удалось получить из apk com.google.android.googlequicksearchbox. (нет исходников, только res xmls)

Этот макет (at_place_card.xml) используется для отображения местоположения. Он имеет три строки текста и две кнопки действий (детали и проверка) справа и изображение слева.

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="horizontal" android:background="@drawable/card_background" android:layout_width="fill_parent" android:layout_height="wrap_content"
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:thegoogle="http://schemas.android.com/apk/res/com.google.android.googlequicksearchbox">
    <LinearLayout android:orientation="vertical" android:layout_width="0.0dip" android:layout_height="fill_parent" android:baselineAligned="false" android:layout_weight="1.0">
        <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
            <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" style="@style/CardTextBlock">
                <TextView android:id="@id/entry_title" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/CardTitle" />
                <TextView android:id="@id/open_hours" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/CardText" />
                <TextView android:textColor="@color/card_light_text" android:id="@id/known_for_terms" android:paddingBottom="4.0dip" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="4" style="@style/CardText" />
            </LinearLayout>
            <ImageButton android:layout_gravity="top|right|center" android:id="@id/card_menu_button" android:layout_width="@dimen/card_action_button_height" android:layout_height="@dimen/card_action_button_height" android:contentDescription="@string/accessibility_menu_button" style="@style/CardMenuButton" />
        </FrameLayout>
        <Space android:layout_width="fill_parent" android:layout_height="0.0dip" android:layout_weight="1.0" />
        <Button android:id="@id/details_button" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="@dimen/card_action_button_height" android:text="@string/more_details" android:drawableLeft="@drawable/ic_action_pin" style="@style/CardActionButtonWithIcon" />
        <Button android:id="@id/checkin_button" android:layout_width="fill_parent" android:layout_height="@dimen/card_action_button_height" android:text="@string/check_in" android:drawableLeft="@drawable/ic_action_check_in" style="@style/CardActionButtonWithIcon" />
    </LinearLayout>
    <com.google.android.velvet.ui.CrossfadingWebImageView android:id="@id/place_photo" android:visibility="gone" android:layout_width="0.0dip" android:layout_height="fill_parent" android:scaleType="centerCrop" android:adjustViewBounds="true" android:baselineAligned="false" android:minHeight="@dimen/at_place_card_content_height" android:layout_weight="1.0" android:contentDescription="@string/at_place_card_image_desc" thegoogle:crossfadeDuration="@integer/image_crossfade_duration" />
</LinearLayout>

Обновление: теперь удалось получить некоторую информацию о стиле. Если вам интересно, вот zip-файл с информацией, которая у меня есть в настоящее время (некоторые файлы ресурсов из Google сейчас). https://dl.dropbox.com/u/4379928/android/googlenow2.zip

person dparnas    schedule 16.08.2012