hit*_*ted 108 xml android android-layout floating-action-button android-design-library
我正在使用Google Design Library中新的FloatingActionButton,我遇到了一些奇怪的填充/边距问题.此图像(启用了开发人员布局选项)来自API 22.

从API 17开始.

这是XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
Run Code Online (Sandbox Code Playgroud)
为什么API 17中的FAB如此大得多?
Dmi*_*ant 128
更新(2016年10月):
现在正确的解决方案是放入app:useCompatPadding="true"您的FloatingActionButton.这将使填充在不同的API版本之间保持一致.但是,这似乎仍然会使默认边距略微偏离,因此您可能需要调整它们.但至少不再需要API特定的样式.
上一个答案:
您可以使用特定于API的样式轻松完成此操作.在你的正常情况下values/styles.xml,把这样的东西:
<style name="floating_action_button">
<item name="android:layout_marginLeft">0dp</item>
<item name="android:layout_marginTop">0dp</item>
<item name="android:layout_marginRight">8dp</item>
<item name="android:layout_marginBottom">0dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)
然后在values-v21/styles.xml下,使用:
<style name="floating_action_button">
<item name="android:layout_margin">16dp</item>
</style>
Run Code Online (Sandbox Code Playgroud)
并将样式应用于您的FloatingActionButton:
<android.support.design.widget.FloatingActionButton
...
style="@style/floating_action_button"
...
/>
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,在API <20中,按钮呈现自己的阴影,这会增加视图的整体逻辑宽度,而在API> = 20时,它使用新的Elevation参数,这些参数对视图宽度没有贡献.
Sar*_*ran 50
没有更多的摆弄用styles.xml或.java文件.让我简单一点.
您可以使用
app:useCompatPadding="true"和删除自定义边距,以在不同版本的android中保持相同的边距
您在第二张图片中在FAB上看到的额外边距/填充是由于在棒棒糖前设备上的这种比较.如果未设置此属性,则会将其应用于pre-lollopop设备,而不是棒棒糖+设备.
概念证明
Mos*_*ami 31
经过几次搜索和测试解决方案我修复了我的问题,只将此行添加到我的xml布局:
app:elevation="0dp"
app:pressedTranslationZ="0dp"
Run Code Online (Sandbox Code Playgroud)
这是我的整个浮动按钮布局
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/ic_add"
app:elevation="0dp"
app:pressedTranslationZ="0dp"
app:fabSize="normal" />
Run Code Online (Sandbox Code Playgroud)
Eug*_*e H 22
设计支持库中存在问题.使用以下方法解决此问题,直到更新库.尝试将此代码添加到您的活动或片段以解决问题.保持你的xml一样.在棒棒糖及以上,没有保证金,但在下面有16dp的余量.
更新工作示例
XML - FAB在RelativeLayout中
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:src="@mipmap/ic_add"
app:backgroundTint="@color/accent"
app:borderWidth="0dp"
app:elevation="4sp"/>
Run Code Online (Sandbox Code Playgroud)
Java的
FloatingActionButton mFab = (FloatingActionButton) v.findViewById(R.id.fab);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) mFab.getLayoutParams();
p.setMargins(0, 0, dpToPx(getActivity(), 8), 0); // get rid of margins since shadow area is now the margin
mFab.setLayoutParams(p);
}
Run Code Online (Sandbox Code Playgroud)
将dp转换为px
public static int dpToPx(Context context, float dp) {
// Reference http://stackoverflow.com/questions/8309354/formula-px-to-dp-dp-to-px-android
float scale = context.getResources().getDisplayMetrics().density;
return (int) ((dp * scale) + 0.5f);
}
Run Code Online (Sandbox Code Playgroud)
棒糖

前棒棒糖

在前Lollipop FloatingActionButton负责绘制自己的影子.因此,视图必须略大,以便为阴影腾出空间.要获得一致的行为,您可以设置边距以考虑高度和宽度的差异.我目前正在使用以下课程:
import android.content.Context;
import android.content.res.TypedArray;
import android.support.design.widget.FloatingActionButton;
import android.util.AttributeSet;
import android.view.ViewGroup.MarginLayoutParams;
import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.support.design.R.styleable.FloatingActionButton;
import static android.support.design.R.styleable.FloatingActionButton_fabSize;
import static android.support.design.R.style.Widget_Design_FloatingActionButton;
import static android.support.design.R.dimen.fab_size_normal;
import static android.support.design.R.dimen.fab_size_mini;
public class CustomFloatingActionButton extends FloatingActionButton {
private int mSize;
public CustomFloatingActionButton(Context context) {
this(context, null);
}
public CustomFloatingActionButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, FloatingActionButton, defStyleAttr,
Widget_Design_FloatingActionButton);
this.mSize = a.getInt(FloatingActionButton_fabSize, 0);
a.recycle();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (SDK_INT < LOLLIPOP) {
int size = this.getSizeDimension();
int offsetVertical = (h - size) / 2;
int offsetHorizontal = (w - size) / 2;
MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
params.leftMargin = params.leftMargin - offsetHorizontal;
params.rightMargin = params.rightMargin - offsetHorizontal;
params.topMargin = params.topMargin - offsetVertical;
params.bottomMargin = params.bottomMargin - offsetVertical;
setLayoutParams(params);
}
}
private final int getSizeDimension() {
switch (this.mSize) {
case 0: default: return this.getResources().getDimensionPixelSize(fab_size_normal);
case 1: return this.getResources().getDimensionPixelSize(fab_size_mini);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新: Android支持库v23将fab_size dimens重命名为:
import static android.support.design.R.dimen.design_fab_size_normal;
import static android.support.design.R.dimen.design_fab_size_mini;
Run Code Online (Sandbox Code Playgroud)
在更新到v23.1.0并对导入进行一些调整后,Markus的答案对我来说效果很好(使用最近的gradle插件我们使用的是app R而不是设计库的R).这是v23.1.0的代码:
// Based on this answer: https://stackoverflow.com/a/30845164/1317564
public class CustomFloatingActionButton extends FloatingActionButton {
private int mSize;
public CustomFloatingActionButton(Context context) {
this(context, null);
}
public CustomFloatingActionButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@SuppressLint("PrivateResource")
public CustomFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.FloatingActionButton, defStyleAttr,
R.style.Widget_Design_FloatingActionButton);
mSize = a.getInt(R.styleable.FloatingActionButton_fabSize, 0);
a.recycle();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
int size = this.getSizeDimension();
int offsetVertical = (h - size) / 2;
int offsetHorizontal = (w - size) / 2;
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) getLayoutParams();
params.leftMargin = params.leftMargin - offsetHorizontal;
params.rightMargin = params.rightMargin - offsetHorizontal;
params.topMargin = params.topMargin - offsetVertical;
params.bottomMargin = params.bottomMargin - offsetVertical;
setLayoutParams(params);
}
}
@SuppressLint("PrivateResource")
private int getSizeDimension() {
switch (mSize) {
case 1:
return getResources().getDimensionPixelSize(R.dimen.design_fab_size_mini);
case 0:
default:
return getResources().getDimensionPixelSize(R.dimen.design_fab_size_normal);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48512 次 |
| 最近记录: |