CardView имеет дополнительный запас в каждом краю на Pre-Lollipop
Вот две картины.
на Lollipop:
![on Lollipop:]()
на Pre-Lollipop:
![on Pre-Lollipop]()
мы видим, что он близок к стороне экрана на Lollipop. что я хочу. но на устройстве Pre-Lollipop он имеет дополнительный запас к краю экрана. у вас, ребята, есть опыт? спасибо.
вот макет xml:
<android.support.v7.widget.CardView
android:id="@+id/card_title_schedule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
app:cardCornerRadius="0dp"
app:cardBackgroundColor="@color/colorAccent"
>
Ответы
Ответ 1
Таким образом, это совершенно отлично подходит для Kitkat, samsung device, чтобы быть точным.
Я попробовал card_view:cardUseCompatPadding="true"
, но безрезультатно. Не работает!
Затем я обнаружил, что из столбца stackoverflow это
card_view:cardPreventCornerOverlap="false"
и VOILA! Работает! Не было круглых углов (так как я не хотел, чтобы у Карты был фон "Изображение" ).
Мораль - это дополнительное дополнение из-за крошечных круглых углов, которые должны быть отключены. В основном это не недостаток, а ограничение дизайна!
ОРИГИНАЛЬНЫЙ ОТВЕТ SOF
Изображение: обратите внимание, что верхние углы - это ребра (вид, который имеет цвет и изображение в фоновом режиме), в то время как на дне есть только TextViews и нет фона, следовательно, круглые углы. Это означает, что если представление запрашивает match_parent
внутри CardView, card_view:cardPreventCornerOverlap="false"
позволит этому заняться, на затронутых углах.
![введите описание изображения здесь]()
Ответ 2
До L CardView добавляет дополнение к своему контенту и рисует тени в этой области. Это количество дополнений равно maxCardElevation + (1 - cos45) * cornerRadius по бокам и maxCardElevation * 1.5 + (1 - cos45) * cornerRadius сверху и снизу.
Из справки CardView здесь
Попробуйте установить отрицательное левое поле на CardView
, подобное этому
<android.support.v7.widget.CardView
android:id="@+id/card_title_schedule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
app:cardCornerRadius="0dp"
app:cardBackgroundColor="@color/colorAccent"
app:cardUseCompatPadding="true"
android:layout_marginLeft="-2dp" />
Вам может потребоваться настроить маржу, чтобы получить желаемый результат.
PS, это своего рода хакерский способ сделать это.
Ответ 3
Попробуйте с card_view:cardUseCompatPadding="true"
если мы установим это свойство в true, тогда маржа работает одинаково для всех версий.
примечание разработчика
Добавьте дополнение в API v21 +, чтобы иметь те же измерения с предыдущие версии.
источник docs
Ответ 4
Я понимаю, что это уже ответили, но я хотел бы добавить, что помимо card_view:cardPreventCornerOverlap="false"
мне также пришлось установить CardView.setMaxCardElevation(0)
, чтобы избавиться от полей на pre-Lollipop. Установка высоты только на 0 не сработала. Я использую библиотеку поддержки v23.4.0.
Ответ 5
Чтобы решить проблему "теневого пространства" для версий PRE-L, вы можете динамически обновлять маркер CardView отрицательными значениями, чтобы компенсировать пробел.
Чтобы получить фактическое пространство тени:
shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft();
Чтобы исправить поле:
layoutParams.leftMargin -= shadowSpaceLeft;
Это будет работать для всех версий Android, так как мы получаем динамические значения заполнения и значения contentPadding.
Например, вот класс, который делает это, когда мы устанавливаем новые параметры макета:
public class NoPaddingCardView extends CardView {
public NoPaddingCardView(Context context) {
super(context);
init();
}
public NoPaddingCardView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public NoPaddingCardView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
// Optional: Prevent pre-L from adding inner card padding
setPreventCornerOverlap(false);
// Optional: make Lollipop and above add shadow padding to match pre-L padding
setUseCompatPadding(true);
}
@Override
public void setLayoutParams(ViewGroup.LayoutParams params) {
// FIX shadow padding
if (params instanceof MarginLayoutParams) {
MarginLayoutParams layoutParams = (MarginLayoutParams) params;
layoutParams.bottomMargin -= (getPaddingBottom() - getContentPaddingBottom());
layoutParams.leftMargin -= (getPaddingLeft() - getContentPaddingLeft());
layoutParams.rightMargin -= (getPaddingRight() - getContentPaddingRight());
layoutParams.topMargin -= (getPaddingTop() - getContentPaddingTop());
}
super.setLayoutParams(params);
}
}
Ответ 6
Если требуется Android 4 (pre-lollipop), добавление app:cardUseCompatPadding="true"
в CardView
должно исправить его.
Если требуется поведение Android 5+ (что на самом деле является правильным поведением карт в соответствии с материальными принципами), то же самое нелегко достичь. Обычно я использую это исправление, чтобы избежать определения нескольких файлов макета и иметь разумный вывод на всех устройствах:
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentPaddingRight="@dimen/fix_cardview"
app:contentPaddingLeft="@dimen/fix_cardview"
app:contentPaddingTop="@dimen/fix_cardview_vertical"
app:contentPaddingBottom="@dimen/fix_cardview_vertical" />
и в обычном файле values/dimens.xml
мы должны иметь:
<dimen name="fix_cardview">-8dp</dimen>
<dimen name="fix_cardview_vertical">-12dp</dimen>
и в values-v21/dimens.xml
:
<dimen name="fix_cardview">0dp</dimen>
<dimen name="fix_cardview_vertical">0dp</dimen>
обратите внимание, что числа -8dp
и -12dp
могут быть скорректированы для вашего макета, так как они зависят от высоты и т.д.
Это всего лишь обход, чтобы избежать уродливых paddings в представлениях Android 4 без использования разных представлений в разных файлах макета (что обычно затрудняет работу с кодом)