Min和目标SDK是21(Lollipop),不使用支持库。
我正在尝试创建floating action button。到目前为止一切顺利,确实有效(基于其他一些SO线程),这里是代码:
attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="fabStyle" format="reference"/>
</resources>
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme.Material.Light.NoActionBar">
<item name="floatingActionButtonStyle">@style/FabStyle</item>
</style>
<style name="FabStyle" parent="android:Widget.ImageButton">
<item name="android:background">@drawable/ripple</item>
<item name="android:elevation">4dp</item>
</style>
(我希望按钮继承默认的ImageButton特性,它似乎工作正常,这是正确的方法吗?)
查看代码(注意第二个构造函数中自定义样式属性的用法):
public class FloatingActionImageButton extends ImageButton {
public FloatingActionImageButton(Context context) {
this(context, null);
}
public FloatingActionImageButton(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.floatingActionButtonStyle);
}
public FloatingActionImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public FloatingActionImageButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
outline.setOval(0, 0, width, height);
}
});
setClipToOutline(true);
}
}
ripple.xml:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorPrimary">
<item android:drawable="?android:attr/colorAccent"/>
</ripple>
在XML中的用法:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.TestActivity">
<com.test.FloatingActionImageButton
android:id="@+id/refresh_button"
android:layout_width="@dimen/fab_size"
android:layout_height="@dimen/fab_size"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_marginBottom="@dimen/padding_big"
android:layout_marginEnd="@dimen/padding_big"
android:src="@drawable/ic_action_restart"/>
</RelativeLayout>
(@ dimen / fab_size是56dp)
结果是看起来很好看的FAB,涟漪效应按预期工作:
由于这是我在Android中首次尝试造型等,我想问一下我所做的是“佳能”。如果我想发布我自己的Fab-ulous库,我该怎么办呢?现在样式代码是否已经为我的lib的潜在客户准备好只是在他们的styles.xml中以某种方式定义fabStyle(如何?),我的View将使用这些设置?
我不喜欢我的解决方案是,虽然我希望所有的FAB都是56dp,正如Google在上面链接的文档中所建议的那样,我必须在每次使用工厂时定义尺寸XML。因为我希望按钮默认为56dp,我尝试将layout_width和_height放在FabStyle中并从XML中删除,但AndroidStudio说我应该设置它们,并且应用程序实际上在运行时崩溃说需要设置值。
我尝试在崩溃的XML中设置@null,并且尝试将按钮设置为0dp / px,这是不可见的......
是否可以为这些属性定义默认值,或者我在这里运气不好?